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
[Link] [Link] 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 [Link] java
package [Link]; import [Link]; 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) { [Link] = mensaje; } public String getMensaje() { return mensaje; } }
33
Ejemplo: [Link] struts xml
<!DOCTYPE struts PUBLIC " //Apache Software Foundation//DTD Struts Configuration 2.0//EN" "-//Apache 2 0//EN" "[Link] <struts><!-- Configuration for the default package. --> <package name=[Link]" extends="struts-default"> <action name="accion" class=[Link]"> <result>/[Link]</result> </action> /package </package> </struts>
34
Ejemplo web [Link] xml
<?xml ?xml version version="1 1.0 0"?> ? <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "[Link] <web-app> <display-name>My Application</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>[Link]</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>[Link]</welcome-file> </welcome-file-list> </web-app>
35
Ejemplo: inicio [Link] 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 [Link] 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([Link])); ( )); //retrieve MyLogic: MyLogic myLogic = (MyLogic) [Link](myLogic); //call the method: [Link](); } } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans ...> <! this is [Link] <!-beans xml --> > <beans> <bean id=theBusinessSvc class=[Link] /> <bean id=myLogic class=[Link]> <property name=businessService> <bean b ref=theBusinessSvc f h / /> </property> </bean> </beans>
48
Integracin con Struts
Package packt; import [Link]; public class Action extends ActionSupport p pp { private [Link] mB; public Action([Link] 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 [Link] --> <beans> <bean id=claseAction scope=prototype class=[Link]> <constructor-arg <constructor arg ref= ref=miBean/> miBean /> </bean> <bean id=miBean class=[Link]> <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 [Link] { private int id; private double total; private Collection Collection<LineItem> LineItem lineItems; @Id @GeneratedValue(strategy=[Link]) public int getId() { return id; } public void setId(int id) { [Link] = id; } public double getTotal() { return total; } public void setTotal(double total) { [Link] = 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(); [Link](this); [Link](product); [Link](quantity); item setSubtotal(quantity * price); [Link](quantity [Link](item); total += quantity * price; } @OneToMany(cascade = [Link], fetch = [Link], mappedBy="order") public bli Collection<LineItem> C ll ti Li It getLineItems() tLi It () { return lineItems; } p public void setLineItems(Collection<LineItem> ( lineItems) ) { [Link] = lineItems; } }
67
Ejemplo de EJB
@Entity public class LineItem implements [Link] { private int id; private double subtotal; private int quantity; private String product; private Order order;
@Id @GeneratedValue(strategy=[Link]) public int getId() { return id; } public void setId(int id) { [Link] = id; } public double getSubtotal() { return subtotal; } public void setSubtotal(double subtotal) { [Link] = subtotal; } public int getQuantity() { return quantity; }
68
Ejemplo de EJB
public void setQuantity(int quantity) { [Link] q y=q quantity; y; } public String getProduct() { return product; } public void setProduct(String product) { [Link] = product; } @ManyToOne @JoinColumn(name = "order_id") public Order getOrder() { return order; ; } public void setOrder(Order order) { [Link] = order; } }
69
Recursos
[Link] h //j [Link] [Link]
70