Está en la página 1de 56

Curso: Desarrollo de aplicaciones

en Java EE 5 (antes J2EE)

María Consuelo Franky

ConsueloFranky@gmail.com
Septiembre de 2008

Heinsohn Software House


http://www.heinsohn.com.co

1
Introducción

• Java EE 5 reemplazó a J2EE en Mayo 2006: cambio profundo


de modelo conceptual, arquitectura y estrategia de desarrollo
• Aplicaciones Java EE 5 son mucho más concisas y eficientes:
reducen el código a la mitad o más
• El reto es volver a aprender a hacer aplicaciones de una
manera completamente distinta
• Objetivo del curso: visión del desarrollo de aplicaciones Java
EE 5, estrategias y guías, frameworks y herramientas
2
Contenido del curso

A: Arquitectura de una aplicación Java EE 5


B: Organización y configuración de una aplicacíón Java EE 5
C: Programación de una aplicación Java EE 5
D: Elementos JSF para construir pantallas
E: EJB3 de sesión y lenguaje JPQL de manipulación de entidades
F: JPA: modelaje y persistencia de entidades
G: Aspectos avanzados en las aplicaciones Java EE 5 3
parte A:

Arquitectura de una
aplicación Java EE 5

4
Conceptos básicos
sobre la tecnología Java EE

5
Niveles de una arquitectura multi-nivel

Presentación Aplicación Servicios Dominio Persistencia

•Invoca •Realiza
servicios •Servicios
servicios sobre
•Maneja básicos de
interacción
objetos del •Modela persistencia
•Validación dominio entidades de objetos
con usuario
sintáctica •Implanta del negocio del dominio
reglas del y sus reglas
•Despliegue •Transforma-
HTML
•Adapta negocio básicas
respuestas ción Objeto-
a interfaz •Estado de •Validación Relacional
•Validación usuario sesión semántica
sintáctica -usuario •Soporte
transacción
•Maneja •Control
excepciones transacción
Cliente con Servidor Web
navegador Web Servidor de Componentes Servidor BD

6
Elementos J2EE
distribuidos en 5 niveles

Presentación y
Aplicación Aplicación Servicios Dominio Persistencia
application web RM
con interfaz RM service I-II compo- BD OO
I-IIO
IIOP
P O P
rica I- nente
RM
EJB de JDBC
compo- BD
applet entidad
RMI-IIOP nente C
con interfaz JDB relacional
rica EJB de
sesión
P
MI-IIO JNDI
PC local o remoto servlets R Servidor de
Presentación TTP directorios
H JMS •cola de mensajes
C
B
HTML JD

hojas activas
HTTP JSP EJB de
XML mensajes

Servidor Web Servidor de BD


Navegador Cliente Servidor de
- local o remoto componentes 7
Contenedores, componentes y APIs que
intervienen en la plataforma J2EE

Fuentes
Navegador
de Datos.
Web
HTTP
Contenedor Web Contenedor EJB
HTML SSL RMI-IIOP
Servlet JSP
HTTP componente
XML SSL
RMI-IIOP
HTTP J J J J
J J J J
applet SSL N Java RMI- D
M D T Mail
N Java RMI- D
M D T Mail
IIOP B IIOP B
S I A C S I A C
RMI-IIOP

PC J2SE J2SE

application
8
✹ Descripción de las principales librerías de J2EE
◆ JTA: manejo de transacciones

◆ JNDI: manejo de nombres y localización de recursos

◆ JDBC: acceso a BD relacionales

◆ RMI-IIOP: acceso a objetos remotos

◆ JavaMail: correo electrónico

◆ JMS: manejo de mensajes asincrónicos

9
Elementos del estándar Java EE 5
Múltiples frameworks
Framework:
• librería
• reglas de uso
• soporta 1 aspecto
del desarrollo

10
Servidor de Aplicaciones: reúne
el contenedor Web y el contenedor EJB

servidor Web servidor EJB


componente 1

HTML servlet

componente 2
BD

Servidor de Aplicaciones

11
Fases de una aplicación multi-nivel Java EE

Desarrollo de componentes de diferentes niveles

Cliente Java EE Componente Web Componente EJB


•Descriptor Cliente •Descriptor Web •Descriptor EJB
•clase Servlet
•clase Cliente •interfaz creación
•archivo JSP
•archivo HTML •interfaz servicios
archivo .jar •archivo GIF •clase EJB
archivo .jar
archivo .war
Sintonización y ensamblaje del aplicación

Aplicación Java EE
•Descriptor aplicación
•archivos .jar
•archivos .war
archivo .ear
12
Ultima sintonización y Despliegue de la aplicación en el
Servidor de Aplicaciones donde va a operar

