Sie sind auf Seite 1von 70

Desarrollo de aplicaciones Java EE con Struts 2, Spring y EJB 3.

2007, Grupo Salenda, S.L.

Qu es J2EE?
Conjunto j d de especificaciones ifi i y prcticas i

q p que permiten desarrollar, desplegar p g y gestionar aplicaciones multicapa Sun


Microsystems. Lgica dividida en componentes. Componentes divididos en capas.
2

Componentes J2EE
C Componentes t software ft autocontenidos. t t id Ensamblados en una aplicacin J2EE, con sus clases l y ficheros fi h relacionados. l i d Tipos p de componentes: p
Clientes de la aplicacin y applets se ejecutan en el cliente. Componentes web (JSP & Servlet) se ejecutan en el servidor. Componentes de d negocio i (EJB) ( ) se ejecutan j en el l servidor.

Clientes J2EE
Clientes web (aka Clientes Clientes ligeros ligeros) ).
Pginas web dinmicas generadas por componentes web de la capa Web Web. Navegador web renderiza las pginas recibidas del servidor.

Aplicaciones cliente (aka Clientes pesados).


Interfaz de usuario (Swing / AWT / SWT). Se ejecutan en el PC del cliente. Acceden A d di directamente t t a los l componentes t de d negocio

Capas de J2EE

Contenedores J2EE
I Interfaz t f entre t un componente t y la l funcionalidad de bajo nivel de la plataforma l t f que soporta t ese componente. t Tipos: p
Servidor J2EE proporciona contenedores web y EJB. J Contenedor de EJBs gestiona la ejecucin de EJBs. J Contenedor web gestiona la ejecucin de JSPs y Serlvets. 6

Contenedores J2EE

Empaquetado
Mdulo Mdulo: uno o ms componentes J2EE para el mismo tipo de contenedor + descriptor. Descriptor de despliegue (DD): documento XML que describe las propiedades de despliegue de un mdulo. Tipos i de d mdulos: d l
EJBs: .jar Web .war Web: war Resource Adapter: .rar Cliente de la aplicacin: .jar

Un fichero EAR contiene una aplicacin J2EE, que puede estar compuesta por uno o varios mdulos

Servidores de aplicaciones
Software que ayuda al desarrollo, desarrollo despliegue y control de aplicaciones empresariales (distribuidas). (distribuidas) Sirven como contenedores de los componentes de una aplicacin J2EE Provee middleware para acceso a servicios subyacentes y
Seguridad Persistencia Acceso a datos

Arquitectura de un servidor de aplicaciones

10

Contenedores de aplicaciones
E i t muchos Existen h servidores id de d aplicaciones li i
Comerciales
WebSphere (IBM) WebLogic (BEA Systems) Oracle AS (Oracle Corp)

Libres
JBboss (JBoss Inc) Tomcat (Apache Foundation) Jonas (ObjectWeb)

Comparativa de servidores de aplicaciones


http://en.wikipedia.org/wiki/Matrix_of_Application_Servers#Java http://en wikipedia org/wiki/Matrix of Application Servers#Java

11

Servidores de aplicaciones
Todos d los l comerciales i l ofrecen f
Contenedores de j jsps p y servlets Contenedores de EJBs Funcionalidades aadidas (dependiendo del vendedor)

E Existen i t otros t servidores id de d aplicaciones li i que solo ofrecen contenedor de jsps y servlets (tomcat)
12

Servlets
E Extienden ti d la l funcionalidad f i lid d de d un servidor id web Componentes ejecutables j bl en un contenedor d web Encargados de escuchar a las peticiones de un cliente Encargados de responder a las peticiones de un cliente Mejor rendimiento que CGI : uso de threads
13

JSP
Separacion i entre logica l i de d negocio i y p presentacion Facil mantenimiento Basado B d en la l tecnologia t l i de d servlets l t Orientado a la logica g de p presentacion

14

Servlets en el servidor web


Diagrama i d de despliegue d li d de un servidor id web con un contenedor web:

15

Ejecucin de los servlets


Para una peticin: i i

Para n n peticiones

16

Ventajas y desventajas de los Servlets


