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

Documentos relacionados