Aplicación Java EE

archivo .ear

servidor Web servidor EJB


cliente componente 1

servlet

HTML
componente 2
BD

Servidor de Aplicaciones 13
Concepto de
componente de negocio (EJB)

✹ Pieza independiente de software que encapsula


cierta funcionalidad

✹ Se ejecuta del lado servidor


✹ Reutilizable: no se diseña para solo una
aplicación
✹ Sigue un modelo estándar de componente, ==>
puede ejecutarse en cualquier plataforma que
soporte el modelo
✹ Se desarrolla como un conjunto de interfaces y
clases que conforman paquetes

14
✹ Facilidades ofrecidas por los servidores EJB:
◆ manejo de nombres y localización de componentes
◆ generación de las clases “proxy” (i.e. stubs, skeletons)
◆ creación, interrupción y destrucción de componentes
◆ ejecución de componentes en threads
◆ persistencia
◆ soporte de transacciones distribuidas
◆ manejo eficiente de conexiones a BD (“pooling”)
◆ manejo de seguridad por roles y autenticación de usuarios
◆ manejo de tareas asincrónicas
◆ clusters

15
Arquitectura básica de los
componentes EJB

EJB
Home
Cliente componente
B.D.
EJB
Object

Contenedor

Servidor EJB

16
✹ Un contenedor por clase EJB

EJB
Home
componente
Cliente 1 componente
EJB
EJB
Object
Object Contenedor
B.D.
EJB
Home
componente
Cliente 2 componente
EJB
EJB
Object
Object Contenedor
Servidor EJB 17
✹ Elementos de la arquitectura
◆ Componente EJB
• Lógica del negocio implementada por el desarrollador

◆ Contenedor EJB
• Aloja pool de componentes EJB de una clase determinada
• Mantiene objetos intermediarios (EJB Home y EJB Object) que
interceptan los pedidos de los clientes a los componentes EJB
• Maneja servicios de: transacciones, threads, persistencia,
seguridad.

◆ Servidor EJB
• Aloja los contenedores EJB
• Maneja los servicios de conectividad, de nombres y de
autenticación

18
Tipos de componentes EJB
✹ Session Bean (de sesión)
◆ define los servicios ofrecidos por la aplicación
◆ Cada instancia está asociada a la sesión de un cliente ==>
instancia NO COMPARTIDA
◆ Estado no persistente (Transient)

✹ Entity Bean (de entidad)


◆ Cada instancia modela una entidad de negocio
◆ Estado persistente (reflejado en una BD)
◆ Múltiples sesiones-clientes utilizan una instancia
COMPARTIDA (identificada por llave primaria)
◆ Sus métodos se realizan bajo transacciones controladas
por el Contenedor

✹ Message Driven Bean (de mensajería)


◆ Procesa mensajes asincrónicos (JMS)
19
✹ Alternativas de componentes EJB

sin estado
componente sincroniza
de Sesión su estado
con estado no sincroniza
EJB su estado
CMP
persistencia manejada
componente por el Contenedor
de Entidad
persistencia manejada
componente por el componente
de Mensajes BMP

20
Interfaces, Clases y Descriptores
asociados a un componente EJB (J2EE)
✹ Ejemplo: componente Broker (intermediario financiero)

Interfaz de creación Interfaz de servicios


extiende EJBHome extiende EJBObject
enumera métodos enumera métodos de
create() y negocio, por ej:
findByPrimaryKey() submitOrder()

BrokerHome .java Broker.java

Clase implementadora Descriptor XML


implanta componente de sesión o de entidad Descripción y
valor de propiedades
define métodos ejbCreate() y findByPrimaryKey()
sintonizables del
define métodos de negocio, por ej: submitOrder() componente
define métodos de sesión o de entidad
BrokerBean.java broker.xml
21
Invocación local versus remota

Home
interface
Cliente componente 1
remoto
Remote
interface
Contenedor
B.D.

Local Home
interface
Cliente componente 2
local
Local
interface
Contenedor
Servidor EJB
22
Tareas asincrónicas
en una aplicación Java EE

contenedor EJB
componente
de sesión
servidor Web

servidor JMS
HTML servlet
depo
sitar •cola de mensajes

JSP
contenedor EJB
BD
componente
de mensajes

Servidor de Aplicaciones

23
Facilidades ofrecidas por los
Contenedores de componentes EJB

24
Persistencia automática del estado de los
componentes EJB de entidad

✹ Persistencia declarativa (sin escribir código)


✹ Independencia de las BD

25
Manejo de transacciones (ACID)

26
✹ Alternativas en el manejo de transacciones

BMT
transacciones mediante JDBC
manejadas
por el componente
componente mediante JTA
de Sesión