Ventajas: V t j
Prestaciones (los threads son ms rpidos y ligeros que los procesos) Escalable El l lenguaje j J Java es orientado i t d a objetos bj t y robusto. b t El lenguaje Java es multiplataforma

Desventajas: D t j
Cmo separar la lgica de negocio y la presentacin? t i ? Cuestiones de concurrencia

17

Tecnologa JavaServer Pages (JSP)


Las plantillas L l till d de cdigo di son como pginas i HTML estticas, tti pero con cdigo Java embebido para permitir la generacin dinmica de datos y HTML.

Ejemplo:
<table border="1" cellspacing="0" p g cellpadding=5> p g <tr><th>number</th><th>squared</th></tr> <% for ( int i=0; i<10; i++ ) { %> <tr><td><%= i %></td> <td><%= ( (i * i) ) %></td></tr> <% } %> </table>

18

Ventajas y desventajas de las JSP


Ventajas: j
Todas las ventajas j que q tienen los servlets: Altas prestaciones, escalabilidad, independencia de plataforma, p , etc.

Desventajas:
Si slo l se emplean l pginas i JSP, JSP el l cdigo di d de script que realiza la lgica de negocio puede llegar a ser demasiado grande y conf confuso, so haciendo difcil su depuracin 19

Diagrama de secuencia de una peticin GET

20

Resumen
Puedes usar un componente de la vista para presentar datos datos, mostrar un formulario, mensajes de informacin y dems. El protocolo HTTP proporciona un mecanismo para solicitar vistas tanto estticas como dinmicas El contenedor web intercepta las peticiones HTTP y activa el servlet que sea necesario Se puede d desarrollas d ll una clase l servlet l que implemente i l el l mtodo doGet para procesar una peticin Se p puede acceder a la informacin de la p peticin del inputstream a travs del d l objeto b request provisto por el l contenedor. Se p puede generar g una vista escribiendo directamente en el outputstream del objeto request provisto por el contenedor

21

Integracin de Servlets y JSP El Patrn MVC


El patrn MVC

2007, Grupo Salenda, S.L.

Porqu combinar Servlets y JSP?


Escenario i tpico: i usar JSP para facilitar f ili el l desarrollo y mantenimiento del contenido HTML
Para cdigo dinmico simple simple, invocar cdigo servlet desde elementos de script. Para aplicaciones un poco ms complejas complejas, usar clases propias invocadas desde elementos de script. script

23

Porqu combinar Servlets y JSP?


Pero eso no es suficiente fi i
Para p procesamiento complejo, p j , empezar p con J JSP es una mala aproximacin A pesar de la facilidad de separar el cdigo real en clases separadas, beans y custom tags, asumir que una JSP es una sola pgina

24

Posibilidades para manejar una sola peticin


Arquitectura i MVC. Necesaria i cuando: d
Una sola p peticin puede p derivar en mltiples p resultados diferentes. Existe un gran equipo de desarrollo con funciones bien separadas. Se realiza un procesamiento complicado de los datos.

25

Patrn MVC
Modelo

Vi t Vista

C t l d Controlador

Qu es Apache Struts?
Un framework f k MVC?
Struts p provee un framework unificado p para el despliegue de aplicaciones web que usan la arquitectura q MVC.

Una coleccin de utilidades?


Stuts St t provee una serie i d de clases l d de utilidades tilid d para manejar las tareas comunes del desarrollo de aplicaciones web eb

27

Qu es Apache Struts?
Un conjunto j de d libreras lib de d etiquetas i personalizadas ? p
Struts provee libreras de etiquetas personalizadas para mostrar propiedades de beans, generar formularios HTML

28

Ventajas de Struts
Configuracin fi i b basada d en archivos hi centralizados:
Archivos XML.

Form beans. beans Bean tags:


Tags de acceso a las propiedades de los beans.

HTML tags:
Asocia formularios HTML con beans. 29

Ventajas de Struts
Validacin lid i de d formularios. f l i Aproximacin consistente con el patrn MVC. MVC

30

Desventajas de Struts
Mayor curva de d aprendizaje di j Peor documentacin:
Comparada con la documentacin standard de servlets y JSP JSPs s.

