Arquitectura de una
Transcripción
Arquitectura de una
Arquitectura de una aplicación Java EE 5 María Consuelo Franky [email protected] Universidad Javeriana - 2010 1 Frameworks y elementos de la arquitectura Java EE 5 2 Niveles de una arquitectura multimulti-nivel Presentación •Maneja interacción con usuario •Despliegue HTML •Validación Aplicación Servicios •Invoca •Realiza servicios •Validación sintáctica •Adapta respuestas a interfaz usuario sintáctica •Maneja excepciones Cliente con navegador Web servicios sobre objetos del dominio •Implanta reglas del negocio •Estado de sesión -usuario Dominio Persistencia •Servicios •Modela entidades del negocio y sus reglas básicas •Validación semántica •Control básicos de persistencia de objetos del dominio •Transformación ObjetoRelacional •Soporte transacción transacción Servidor Web Servidor de Componentes Servidor BD 3 El metapatrón MVC • Model (Modelo): maneja reglas del negocio y estructura de los datos • View (Vistas): maneja presentación de los datos del sistema al usuario • Controller (Controlador): transforma pedidos del usuario en operaciones sobre los objetos del modelo y selecciona vista para 4 mostrar resultados al usuario (comportamiento del sistema) Nivel web basado en el framework JSF ✹ Páginas web se contruyen con componentes gráficos UIComponent que reaccionan a eventos: ◆ son componentes de alto nivel que encapsulan elementos HTML y tienen comportamiento asociado ◆ muestran y actualizan valores del Modelo contenidos en javaBeans asociados ("backing beans") ◆ como reacción a eventos (por ej: oprimir un botón) invocan directamente métodos de los “backing beans” ✹ Aspectos de validación de los datos del usuario: ◆ Validación automática asociada a cada componente gráfico ◆ Cuando la validación falla se vuelve a mostrar la página junto con los mensajes de error ◆ Procesamiento de eventos solo cuando la validación es exitosa 5 Framework JSF Presentación Aplicación Servicios Dominio Persistencia CONTROLADOR MODELO servlet Faces EJB entidad C Backing Bean 1 Backing Bean 2 HTML 1 HTML 2 Navegador Cliente EJB sesión A BD relacional JSP pagina1 JSP pagina2 VISTAS Servidor Web Servidor de componentes Servidor BD 6 ✹ Ejemplo de página JSF: <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <html> <head> <title>Add 2 numbers</title> </head> <body> <f:view> <h:form id="addForm"> First Number: <h:inputText id="firstNumber" value="#{BackCalc.firstNumber}" required="true" /> <h:message for="firstNumber" /> <br> Second Number: <h:inputText id="secondNumber" value="#{BackCalc.secondNumber}" required="true" /> <h:message for="secondNumber" /> <br> Result: <h:outputText id="output" value="#{BackCalc.result}" /> <br> <h:commandButton id="submitAdd" action="#{BackCalc.add}" value="Add" /> </h:form> </f:view> </body> 7 </html> ✹ backing bean para la página web: public class BackCalc { // atributos ligados a los UIComponents: private int firstNumber = 0; private int secondNumber = 0; private int result = 0; // model: podria ser la referencia a un EJB: private Calculator calculator = new Calculator(); //. . . metodos set y get de atributos . . . // reaccion a evento sobre el boton: public String add() { result = calculator.add(firstNumber, secondNumber); return "success"; } } 8 ✹ Validación automática: abc "firstNumber": Conversion error occured Validation Error: "secondNumber": Value is required 9 Nivel de Dominio basado en pojos EJB 3 de entidad ✹ Simplificación respecto a J2EE ◆ Interfaces de creación y de negocio: NO ◆ Clase implementadora: • NO extiende clase base de componente • NO métodos de intercepción: ejbCreate(), ejbFindByPrimaryKey(), ejbLoad(), ejbStore(), … • se regresa a un javaBean sencillo con atributos, get() y set() (POJO: Plain Old Java Objects) ◆ @anotaciones (J2SE 5.0) dan indicaciones al servidor pero NO son obligatorias: más trabajo para el Contenedor, menos para el desarrollador ◆ Descriptor: NO es obligatorio, pero disponible si se quiere sobreponer a las anotaciones ◆ Gracias a la persistencia automática desaparece código JDBC(SQL) (patrón DAO obsoleto) => gran reducción de código y una mayor robustez ✹ Framework EJB 3 recoge experiencias de JDO, HIBERNATE, TOPLINK, SPRING 10 ✹ Ej. EJB 3 de entidad: ◆ observar ausencia de JDBC ! ◆ Hay valor por omisión para casi toda anotación ORDER order_id order_date ORDER_ITEM order_item_id order_id quantity @Entity @Table(name="ORDER") @NamedQuery(name="findOrdersByDate", query= "select o from Order o where o.orderDate = :date") public class Order implements java.io.Serializable { private long orderId; private Date orderDate; private List<OrderItem> orderItems = new ArrayList(); @Id(generate=AUTO) @Column(name="ORDER_ID") public long getOrderId() { return orderId;} public void setOrderId(long orderId) { this.orderId = orderId; } @Column(name="ORDER_DATE") public Date getOrderDate() { return orderDate;} public void setOrderDate(Date orderDate) { this.orderDate= orderDate; } @OneToMany(mappedBy="order", CascadeType.ALL) public List<OrderItem> getOrderItems(){return orderItems;} public void setOrderItems (List<OrderItem> orderItems) { this.orderItems = orderItems; } } 11 Nivel de servicios basado en pojos EJB 3 de sesión ✹ Simplificación respecto a J2EE ◆ Requiere interfaz de negocio pero NO de creación ◆ Clase implementadora: • NO extiende clase base de componente • NO métodos de intercepción: ejbCreate(), ... • se regresa a un javaBean sencillo (POJO) con atributos y métodos de negocío ◆ @anotaciones (J2SE 5.0) dan indicaciones al servidor pero NO son obligatorias (más trabajo para el Contenedor, menos para el desarrollador) ◆ Descriptor: NO es obligatorio, pero disponible si se quiere sobreponer a las anotaciones ◆ los servicios se programan en términos de objetos (entidades) y no en términos de tablas de la BD => gran reducción de código y una mayor robutez 12 ✹ Ej. EJB 3 de sesión que invoca al de entidad: ◆ ilustra EntityManager: maneja ciclo de vida de EJBs de entidad ◆ observar ausencia de JDBC ! @Stateful public class ShoppingCartBean implements ShoppingCart { @Inject EntityManager em; private List itemsInCart; . . . ORDER order_id order_date public Order checkout() { Order order = new Order(); order.setOrderDate(new Date()); order.setOrderItems(this.itemsInCart); em.persist(order);// INSERTs en ORDER y ORDER_ITEM return order; } ORDER_ITEM order_item_id order_id quantity public List<Order> findOrdersByDate (Date date) { return em.createNamedQuery("findOrdersByDate") // SELECTs .setParameter("date", date).getResultList(); } public void updateOrder(Order order) { em.merge (order); // UPDATEs en ORDER y ORDER_ITEM } } 13 J2EE: Arquitectura MVC de una aplicación Presentación Aplicación Servicios Dominio Persistencia CONTROLADOR servlet controlador MainServlet RequestProcessor WebProxy ScreenFlowManager EJB controlador StateMachine MODELO EJB entidad C JSP template VISTAS HTML 1 JSP pagina1 javaBean 1 HTML 2 JSP pagina2 javaBean 2 Navegador Cliente Servidor Web EJB sesión A Model DAO Value DAO Servidor de componentes BD relaBD cional Servidor BD14 ✹ Problemas en la implantación de patrones ◆ Larga curva de aprendizaje ◆ Se requiere personal muy capacitado ◆ Elevados costos y tiempos de desarrollo de proyectos ◆ Alta probabilidad de: • implantar los patrones de forma errada • generar bugs en la implantación ◆ Cada nuevo proyecto es volver a comenzar la implantación de patrones ... 15 Java EE 5: Arquitectura de una aplicación utilizando frameworks JSF, EJB 3.0 y Seam N. Presentación N. Aplicación (Web) Navegador Cliente Servidor Web N. Servicios N. Persistencia Servidor de componentes Servidor de BD CONTROLADOR frameworks servlet JSF servlet Seam ejb Seam entity manager HTML ejb ejb aplicación aplicación JSP JSP BD relacional MODELO VISTAS entidades Convenciones: interacción HTTP invocación acceso BD uso de atributos de entidades (get y set) 16 Acople entre niveles utilizando el framework JBoss Seam ✹ Seam logra que las entidades estén asociadas directamente a las páginas web ◆ las páginas muestran valores de atributos de entidades ◆ el usuario modifica o suministra valores para estos atributos ◆ asociación bidireccional entre páginas y entidades ✹ Procesamiento de eventos de páginas es realizado directamente por los componentes EJB de sesión ✹ Se eliminan intermediarios => muchos patrones se vuelven innecesarios ✹ Modelo de contextos de diversos alcances para manejar adecuadamente el estado de las aplicaciones ✹ Biyección: asociación dinámica, contextual y bidireccional entre las variables de los contextos y los atributos de los componentes ✹ Portabilidad de Seam a cualquier servidor que soporte JSF y EJB 3 17