EJB transacciones
manejadas
por el Contenedor
componente
de Entidad CMT

27
✹ Valores de la propiedad transaccional de un
método (transacciones manejadas por el Contenedor)
cliente del componente transacción para
Valor del atributo
está en transacción? ejecutar el método

NO error
MANDATORY
SÍ la del cliente

NO nueva
REQUIRED
SÍ la del cliente

NO nueva
REQUIRES_NEW
SÍ nueva

NO ninguna
SUPPORTS
SÍ la del cliente
NO ninguna
NOT_SUPPORTED
SÍ ninguna

NO ninguna
NEVER
SÍ error
28
✹ Transacciones distribuidas coordinadas por el
Servidor Java EE
En 1 sitio, sobre múltiples BD Sobre BD’s de varios sitios

29
Manejo de seguridad

30
✹ Autenticación y Autorización por roles de usuarios
◆ Definición de roles de usuarios para cada aplicación,
asociados a grupos de usuarios

◆ Autenticación del usuario:


• cuando invoca un programa cliente inscrita en la aplicación
• cuando invoca un componente Web (servlet o JSP)

◆ Autorización
• de utilizar un componente Web: si el usuario pertenece a un rol
autorizado
• de invocar un método de un componente EJB: si el rol del usuario
tiene permiso de invocar ese método

31
✹ Asignar permisos sobre métodos del componente
por roles

32
Interoperabilidad con aplicaciones
ERP y de legado

33
Otras ventajas ofrecidas por los
contenedores de componentes EJB

✹ Flexibilidad mediante diversidad de tipos de


componentes para modelar servicios de
sesión o entidades de negocio

✹ Manejo de estado

✹ Eficiencia mediante manejo de caché de


bases de datos en componentes de entidad y
pooling de conexiones

✹ Escalabilidad y tolerancia a fallas mediante


clusters de servidores y balanceo de carga

34
Frameworks y elementos de la arquitectura
Java EE 5

35
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
mostrar resultados al usuario (comportamiento del sistema) 36
Nivel web basado en el framework JSF
✹ Pantallas 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 pantalla junto


con los mensajes de error

◆ Procesamiento de eventos solo cuando la validación es


exitosa 37
Framework JSF
Presentación Aplicación Servicios Dominio Persistencia
CONTROLADOR

servlet Faces MODELO

EJB
Backing entidad
BD
Bean 1 C rela-
Backing EJB cional
Bean 2 sesión
A

HTML JSP
1 pantallazo1

HTML JSP
2 pantallazo2
VISTAS
Navegador Servidor Web Servidor de Servidor BD
38
Cliente componentes
✹ Ejemplo de pantalla 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>
</html> 39
✹ backing bean para el pantallazo:

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";
}
}

40
✹ Validación automática:

abc "firstNumber": Conversion error occured


Validation Error: "secondNumber":
Value is required

41
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 42
ORDER_ITEM
✹ Ej. EJB 3 de entidad: ORDER order_item_id
◆ observar ausencia de JDBC ! order_id order_id
◆ Hay valor por omisión para casi order_date quantity
toda anotación
@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;
}
}
43
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
44
✹ 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;
ORDER_ITEM
private List itemsInCart; order_item_id
. . . ORDER
order_id order_id
public Order checkout() { order_date quantity
Order order = new Order();
order.setOrderDate(new Date());
order.setOrderItems(this.itemsInCart);
em.persist(order);// INSERTs en ORDER y ORDER_ITEM
return order;
}
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
}
}
45
Comparación con EJB 1.x y EJB 2.x
✹ EJB de entidad: modelo de persistencia automática no
se podía usar !
◆ demasiado restringido en 1.x
◆ demasiado complejo en 2.x
✹ EJB de sesión 1.x, 2.x: JDBC demasiado dispendioso !
public Order loadOrder(Long orderId) throws DAOException {
Order order = null;
PreparedStatement ps = null; ResultSet rs = null;
String queryOrder =
" SELECT order_date FROM ORDER WHERE order_id = ? ";
String queryOrderItems = " SELECT order_item_id, quantity "
" FROM ORDER_ITEM WHERE order_id = ? ";
try {
dbConnection = datasource.getConnection();
// consulta a tabla ORDER:
ps = dbConnection.prepareStatement(queryOrder);
ps.setLong(1, orderId.longValue());
ps.executeQuery(); ORDER_ITEM
rs = ps.getResultSet(); ORDER order_item_id
rs.next(); order_id
order_date order_id
order = new Order();
quantity
order.setOrderId(orderId);
order.setOrderDate(rs.getDate(1));
rs.close(); ps.close(); 46
◆ continuación del ejemplo:
// consulta a tabla ORDER_ITEM:
ps = dbConnection.prepareStatement(queryOrderItems);
ps.setLong(1, orderId.longValue());
ps.executeQuery();
rs = ps.getResultSet();
List theItems = new ArrayList();
while (rs.next()) {
OrderItem orderItem = new OrderItem();
orderItem.setOrderId(orderId);
orderItem.setOrderItemId(rs.getString(1));
orderItem.setQuantity (rs.getLong(2));
theItems.add(orderItem);
}
order.setOrderItems(theItems);
}
catch (Exception e) {
throw new Exception
("Problem loading an order: " + e.getMessage());
}
finally {
rs.close();
ps.close();
dbConnection.close();
}
return order;
}
47
J2EE:
Arquitectura MVC de una aplicación
Presentación Aplicación Servicios Dominio Persistencia
CONTROLADOR
servlet controlador