Menor transparencia:
El framework aade mayor complejidad

Aproximacin rgida:
Con Struts es muy difcil usar algo distinto a MVC. 31

Control de flujo de Struts


JSP

Form

Determina r Accin

Action

Elegir JSP

JSP

32

Ejemplo: Action Action.java java


package es.salenda.action; import com.opensymphony.xwork2.ActionSupport; public class Action extends ActionSupport { private String mensaje; public String execute() throws Exception {
//if(condicionDeSalida) return failure; failure ;

setMensaje(mensaje); return SUCCESS; }

public void setMensaje(String mensaje) { this.mensaje = mensaje; } public String getMensaje() { return mensaje; } }

33

Ejemplo: struts.xml struts xml


<!DOCTYPE struts PUBLIC " //Apache Software Foundation//DTD Struts Configuration 2.0//EN" "-//Apache 2 0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts><!-- Configuration for the default package. --> <package name=es.salenda.action" extends="struts-default"> <action name="accion" class=es.salendaaction.Action"> <result>/index.jsp</result> </action> /package </package> </struts>

34

Ejemplo web web.xml xml


<?xml ?xml version version="1 1.0 0"?> ? <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>My Application</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> /filter <filter-mapping> <filter-name>struts2</filter-name> <url pattern>/ </url pattern> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>inicio.jsp</welcome-file> </welcome-file-list> </web-app>

35

Ejemplo: inicio inicio.jsp jsp


<%@ taglib prefix= prefix="s" s uri= uri="/struts /struts-tags tags" %> <html> <head> <title>Inicio</title> </head> <body> <s:form action="accion"> <s:textfield label=Echo server" name=mensaje"/>

<s:submit/> </s:form> /s:form </body> </html>

36

Ejemplo: index index.jsp jsp


<%@ taglib prefix="s" uri="/struts-tags" uri="/struts tags" %> <html> <head> <title>Echo title Echo Server Server</title> /title </head> <body> y Echo server reply: <h2><s:property value=mensaje" /></h2> </body> </html>

37

Spring Framework
IoC

2007, Grupo Salenda, S.L.

Por qu un contenedor ligero?


J2EE funciona f i bi bien pero
Es una arquitectura q p pesada con muchas restricciones A menudo es demasiado demasiado para desarrollar aplicaciones simples Es complicado el test test driven development development

39

Inversin de Control
Inversin de control a.k.a. a k a Injeccin de dependencias El patrn en el ncleo de Spring
Hace que el cdigo sea ms fcil de probar. Organiza los objetos de la capa intermedia (con o sin EJBs). Con Spring p g te centras slo en las p propiedades p de los JavaBeans. Diseado para que existan las menores dependencias posibles (casi todos los objetos de negocio NO dependen del framework).

40

Inversin de Control
Provee P de d un framework f k consistente i t t para el l acceso a datos (JDBC o O/R mapping). Posibilita la construccin de la aplicacin usando POJOs.

41

Diseo de sistemas sostenibles


El l punto clave l es l la gestin i d de

dependencias. p
Diseo por contrato:
Define el comportamiento comportamiento, no la implementacin. Se escribe ib una interfaz/clase i f / l para solucionar l i cada problema. Fcil construir tests para comprobar la funcionalidad de cada implementacin dada. 42

Diseo de sistemas sostenibles


Dependencia: d i atar un componente a otro mediante:
Herencia. Composicin. Composicin Instanciacin. Signatura de d mtodos. d Uso de mtodos estticos o atributos

43

Diseo de sistemas sostenibles


L La dependencia d d i implica i li un cambio bi en el l componente dependiente cuando el componente t d del l que d depende d sufre f algn l cambio. No es necesariamente mala (es ); el objetivo j es: inevitable);
Minimizar el nmero de dependencias en el diseo. Depender nicamente de interfaces. 44

Cmo funciona
Defines: fi
Interfaces e implementaciones. p Dependencias entre las clases/interfaces.

El contenedor de IoC: IoC


Construye al dependiente y al proveedor; inyecta al proveedor dentro del dependiente. Te da la p posibilidad de elegir g el tipo p de injeccin j (por configuracin, cdigo o automticamente autowiring-) g) 45

