Java 2 Enterprise Edition (J2EE) es un est�ndar que define un entorno para el desarrollo y despliegue de aplicaciones empresariales. Reduce el coste y la complejidad del desarrollo de aplicaciones empresariales multi-capa y proporciona un modelo de aplicaci�n distribuida multi-capa. En otras palabras, es enteramente distribuido y por lo tanto, las distintas partes de una aplicacion se pueden ejecutar en diferentes dispositivos.
Las aplicaciones Web desarrolladas usando JavaServer Pages (JSP) podr�an requerir alguna interacci�n con servicios J2EE. Por ejemplo, un sistema de control de inventario basado en Web podr�a necesitar acceder a servicios de directorio de J2EE para obtener el acceso a una base de datos. O podr�amos querer usar JavaBeans Enterprise (EJB) en nuestra aplicaci�n.
Esta p�gina presenta una breve introducci�n a J2EE, y nos muestra c�mo:
- Describir servicios J2EE en un Descriptor de Desarrollo Web (web.xml)
- Referenciar servicios J2EE
- Acceder o usar servicios J2EE desde JSPs
�Introducci�n a J2EE
J2EE es una plataforma est�ndar para desarrollar y desplegar aplicaciones empresariales. La arquitectura de J2EE, que est� basada en componentes, hace muy sencillo el desarrollo de este tipo de aplicaciones porque la l�gica de negocios est� organizada dentro de componentes reutilizables y el servicio subyacente lo proporciona el J2EE en la forma de un contenedor por cada tipo de componente. Pensemos en un contenedor como un interface entre el componente y la funcionalidad de bajo-nivel que soporta el componente. Por lo tanto, antes de poder ejecutar un componente de una aplicaci�n cliente, debe configurarse como un servicio J2EE y desplegarse dentro de su contenedor.
En la siguiene tabla se describen brevemente los servicios est�ndar incluidos en la versi�n 1.3 de la J2EE specification:
Servicio Est�ndar | Descripci�n |
---|---|
HTTP | Define el servicio HTTP donde el API del lado del cliente est� definido por el paquete java.net, y el API del lado del servidor est� definido por el API Servlet (incluyendo JSP). HTTPS, o el uso de HTTP sobre "Secure Socket Layer" (SSL), est� soportado por los mismos APIs del cliente y del servidor que HTTP. |
Enterprise JavaBeans (EJBs) | Un modelo de componente para desarrollo empresarial en Java. |
Java Transaction API (JTA) | Un interface para componentes de aplicaciones J2EE para manejar transaciones. |
RMI-IIOP | Define los APIs que permiten el uso de programaci�n al estilo RMI que es independiente del protocolo subyacente. Las aplicaciones J2EE necesitan usar RMI-IIOP cuando acceden a componentes EJB. |
Java IDL | Permite a las aplicaciones J2EE invocar a objetos CORBA usnado el protocolo IIOP. |
JDBC | API para acceder a bases de datos. |
Java Message Service (JMS) | API para mensajer�a que soporta punto-a-punto y modelos de publicaci�n por subscripci�n. |
Java Naming and Directory Interface (JNDI) | API para acceder a sistemas de nombres y directorios de recursos J2EE. |
JavaMail | Un API est�ndar para enviar email. |
JavaBeans Activation Framework (JAF) | Un API est�ndar usado por JavaMail. |
Java API for XML Parsing (JAXP) | Un API est�ndar para analizar documentos XML. Incluye soporte para SAX y DOM. |
J2EE Connector Architecture | Un API est�ndar para permitir la conectividad de sistemas legales y aplicaciones empresariales no-Java. |
Java Authentication and Authorization Service (JAAS) | Un API est�ndar para permtiir que los servicios J2EE autentifiquen y fuercen el control de acceso sobre los usuarios. |
J2EE promueve el desarrollo de aplicaciones multi-capa en las que el contenedor web almacena componentes web que est�n dedicados a menejar la l�gica de presentaci�n de una aplicaci�n dada, y responden a las peticiones del cliente (como un navegador web). Por otro lado, el contenedor EJB, almacena componentes de aplicaci�n que responden a las peticiones de la capa web como se muestra en la figura 1:

Figura 1: Aplicaciones Multi-capa
Las aplicaciones que usan esta arquitectura son escalables impl�citamente. Esta arquitectura separa el acceso a los datos de las interacciones con el usuario final, y se asegura la reutilizaci�n del c�digo basado en componentes. En la capa web, J2EE promueve el uso de JSPs para la creacci�n de contenido din�mico para los clientes web.
�Etiquetas Personalizadas y J2EE
J2EE tiene mucho que ofrecer a los desarrolladores de aplicaciones web y a los desarrolladores de etiquetas JSP personalizadas. Como hemos podido ver de la tabla anterior, tiene un rico conjunto de APIs est�ndars para enviar email, acceder a bases de datos, analizar documentos XML, etc. Nuestras aplicaciones Web pueden beneficiarse de etos APIs. Por ejemplo, podemos escribir una etiqueta JSP personalizada que env�e email que puede ser facilmente utilizada por desarrolladores de contenido web que no est�n familiarizados con Java. Si no est�s familiarizado con las etiquetas JSP personalizadas, sus beneficios y c�mo crerarlas, puedes volver a la p�gina anterior Desarrollar Etiquetas JSP Personalizadas.
�EJBs
Un EJB es un componente del lado del servidor que encapsula la l�gica del negocio de una aplicaci�n. En cualquier aplicaci�n, los beans enterprise implementan los m�todos de la l�gica del negocio, que pueden ser invocados por clientes remotos para acceder a los servicios importantes proporcionados por la aplicaci�n.
�Beneficios
Los EJBs simplifican el desarrollo de grandes aplicaciones empresariales seguras y distribuidas por las siguientes razones:
- Los desarrolladores pueden concentrarse en solventar la l�gica del negocio: el contenedor EJB proporciona servicos a nivel del sistema como el control de transaciones y las autorizaciones de seguridad. Por lo tanto, los desarrolladores no tienen que preocuparse de estos problemas.
- Clientes peque�os: Los desarrolladores no tienen que desarrollar c�digo para las reglas de negocio o accesos a bases de datos; pueden concentrarse en la presentaci�n del cliente. El resultado final es que los clientes son peque�os, y esto es especialmente importante para clientes que se ejecutan en peque�os dispositivos con recustos limitados.
- Desarrollo r�pido: Los EJBs son componentes portables, y por lo tanto los ensambladores de aplicaciones pueden construir nuevas aplicaciones desde beans existentes. Las aplicaciones resultantes se pueden ejecutar en cualquier servidor compatible J2EE.
�Componentes
Hay dos tipos principales de componentes EJB : session y entity. Un EJB de sesi�n se usa para realizar una tarea para un cliente, y un EJB de entidad es espec�fico del dominio y se usa para representar un objeto de entidad del negocio que existe en un almacenamiento persistente. Sin embargo, los beans de entidad y de sesi�n tienen algunas diferencias que podemos ver en la siguiente tabla:
EJB de Sesi�n | EJB de Entidad |
---|---|
Transitorio | Persistente |
Puede ser usado por un s�lo cliente. | Puede ser usadopor muchos clientes. |
No tiene identidad | Tiene una identidad (como una clave primaria) |
�Desarrollar EJBs
Para desarrollar EJBs, todo bean enterprise necesita:
- Un interface remoto que exponga los m�todos que soporta bean enterprise.
- Un interface home que proporciona los m�todos del ciclo de vida del bean enterprise.
- Una clase de implementaci�n, incluyendo la l�gica de negocio que necesite.
�EJBs contra Servlets
A primera vista, los EJBs y los Servlets son tecnolog�as similares porque ambos son componentes distribuidos del lado del servidor. Sin embargo, hay una diferencia importante entre los dos en el tipo de soluci�n que ofrecen; los EJBs no pueden aceptar peticiones HTTP. En otras palabras, los EJBs no peuden servir peticiones que vienen directamente desde un navegador Web, y los servlets si pueden. Servlets y JSPs se pueden usar para implementar presentaci�n y control web, pero al contrario que los EJBs, no pueden manejar transaciones distribuidas. Los EJBs pueden ser llamados desde cualquier cliente basado en Java.
��C�ando usar EJBs?
Los EJBs son buenos para las aplicaciones que tienen alguno de estos requerimientos:
- Escalabilidad: si tenemos un n�mero creciente de usuarios, los EJBs nos permitir�n distribuir los componentes de nuestra aplicaci�n entre varias m�quinas con su localizaci�n transparente para los usuarios.
- Integridad de Datos: los EJBs nos facilitan el uso de transaciones distribuidas.
- Variedad de clientes: si nuestra aplicaci�n va a ser accedida por una variedad de clientes (como navegadores tradicionales o navegadores WAP), se pueden usar los EJBs para almacenar el modelo del negocio, y se puede usar una variedad de clientes para acceder a la misma informaci�n.
�Describir y Referenciar Servicios J2EE
Ahora que hemos visto una introducci�n a J2EE y los EJBs, veremos c�mo referenciar, acceder y usar dichos servicios. Afortunadamente, la especificaci�n J2EE define una forma est�ndard para y usar sus sevicios. Los servicos J2EE pueden ser referenciados busc�ndolos de acuerdo a un nombre �nico en un directorio. Esta funcionalidad est� soportada por el "Java Naming and Directory Interface" o JNDI. Para que esto funcione, cada sistema compatible J2EE proporciona un servicio JNDI llamado un environment (entorno) que contiene:
- Variables de entorno
- Referencias a EJBs
- Referencias a Factor�as de Recursos
�Variables de Entorno
El entorno de nombrado de los componentes de la aplicaci�n permite que estos componentes sean personalizados sin tener que acceder o modificar el c�digo fuente de dichos componentes. Cada componente de la aplicaci�n define su propio conjunto de entrada de entorno. Todos los ejemplares de un componente de la aplicaci�n dentro del mismo contenedor comparten las mismas entradas. Es importante observar que no est� permitido que los ejemplares de los componentes de la aplicaci�n modifiquen su entorno durante la ejecuci�n.
Declarar Variables de Entorno
El proveedor de componentes de la aplicaci�n debe declarar todas las entradas de entorno accedidas desde el c�digo del componente de la aplicaci�n. Se declaran usando la etiqueta <env-entry> en el descriptor de despliegue (web.xml en Tomcat por ejemplo ). Los elementos de la etiqueta <env-entry> son:
- <description>: una descripci�n opcional de la entrada de entorno.
- <env-entry-name>: el nombre de la entrada de entorno.
- <env-entry-type>: el tipo de variable de entorno esperada. Puede ser uno de los siguientes tipos Java: Boolean, Byte, Double, Character, Float, Integer, Long, Short, String.
- <env-entry-value>: un valor para la entrada de entorno que debe corresponder con el tipo suministrado dentro de <env-entry-type>. Este valor puede modificarse posteriormente, pero si no se seecciona deber� especificarse durante el despliegue.
El c�digo del ejemplo 1 muestra una decalraci�n de dos entradas de entorno. Para especificar una declaraci�n de un nuevo entorno, simplemente los a�adimos a nuestro descriptor de apliaci�n Web (web.xml).
Ejemplo 1: Declarar variables de entorno
<env-entry> <description>welcome message</description> <env-entry-name>greetings</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>Welcome to the Inventory Control System</env-entry-value> </env-entry> <env-entry> <description>maximum number of products</descriptor> <env-entry-name>inventory/max</env-entry-name> <env-entry-type>java.lang.Integer</env-entry-type> <env-entry-value>27</env-entry-value> </env-entry>
Cada etiqueta <env-entry> describe una s�la entrada de entorno. Por eso, en este ejemplo, se han definido dos variables de entorno, la primera es una llamada greetings, que es del tipo String y tiene un valor inicial por defecto de: Welcome to the Inventory Control System. La segunda entrada se llama inventory/max, y es del tipo Integer y tiene un valor inicial por defecto de 27.
Ahora, un ejemplar de componente de aplicaci�n puede localizar la entrada de entorno usando JNDI. Crea un objeto javax.naming.InitialContext usando el constructor sin argumentos. Busca el entorno de nombrado a trav�s del InitialContext usando el URL JNDI que empieza con java:comp/env. El ejemplo 2 muestra c�mo un componente de aplicaci�n accede a sus entradas de entorno:
Ejemplo 2: Acceder a entradas de entorno
// obtain the application component's environment // naming context javax.naming.Context ctx = new javax.naming.InitialContext(); javax.naming.Context env = ctx.lookup("java:comp/env"); // obtain the greetings message //configured by the deployer String str = (String) env.lookup("greetings"); // use the greetings message System.out.println(greetings); // obtain the maximum number of products //configured by the deployer Integer maximum = (Integer) env.lookup("inventory/max"); //use the entry to customize business logic
Observamos que el componente de la aplicaci�n tambi�n podr�a usar las entradas de entorno usando los nombres de paths completos, de esta forma:
javax.naming.Context ctx = new javax.naming.InitialContext(); String str = (String) ctx.lookup("java:comp/env/greetings");
Este fragmento de c�digo se puede usar en un JSP como se v� en el Ejemplo 3:
ejemplo 3: Acceder a entradas de etorno desde un JSP
<HTML> <HEAD> <TITLE>JSP Example</TITLE> </HEAD> <BODY BGCOLOR="#ffffcc"> <CENTER> <H2>Inventory System</H2> <% javax.naming.Context ctx = new javax.naming.InitialContext(); javax.naming.Context myenv = (javax.naming.Context) t.lookup("java:comp/env"); java.lang.String s = (java.lang.String) myenv.lookup("greetings"); out.println("The value is: "+greetings); %> </CENTER> </BODY> </HTML>
Sin embargo, por �ltimo podr�as querer acceder a entradas de entorno desde una etiqueta personalizada. Para eso, desarrollar�amos una etiqueta personalizada o una librer�a de etiquetas que pudiera ser reutilizada sin tener que cortar y pegar el c�digo. Una librer�a personalizada puede ser f�cilmente desarrollada siguiendo los pasos descritos en la p�gina anterior Desarrollar Etiquetas JSP Personalizadas.
�Referencias EJB
Un proveedor de componentes de aplicaci�n puede referirse a los interfaces home EJB usando nombres l�gicos (llamados referencias EJB) en lugar de valores de registro JNDI. Estas son referencias espciales en el entorno de nombrado de los componentes de la aplicaci�n. Estas referencias permiten a las aplicaciones Web acceder a los EJBs de una forma personalizada.
Declarar Referencias EJB
Una referencia EJB es una entrada en el entorno del componente de la aplicaci�n. Sin embargo, no se debe usar <env-entry> para declararla. En su lugar, debemos declararla usando la etiqueta <ejb-ref> del descriptor de despliegue web. Los elementos de la etiqueta <ejb-ref> son:
- <description>: Una descripci�n opcional de la entrada de referencia EJB.
- <ejb-ref-name>: Un nombre �nico de referencia EJB.
- <ejb-ref-type>: Especifica el tipo esperado del EJB. El valor debe ser Session o Entity.
- <home>: Especifica el nombre completo de la clase del interface home del EJB.
- <remote>: Especifica el nombre completo de la clase del interface remoto del EJB.
El ejemplo 4 muestra una declaraci�n de una entrada de referencia EJB. Para especificar una declaraci�n de una nueva entrada, simplemente la a�adimos a nuestro descritor de aplicaci�n web (web.xml).
Ejemplo 4: Declarar una referencia EJB
<ejb-ref> <description>A reference to an entity bean to access employee records</description> <ejb-ref-name>ejb/EmployeeRecord</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <home>com.company.Employee.EmployeeRecordHome</home> <remote>com.company.Employee. EmployeeRecordRemote</remote> </ejb-ref>
Cada elemento <ejb-ref> describe una sola entrada de referencia EJB. Por lo tanto en este ejemplo, se ha definido una entrada que tiene el nombre ejb/EmployeeRecord del tipo Entity especificando que el interface home es com.company.Employee.EmployeeRecordHome y el interface remote es com.company.Employee.EmployeeRecordRemote.
Ahora, un ejemplar de componente de la aplicaci�n puede localizar la entrada de referencia EJB usando JNDI. Crea un objeto javax.naming.InitialContext usando el constructor sin argumentos. Luego busca el entorno de nombrado a trav�s del InitialContext usando el URL JNDI que empieza con java:comp/env/ejb. El ejemplo 5 muestra c�mo un componente de aplicaci�n obtiene el acceso a un EJB:
Ejemplo 5: Acceder a un Bean enterprise
// obtain the default JDNI context javax.naming.Context ctx = new javax.naming.InitialContext(); // look up the home interface Object obj = ctx.lookup( "java:comp/env/ejb/EmployeeRecord"); // Convert the object to a home interface EmployeeRecordHome = (EmployeeRecordHome) javax.rmi.PortableRemoteObject.narrow( object, EmployeeRecordHome.class);
Podemos usar un c�digo similar directamente en nuestros JSPs, o desarrollar una etiqueta personalizada para acceder y usar EJBs.
�Referencias a Factor�as de Recursos
Las referencias de factor�as de recursos permiten a las aplicaciones referirse a factor�as de conexiones, o a objetos que crean conexions a recursos deseados, usando nombres l�gicos como hemos visto en las dos secciones anteriores. Las referencias a factor�as de recursos de conexi�n pueden ser conexiones JDBC, conexiones JMS, conexiones de email, etc. Las URLs JNDI empiezan con: java:comp/env/jdbc, java:comp/env/jms, y java:comp/env/mail, respectivamente.
Declarar Referencias de Factor�as de Recursos
Una referencia a una factor�a de recursos es una entrada en el descritor de despliegue de una aplicaci�n web. Debe declararse usando la etiqueta <resource-ref>. Los elementos de esta etiqueta son:
- <description>: un descriptor opcional de la referencia a la factor�a de recursos.
- <res-ref-name>: contiene el nombre de la entrada de entorno.
- <res-ref-type>: especifica la factor�a de recursos utilizada. Algunas factor�as de recursos est�ndars de J2EE son: javax.sql.DataSource para factor�as de conexiones JDBC; javax.jms.QueueConnectionFactory y javax.jms.TopicConnectionFactory para conexiones JMS; y javax.mail.Session para factor�as de conexiones JavaMail.
- <res-auth>: especifica el tipo de autentificaci�n de recursos y c�mo se deber�a realizar. Por ejemplo, si se selecciona a Container, el contenedor hace la autentificaci�n usando propiedades configuradas durante el despliegue. Por otro lado, si se selecciona a Application, instruye al contenedor para permitir que la aplicaci�n autentifique program�ticamente.
El ejemplo 6 muestra una declaraci�n de una referencia de factor�a de recursos email. Para especificar una declaraci�n para una nueva entrada, simplemente la a�adimos a nuestro descriptor de aplicaci�n web (web.xml).
Ejemplo 6: Declarar una Referencia de Factor�a de Recursos
<res-ref> <description>email session reference factory</description> <res-ref-name>mail/mailsession</res-ref-name> <res-type>javax.mail.Session</res-type> <res-auth>Container</res-auth> </res-ref>
Cada elemento <res-ref> describe una s�la entrada de referencia a una factor�a de recursos. Por lo tanto, en este ejemplo se ha definido una entrada con el nombre mail/session del tipo javax.mail.Session seleccionando <res-auth> al Container.
Ahora, un ejemplar de componente de aplicaci�n puede obtener la entrada de referencia a la factor�a de recursos usando JNDI. Como con las otras entradas, crea un objeto javax.naming.InitialContext usando el constructor sin argumentos. Luego busca el entorno de nombrado a trav�s del InitialContext usando el URL JNDI para email que empieza con java:comp/env/mail. El ejemplo 7 muestra c�mo un componente de aplicaci�n obtiene una referencia a una factor�a de recursos para env�ar un mensaje de email:
Ejemplo 7: Obtener una Referencia a una factori�a de recursos y enviar un email.
// obtain the initial JNDI context javax.naming.Context ctx = new javax.naming.InitialContext(); // perform JNDI lookup to retrieve //the session instance javax.mail.Session session = (javax.mail.Session) ctx.lookup( "java:comp/env/mail/mailsession"); // create a new message and set the sender, // receiver, subject, and content of msg javax.mail.Message msg = new javax.mail.internet.MimeMessage(session); msg.setFrom("email address goes here"); msg.setRecipient( Message.RecipientType.TO, "to email address"); msg.setSubject("JavaMail Example"); msg.setContext( "write the content here", "text/plain"); // send message javax.mail.Transport.send(msg);
De nuevo, este c�digo puede usarse directamente en nuestros JSPs, o podemos desarrollar una librer�a de etiquetas personalizada para acceder y utilizar varias referencias a factor�as de recursos.
Como otro ejemplo, el ejemplo 8 muestra una declaraci�n de una factor�a de recursos de base de datos:
Ejemplo 8: Declarar una Factor�a de recursos para bases de datos
<res-ref> <description>database reference factory</description> <res-ref-name>jdbc/EmployeeDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </res-ref>
El ejemplo 9 muestra c�mo un componente de aplicaci�n obtiene una referencia a una factor�a de conexiones a bases de datos y la usa:
Ejemplo 9: Obtener una referencia a una factor�a de conexiones de bases de datos y utilizarla
// obtain the initial JNDI context javax.naming.Context ctx = new javax.naming.InitialContext(); // perform JDNI lookup to //obtain database connection factory javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/EmployeeDB"); // Invoke factory to obtain a resource javax.sql.Connectin conn = ds.getConnection(); // use the connection....
�Conclusi�n
J2EE ofrece muchos servicios que son importantes para las aplicaciones web. Estos servicios van desde la apertura de conexiones a bases de datos usando JDBC, hasta env�ar email, pasando por acceder y usar beans enterprise. Esta p�gina junto con los programas de ejemplo, nos ha mostrado c�mo acceder a los servicios J2EE desde dentro de JSPs. La incorporaci�n de EBJs dentro de nuestros JSPs puede hacerse f�cilmente, creando una soluci�n reutilizable mendiante el desarrollo de etiquetas personalizadas.
�Por qu� no accedemos a los servicios J2EE desde Servlets? Aunque es posible hacerlo, terminar�amos escribiendo mucho c�digo no reutilizable. Si deseamos usar servicios J2EE desde JSPs, desarrollar librer�as de etiquetas personalizadas proporciona una soluci�n reutilizable que incluso puede ser usada por desarrolladores de contenido que no tienen experiencia con Java.