MainServlet RequestProcessor EJB controlador

❽ ❷ ❸ ❹

ScreenFlow- ❻ WebProxy StateMachine
Manager
❺ MODELO
JSP EJB entidad
template C

EJB sesión Model


VISTAS A DAO
Value
BD
HTML JSP rela-
javaBean 1 BD
cional
1 pantallazo1 DAO

HTML JSP javaBean


2 2
pantallazo2

Navegador
Cliente Servidor Web Servidor de componentes Servidor BD48
✹ 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 ...

49
Java EE 5:
Arquitectura MVC de una aplicación
utilizando JSF, EJB 3 y Seam
N. Presentación N. Aplicación (Web) N. Servicios N. Persistencia
Navegador Cliente Servidor Web Servidor de componentes Servidor de BD

frameworks
servlet servlet ejb entity BD
HTML
JSF Seam Seam manager
relacional
ard
forw

JSP ejb
ejb
aplicación
JSP aplicación

entidades

Convenciones: interacción HTTP invocación acceso BD uso de atributos


de entidades (get y set) 50
Acople entre niveles utilizando el
framework JBoss Seam
✹ Seam logra que las entidades estén asociadas
directamente a las pantallas
◆ las pantallas muestran valores de atributos de entidades
◆ el usuario modifica o suministra valores para estos atributos
◆ asociación bidireccional entre pantallas y entidades

✹ Procesamiento de eventos de pantallas 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 51
✹ Facilidades avanzadas ofrecidas por Seam:
◆ Anotaciones Seam reducen descriptores y código
◆ Manejo de múltiples conversaciones simultáneas de un mismo
usuario
◆ Integración de Procesos de negocios:
• definición e implementación de flujos de negocio con jBPM y
Seam
• definición e implementación de flujos de pantallas
◆ Facilidades de testing con TestNG
--------------------------------------------------------------------------

✹ Principal autor de Seam: Gavin King (el mismo autor


de HIBERNATE)

52
✹ Seam fue aprobado por unanimidad en Junio 2006 como
parte de la próxima versión del estándar Java EE:
http://jcp.org/en/jsr/detail?id=299

53
✹ Alternativas de implementación

Presentation - JSP Facelets Portal


Application tiers

Request JSF
Controller
Context Seam
Management

State EJB 3 Jboss jBPM Hibernate


Management

54
demo super-booking para Java EE 5
✹ This sample application has been built on top of the following
frameworks:
• JSF: (Sun implementation) with facelets-RichFaces
• EJB 3: implemented by JBoss
• JBoss Seam: to glue JSF and EJB 3
• JBoss jBPM: workflow

✹ Union of seam examples with reorganization:


• organization oriented by modules and use cases
• security model based in roles to access system resources + encripted
passwords + SSL
• workflow using jBPM, with the participation of several use cases and actors
• dynamic menu with data coming from the database
• several patterns of screens
• flexible timeout control of the application and of conversations
• event management between ejbs based in annotations
• event management for screen rendering
• standardized source code administration based on ANT (compiling,
packaging, deployment, javadoc generation, testng, cvs or subversion)
55
✹ Mostrar:
◆ diferentes perfiles de usuarios => diferentes opciones de menú

◆ SSL: protocolo https asociado a ciertas pantallas

◆ elementos de pantallas: menús, tablas con scroll, tablas


ordenables, tablas editables con validación

◆ múltiples conversaciones para un mismo usuario (abrir segunda


pestaña sobre enlace de conversación e invocar botón "Buscar"
para abrir segunda conversación)

◆ jBPM: inscripción de hoteles y aprobación posterior por parte del


superadministrador
◆ internacionalización
◆ listas refrescadas por eventos

✹ Todas estas técnicas se mostrarán en el curso


◆ Prácticas sugeridas: agregar estos aspectos al ejemplo básico
“booking” de seam
56

También podría gustarte