Cmo funciona
U Uso d de POJOS para las l implementaciones. i l t i No hay y necesidad de desplegar p g en un contenedor pesado. Mejora la testabilidad. testabilidad . No es intrusivo:
No N dependes d d de d ninguna i API especfica fi d del l contenedor. No N hay h interfaces i t f que implementar, i l t ni i clases l de d las que heredar, salvo las propias. 46

El El principio de Hollywood Hollywood


No N me llames, ll que ya te t llamo ll yo.

Sin IoC:
El componente tiene el control sobre sus dependencias, con lo que tiene que

conseguirlas. il

Con IoC:
Los componentes de negocio no tienen control sobre sus dependencias. p El contenedor ser el encargado de inyectrselas. y 47

Ejemplo
class MyMain { public static void main(String[] args) { //initialize the IoC container (here it's Spring): XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(new y( ClassPathResource(beans.xml)); ( )); //retrieve MyLogic: MyLogic myLogic = (MyLogic) xmlBeanFactory.getBean(myLogic); //call the method: myLogic.doYourThing(); } } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans ...> <! this is beans.xml <!-beans xml --> > <beans> <bean id=theBusinessSvc class=foo.BusinessServiceMock /> <bean id=myLogic class=foo.MyLogic> <property name=businessService> <bean b ref=theBusinessSvc f h / /> </property> </bean> </beans>

48

Integracin con Struts


Package packt; import com.opensymphony.xwork2.ActionSupport; public class Action extends ActionSupport p pp { private servicios.MiBean mB; public Action(servicios.MiBean bean) { mB = bean; } public String execute() throws Exception { //Lgica . return SUCCESS; }

49

Integracin con Struts


<?xml ?xml version="1.0" version "1 0" encoding="UTF-8"?> encoding "UTF 8"? <!DOCTYPE beans ...> <!-- this is beans.xml --> <beans> <bean id=claseAction scope=prototype class=packt.ActionClass> <constructor-arg <constructor arg ref= ref=miBean/> miBean /> </bean> <bean id=miBean class=servicios.MiBean> <property property name name=codigo codigo value value=765123/> 765123 / </bean> </beans>

50

EJB 3.0

2007, Grupo Salenda, S.L.

Qu son los EJB EJBs? s?


Es una tecnologa l para d desarrollar ll p multicapa. p aplicaciones Un estndar implementador por muchos proveedores de contenedores contenedores. Componentes distribuidos de negocio y acceso a datos. Existen varios tipos

52

Tipos de EJB
Entity i Beans:
Usados p para mapear p tablas de la BBDD a clases (O/R mapping). En lugar de trabajar con resultados resultados de querys querys, trabajas con objetos Java. El servidor de aplicaciones provee de la funcionalidad para cardar, actualizar o borrar los valores de una clase de la BBDD BBDD.

53

Tipos de EJB
Beans de d sesin: i
Usados p para implementar p funcionalidad de la aplicacin. Hay dos tipos:
Con estado. Sin estado estado.

54

Tipos de EJB
Beans de d sesin i con estado: d
El contenedor se encargar g de mantener el estado del objeto a lo largo de la sesin del usuario. (p (p.e. un carro de la compra). p )

Beans de sesin sin estado:


Es E un componente t con un ciclo i l d de vida id corto, t no alcanza ms all de cada conexin del cliente. (p e implementar lgica para mandar un (p.e. n mail). mail)

55

Tipos de EJB
Message Driven i Beans:
Representan p un servicio sin estado de invocacin asncrona.

56

EJB s EJBs
Proporcionan i l la arquitectura i para el l p distribuidas desarrollo de aplicaciones basadas en componentes. Proporcionan portabilidad entre diferentes plataformas y protocolos de comunicacin. El contenedor se encarga de detalles tales g , transaccionabilidad, , como seguridad, gestin de su ciclo de vida
57

Beneficios de los EJB EJBs s


Simplifican i lifi el l desarrollo d ll d de aplicaciones li i gran envergadura. g distribuidas de g
El contenedor le provee de servicios de bajo nivel. La lgica de negocio se encuentra en los beans, y no en el cliente => clientes ms ligeros. ligeros Son portables y reusables.

58

Cundo usar EJB EJBs? s?


Cuando C d
La aplicacin debe de ser escalable
Pueden ser distribuidos en varias mquinas y su localizacin seguir siendo transparente para los clientes. clientes

Se debe primar la integridad de los datos


Los EJB EJBs s soportan transacciones con este fin fin. Pueden acceder de forma concurrente a objetos compartidos.

La aplicacin tendr varios clientes


Clientes remotos Java, en otros lenguajes, navegadores web

59

EJBs EJB s de entidad


Nos centraremos en los l EJBs de d entidad. id d
Representan p un objeto j de negocio g en un sistema de almacenamiento persistente.

Persistencia:
El EJBs existe ms all de la vida de la aplicacin. li i Puede ser gestionada por el bean o por el contenedor. d

60

EJBs EJB s de entidad


Acceso compartido: id
Como los Beans de entidad p pueden ser accedidos por mltiples clientes al mismo tiempo p es imprescindible p q que realicen su trabajo j dentro de transacciones.

Clave primaria:
Cada bean de entidad debe de tener un nico (y unvoco) n oco) identificador. identificador

61

EJBs EJB s de entidad


Relaciones: l i
Al igual g q que una tabla en el modelo relacional, , un EJB de entidad puede tener relaciones con otros ( (1:1, , 1:n, , n:m). )

Persistencia manejada por el contenedor:


El contendor t d maneja j todo t d el l acceso a l la BBDD BBDD. El EJB no contiene SQL, luego no est atado a ningn mecanismo de d almacenamiento l en concreto. 62

EJBs EJB s de entidad


Debido D bid a esto, t los l EJBs EJB son portables t bl entre t distintas plataformas/contenedores/bbdds. Se debe de proveer del Abstract Schema

63

EJBs EJB s de entidad


Campos persistentes: i
Todos los campos p p persistentes son almacenados en la BBDD subyacente. El contenedor de EJB se encarga de que SIEMPRE estn sincronizados. Normalmente cada Entity se aloja en una tabla, tabla y cada campo en una columna.

64

EJBs EJB s de entidad


Campos relacionales l i l
Un campo p relacional es una clave ajena j en la base de datos.

65

Ejemplo de EJB
@Entity @Table(name = "PURCHASE_ORDER") public class Order implements java.io.Serializable { private int id; private double total; private Collection Collection<LineItem> LineItem lineItems; @Id @GeneratedValue(strategy=GenerationType.AUTO) public int getId() { return id; } public void setId(int id) { this.id = id; } public double getTotal() { return total; } public void setTotal(double total) { this.total = total; }

66

Ejemplo de EJB
public void addPurchase(String product, int quantity, double price) { if (lineItems == null) lineItems = new ArrayList<LineItem>(); LineItem item = new LineItem(); item.setOrder(this); item.setProduct(product); item.setQuantity(quantity); item setSubtotal(quantity * price); item.setSubtotal(quantity lineItems.add(item); total += quantity * price; } @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="order") public bli Collection<LineItem> C ll ti Li It getLineItems() tLi It () { return lineItems; } p public void setLineItems(Collection<LineItem> ( lineItems) ) { this.lineItems = lineItems; } }

67

Ejemplo de EJB
@Entity public class LineItem implements java.io.Serializable { private int id; private double subtotal; private int quantity; private String product; private Order order;

@Id @GeneratedValue(strategy=GenerationType.AUTO) public int getId() { return id; } public void setId(int id) { this.id = id; } public double getSubtotal() { return subtotal; } public void setSubtotal(double subtotal) { this.subtotal = subtotal; } public int getQuantity() { return quantity; }

68

Ejemplo de EJB
public void setQuantity(int quantity) { this.quantity q y=q quantity; y; } public String getProduct() { return product; } public void setProduct(String product) { this.product = product; } @ManyToOne @JoinColumn(name = "order_id") public Order getOrder() { return order; ; } public void setOrder(Order order) { this.order = order; } }

69

Recursos
http://java.sun.com h //j http://springframework.org http://struts.apache.org

70