Tema 3. Plataforma Java EE DAGSS Diseño de Arquitecturas de Grandes Sistemas Software 4 o Grado Ing. Informática http://ccia.ei.uvigo.es/docencia/dagss noviembre 2014 FJRP 2014 DAGS
3.1 Introducción a Java EE Java EE (Java Platform, Enterprise Edition): Plataforma Java para el desarrollo de aplicaciones empresariales Ofrece un framework para el desarrollo de aplicaciones distribuidas multicapa (3-tier, n-tier) basadas (o no) en Web Define una infraestructura común básica para el acceso a bases de datos, gestión de la persistencia, control de seguridad, gestión de transacciones,... Separación clara entre presentación (interfaz), lógica de negocio (o de aplicación) y datos Plataforma basada en componentes y contenedores Componentes: entes (objetos) intercambiables que residen en un servidor de aplicaciones y son gestionados por él [objetos gestionados / managed beans] En las versiones recientes de Java EE estos componentes son objetos Java convencionales que mediante anotaciones (o configuraciones de despliegue en XML) pasan a ser manejados por el servidor de aplicaciones Dependiendo del tipo de componente, el servidor de aplicaciones crea esos componentes, gestionando su ciclo de vida y ofreciéndole determinados servicios, en función de lo especificado por anotaciones/configuración. Contenedor: proceso donde se ejecutan los componentes Gestiona los componentes de la aplicación ciclo de vida Proporciona acceso a servicios de la plataforma: Seguridad, transacciones, persistencia, conectividad, etc. El desarrollador tiene que especificar: los componentes de la aplicación: Servlets, JSPs (JavaServer Pages), JSFs (JavaServer Faces), EJBs (Enterprise Java Beans) los descriptores de despliegue (deployment descriptor): Ficheros XML que describen los componentes de aplicación http://www.oracle.com/technetwork/java/javaee/ Java EE se asienta sobre Java SE (Java Standard Edition) Java SE provee la infraestructura de ejecución (Java Virtual Machine + APIs básicas) y de compilación (javac, rmic,...) Java EE: aplicaciones distribuidas multicapa sobre Web Java SE: aplicaciones de escritorio y applets Java ME: (Java MicroEdition) aplicaciones para dispositivos móviles Versión simplificada de Java SE + APIs específicas (localización, etc...) FJRP 2014 DAGS 1
Java EE es una colección de especificaciones de APIs Java (no es un producto/aplicación en si mismo) Describe el conjunto de paquetes, interfaces y clases Java que debe de ofrecer un framework Java EE Definidos en los JSRs (Java Specification Requests) de cada especificación Define también una test suite (ejemplos de referencia) que todo servidor de aplicaciones Java EE debe soportar y una colección de documentos (guias de diseño) explicativos La implementación de esas APIs es responsabilidad del fabricante Implementaciones propietarias IBM WebSphere AS 8.x Oracle WebLogic Server TMAX JEUS 8 Implementaciones libres: Red Hat JBoss Application Server 7.x (ahora WildFly 8) (http://www.jboss.org, http://www.wildfly.org ) Oracle GlassFish Server Open Source Edition 4.0 (http://glassfish.java.net) Apache Gerónimo [Tomcat+OpenEJB] (http://geronimo.apache.org) OW2 JOnAS (http://jonas.ow2.org/) Caucho RESIN (http://www.caucho.com/resin-application-server-2/) Servidores certificados: http://www.oracle.com/technetwork/java/javaee/overview/compatibility-jsp-136984.html Punto clave: independencia del fabricante Una aplicación distribuida Java EE que use las APIs estándar se podrá desplegar en distintos servidores de aplicaciones sin necesidad de modificación FJRP 2014 DAGS 2
Versión actual: Java EE 7 Fuente: A. Gonçalves, Beginning Java EE 7, Apress, 2013 A partir de Java EE 5 cambios importantes respecto a versiones previas (J2EE 1.4 y anteriores) Objetivo: simplificación del modelo de desarrollo 1. Uso extensivo de nuevas funcionalidades introducidas en versión 5 Java SE (jdk 1.5) Uso de anotaciones Java para añadir metainformación al código fuente que será explotada por en entorno de ejecución Java EE (contenedores de aplicaciones) Reemplazan en parte a los descriptores de despliegue (ficheros XML de configuración) 2. Uso de inyección de dependencias (Dependency Injection) para simplificar el desarrollo de las aplicaciones Java EE, facilitar su instalación (despliegue) y reducir el acoplamiento Ciclo vida de los objetos gestionado por el servidor de aplicaciones A partir de la metainformación (anotaciones) el contenedor/servidor Java EE es capaz de inyectar referencias a otros objetos en determinados atributos de los componentes JEE sin necesidad de que el propio componente lo tenga que hacer por si mismo En el código de los componentes JEE se usan anotaciones especiales para marcar atributos cuyos valores serán rellenados por el contenedor JEE en el momento en que sean desplegados (tiempo de ejecución). Idea: el componente no tiene que preocuparse de hacer new() o consultar un servidor de nombres (JNDI), ni de configurar el objeto referenciado FJRP 2014 DAGS 3
(a) Esquema general Java EE Fuente: The Java EE 7 Tutorial, http://docs.oracle.com/javaee/7/tutorial/doc/ (b) Componentes de la arquitectura Java EE Nota: En general, se entiende por componente un objeto Java con restricciones especiales que se ensambla y ejecuta dentro de un servidor de aplicaciones Java EE (contenedor) Tipos de componentes: Clientes de la aplicación clientes web [navegador] clientes de escritorio Java [swing, awt] clientes de escritorio no Java Componentes Web: servelts, páginas JSP (Java Server Pages), JSF (Java Server Faces),... Se ejecutan en el contenedor Web Responsables de componer la presentación de datos en formato HTML Suelen apoyarse en el uso de componentes Java Beans Java Beans: objetos Java que verifican 2 requisitos 1. tienen un constructor sin argumentos 2. todos sus atributos son accesibles mediante pares de métodos get() y set() FJRP 2014 DAGS 4
Componentes de negocio: EBJ (Enterprise Java Beans) y entidades JPA (Java Persistence API ) Se ejecutan en el contenedor de EBJs Componentes (objetos Java) responsables de implementar la lógica de la aplicación EBJ gestionan interacciones con los clientes e implementan reglas de negocio Desde Java EE 6, la especificación EJB-lite permite la ejecución de componentes EJB en la capa web (en servidores que soporten al menos el Web Profile ) Entidades Java: objetos persistentes que representan los datos de la capa EIS JPA provee de un mecanismo de mapeo Objeto-Relacional (ORM) sobre bases de datos relacionales Capa EIS (Enterprise Information Systems) Capa de datos gestiona la información permanente del sistema Bases de datos o aplicaciones empresariales heredadas (legacy systems) que actúan como almacenes de datos NOTA: La especificación CDI (Context and Dependence Injection) permite la gestión del ciclo de vida y la inyección de dependencias en objetos gestionados (CDI beans) tanto en la capa web como en la de negocio. Su uso más habitual (pero no el único) es como mecanismo de integración de componentes EJB (o de cualquier otro tipo de objeto Java) para su uso desde los elementos presentes en la capa web de una aplicación JEE. FJRP 2014 DAGS 5
(c) Contenedores Java EE Son procesos ( servidores/demonios) que dan soporte a las especificaciones Java EE Ofrecen servicios a los componentes, actuando como interfaz entre un componente y los aspectos de bajo nivel de cada plataforma Simplifican el desarrollo de los componentes ocultando los detalles complejos Sus tareas concretas depende de la capa a la que pertenezcan Servicios ofrecidos: seguridad, gestión de transacciones, consulta de directorios de nombres (JNDI), etc Tipos de contenedores en la plataforma Java EE Fuente: The Java EE 7 Tutorial, http://docs.oracle.com/javaee/7/tutorial/doc/ Servidor de Aplicaciones Java EE: entorno de ejecución aplicaciones JEE Proporciona el contenedor Web y/o el contenedor de EBJs Contenedor EJB (Enterprise Java Beans): gestiona la ejecución (ciclo de vida) de los EJBs Da soporte a los componentes que implementan la capa de lógica de negocio Ofrece servicios de control de acceso y seguridad, control de transacciones y ejecución concurrente, etc Nota: Hay otras alternativas que ofrecen funcionalidades similares para implementar la lógica de negocio sin usar EJBs (ej.: framework Spring) Ejemplos libres: JBoss, OpenEJB,... Contenedor Web: gestiona la ejecución de los servlets y paginas JSP Da soporte a los componentes que implementan la capa Web API de Servlets, APIs JSP, JSTL, Framework JSF, JavaBeans Ejemplos libres: Tomcat, Jetty,... Contenedor aplicación cliente: ofrece la infraestructura necesaria para la ejecución del cliente FJRP 2014 DAGS 6
(d) APIs de Java EE 7 Java EE se basa en Java SE Todas las APIs de Java SE están disponibles En Java EE se definen nuevas API específicas pare el desarrollo de sistemas distribuidos multicapa Algunas han acabado pasando a Java SE (ej. JDBC, JPA) En Java EE 6 se introdujo el concepto de profiles los servidores de aplicaciones no están obligados a implementar todas las APIs de la especificación 1. Web profile: incluye sólo parte de las APIs, fundamentalmente las orientadas a construcción de aplicaciones Web en Java a) APIs incluidas: WebSocket 1.0, Servlet 3.1, JSF 2.2, JSP 2.3, JSTL 1.2, CDI 1.1, EJB 3.2 lite, JPA 2.1, JTA, BeanValidation b) Omite: EJB 3.2 full, JCA, JMS, APIs de seguridad, etc 2. Full profile: incluye todas las APIs de la especificación Fuente: A. Gonçalves, Beginning Java EE 7, Apress, 2013 FJRP 2014 DAGS 7
Tecnologías y APIs más relevantes Enterprise Java Beans [ver. 3.2]: Definición de componentes EJB que implementan/ejecutan los procesos de negocio/aplicación session beans: componentes de negocio que gestionan la conversación con el cliente Ofrecen un punto de entrada (interfaz) mediante el cual los clientes (Web, escritorio) invocan los procesos de la lógica de negocio 3 tipos: con estado (stateful session bean) sin estado (stateless session bean) singleton (singleton session bean) Permiten la invocación local (dentro del contenedor JEE) y/o remota (mediante RMI/IIOP) message-driven beans: componentes de negocio que reciben y gestionan invocaciones asíncronas Nota: hasta J2EE 1.4 existían los entity beans, desde JEE 5 han sido reemplazados por las entidades JPA (objetos persistentes) Java Persistence API (JPA) [ver. 2.1]: soporte estándar para persistencia de objetos Permite definir un mapeo objeto-relacional para tipos de entidades (mediante anotaciones o ficheros XML) Entidad: objeto Java que representa los datos almacenados en una tupla de una BD JPA gestiona la consulta, carga, modificación y escritura de entidades Salva las diferencias entre modelo relacional y modelo Orientado a Objetos Se asienta sobre el API JDBC (acceso a BD SQL) Contexts and Dependency Injection for the Java EE Platform (CDI) [ver. 1.1]: ampĺıa y generaliza el soporte para la inyección de dependencias y la gestión del ciclo de vida de los objetos basada en contextos. Simplifica integración de capas Web (JSF) y lógica de aplicación (EJB) Java Database Connectivity (JDBC): soporte para acceso a sistemas gestores de base de datos e invocación de sentencias SQL Bean Validation: soporte declarativoa para la definición de metadatos (anotaciones) con restricciones sobre los valores de los atributos de determinados objetos FJRP 2014 DAGS 8
API de Servlets [ver. 3.1]: servlets son objetos Java que manejan peticiones HTTP WebSocket [ver. 1.0]: soporte para comunicación bidireccional fullduplex entre cliente y servidor sobre conexiones HTTP Java Server Pages (JSP) [ver. 2.3]: lenguaje de marcado que combina Java y HTML Internamente se compilan en servlets JSP Standard Tag Library (JSTL) [ver. 1.2]: juego de etiquetas estándar para definir páginas JSP a alto nivel Java Server Faces (JSF) [ver 2.2]: Framework MVC (modelovista-controlador) basado en componentes del lado servidor. Java API for XML Processing (JAXP) y Java Architecture for XML Binding (JAXB) [ver. 2.2]: soporte para el procesamiento de documentos XML Java API for JSON Processing (JSON-P) [ver. 2.2]: soporte para el procesamiento de documentos JSON Java API for XML Web Services (JAX-WS) [ver. 2.2]: soporte para invocación y publicación de Servicios Web (protocolos SOAP, WSDL, UDDI) Java API for RESTful Web Services (JAX-RS) [ver. 2.0]: soporte para invocación y publicación de Servicios Web basados en la arquitectura REST Java Naming and Directory Interface (JNDI): soporte para el acceso (inserción y consulta) a servicios de directorio Permite almacenar (asociar nombre) y recuperar información, recursos, referencias a objetos (EJB), etc Otras: Java Message Service(JMS), Java Tansaction API(JTA), Java Mail, Java Authentication and Authorization Service(JAAS), emphjava EE Connector Architecture (JCA)... FJRP 2014 DAGS 9
Fuente: The Java EE 7 Tutorial, http://docs.oracle.com/javaee/7/tutorial/doc/ FJRP 2014 DAGS 10
(e) Aplicaciones Java EE Los servidores/contenedores JEE esperan que las aplicaciones y módulos a desplegar se empaqueten en un formato predeterminado dependiendo del tipo de módulo a desplegar. Cada paquete (archivo JAR) contiene los componentes a desplegar junto con (opcionalmente) uno o más descriptor de despliegue Ficheros XML que detallan el modo en que esos componentes van a ser desplegados y a funcionar Desde Java EE 5, son opcionales. Esa información de configuración puede incluirse en anotaciones que contenedor JEE y/o implementación de cada especificación JEE concreta se encargará de procesar La configuración presente en los descriptores de despliegue (XML) anula la presente en las anotaciones (permite modificar la configuración y el despliegue de una aplicación/módulo sin afectar al código fuente) Distintas especificaciones JEE poseen sus propios descriptores de despliegue estándar Los servidores/contenedores JEE pueden definir sus propios descriptores de despliegue (no estándar) (1) Aplicaciones JEE Empaquetadas en ficheros EAR Empaquetan un conjunto de módulos JEE (módulos web, módulos EJB, módulos de aplicaciones cliente, módulos adaptadores de recursos JCA) que conforman la aplicación (cada módulo a su vez podrá tener su propio descriptor de despliegue) FJRP 2014 DAGS 11
(2) Módulos EJB Empaquetados en ficheros JAR ( especiales ) Empaquetan un conjunto de EJBs, junto con sus interfaces de negocio y demás clases complementarias (excepciones, entidades, etc), además de librerías adicionales (3) Aplicaciones/Módulos Web Empaquetadas en ficheros WAR Empaquetan los elementos de una aplicación/módulo web en JEE: clases de los Servlet, ficheros JSP, contenido estático [HTML, imágenes, CSS, JavaScripts], clases complementarias (ManagedBeans, JavaBeans, EJBs lite ) y librerías adicionales. (4) Otros: Paquetes JAR (módulos aplicaciones cliente), paquetes RAR (módulos de adaptadores de recursos JCA) FJRP 2014 DAGS 12
Resumen de los descriptores de despliegue típicos Descriptor Especifiación Ubicación application.xml Java EE META-INF (EAR) application-client.xml Java EE META-INF (JAR) beans.xml CDI META-INF (JAR) ó WEB-INF (WAR) ra.xml JCA META-INF (RAR) ejb-jar.xml EJB META-INF (JAR) ó WEB-INF (WAR) faces-config.xml JSF WEB -INF (WAR) persistence.xml JPA META-INF (JAR) ó WEB-INF (WAR) validation.xml Bean Validation META-INF (JAR) ó WEB-INF (WAR) web.xml Servlet WEB -INF (WAR) web-fragment.xml Servlet ( 3.0) WEB -INF (WAR) webservices.xml JAX-WS META-INF (JAR) ó WEB-INF (WAR) XML Schema de los descriptores de componentes Java EE http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html Namespaces XML para los esquemas http://xmlns.jcp.org/xml/ns/javaee/ (Especificaciones en Java EE 7) http://java.sun.com/xml/ns/javaee/ (Especificaciones anteriores) FJRP 2014 DAGS 13