|
Buscador
Secciones
Otras zonas
Foros
Ganamos
Registro
|
Inicio > Tutoriales > Lenguajes orientados a objeto > Java y XML > Desarrollo de Aplicaciones Web con JSP y XML
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.
|
| 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 EJBsPara desarrollar EJBs, todo bean enterprise necesita:
EJBs contra ServletsA 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:
Describir y Referenciar Servicios J2EEAhora 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 EntornoEl 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:
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 EJBUn 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:
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 RecursosLas 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:
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ónJ2EE 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.
| Leer comentarios (95) | |
| Escribir comentario | |
| Puntuación: |
|
| Votar | |
| Recomendar este tutorial | |
| Estadísticas |
Copyright © 1999-2007
Programación en castellano.
Todos los derechos reservados.
Formulario de Contacto -
Datos legales -
Publicidad
Mantenida por: Claudio y
Dani.
Hospedaje web y servidores dedicados linux por Ferca Network
red internet: jugar gratis | amor | navidad 2009 | registro de dominios |
servidores dedicados
más internet: comprar | gratis | posicionamiento en buscadores | decoración libre | gifs animados