EARS, WAR’s, EJB-JAR’s. (Parte 1)

EARS (“Enterprise Archives”) es una terminología utilizada para describir componentes en Application Servers, un EAR es simplemente un EJB con el respectivo cliente que interactúa con éste, la razón de su existencia se debe a la estructura de los diversos Application Servers.

Como fue mencionado al inicio de este curso, no existe una clara distinción entre los componentes de unApplication Server, esto seria el “EJB Container” y el “Servlet Container”, por esta razón se decidió crear el formato EAR (“Enterprise Archive”) el cual esta compuesto por un EJB-JAR y un “WAR(Web-Archive)”.

EJB-JAR’s

Un EJB-JAR es la agrupación de las interfases (“Home” y “Remote”), el “EJB Bean” y “Deployment Descriptor” con los que se ha trabajado en este curso, la estructura de este EJB-JAR es la siguiente:

  • / *.class : Bajo este directorio base se encuentran las diversas clases que conforman un EJB.
  • /META-INF/ejb-jar.xml : Este archivo contiene el denominado Deployment Descriptor utilizado en EJB’s.
  • /META-INF/* : Este directorio además del Deployment Descriptor puede contener otros archivos de configuración utilizados por el Application Server (“EJB Container” para ser más exacto).

WAR’s

“WAR(Web-Archive)” es el componente que interactúa con el EJB, hasta este punto solo se ha trabajado con Clientes de Terminal debido a su sencillez, sin embargo, en la gran mayoría de desarrollos con EJB’s se diseña un “WAR(Web-Archive)” que es un grupo de JSP(“Java Server Pages”)/Servlets, la estructura de un WAR es la siguiente:

  • / *.html *.jsp *.css : Este directorio base contiene los elementos que comúnmente son utilizados en un sitio, Documentos en HTML, JSP’s , CSS(“Cascading Style Sheets”) u otros elementos.
  • /WEB-INF/web.xml : Contiene elementos de seguridad de la aplicación así como detalles sobre los Servlets que serán utilizados dentro de la misma.
  • /WEB-INF/classes/ : Contiene las clases Java adicionales a las del JDK que son empleadas en los JSP’s y Servlets
  • /WEB-INF/lib/ : Contiene los JAR’s que serán utilizados por la aplicación.

Aunque el diseñar un WAR requiere entrar en detalles específicos de JSP’s y Servlets, a continuación será descrito uno con la intención de ilustrar el concepto de EAR’s:

  • EAR’s (“Enterprise Archives”), IDE’s y Deployment Descriptors.

A continuación se describen dos paginas empleadas para realizar una solicitud al “BMP Entity EJB” diseñado anteriormente; una de estas paginas se encuentra compuesta por una forma HTML, mientras la otra es un JSP (“Java Server Page”) que realiza la solicitud al EJB.

La ejecución de estas paginas será llevada acabo en un EAR (“Enterprise Archive”), previa incorporación en un WAR(“Web-Archive”); la estructuración de ambos archivos será descrito posteriormente.

Página index.htm

<HTML>
<BODY>
 

<H3 align="center"> Búsqueda de Cuentas Bancarias </H3> 
<H3 align="center"> a través de EJB's ("Enterprise Java Beans") </H3> 
<HR>
<FORM action="busqueda.jsp">

<TABLE align="center" border="3" cellspacing="5" cellpadding="5"> 
<TR><TH> Proporcione los siguientes Datos </TH></TR> 

<TR>
  <TD> Rango Inferior : 
     <SELECT name="rangoinf">
       <OPTION value="2000">$2,000.00</OPTION> 
       <OPTION value="4000">$4,000.00</OPTION>
       <OPTION value="6000">$6,000.00</OPTION> 
       <OPTION value="10000">$10,000.00</OPTION> 
       <OPTION value="20000">$20,000.00</OPTION> 
       <OPTION value="40000">$40,000.00</OPTION>  
       <OPTION value="60000">$60,000.00</OPTION>  
       <OPTION value="80000">$80,000.00</OPTION>  
       <OPTION value="100000">$100,000.00</OPTION>  
       <OPTION value="200000">$200,000.00</OPTION>  
     </SELECT> 
  </TD>
</TR>

<TR> 
  <TD> Rango Superior : 
     <SELECT name="rangosup">
       <OPTION value="2000">$2,000.00</OPTION> 
       <OPTION value="4000">$4,000.00</OPTION>
       <OPTION value="6000">$6,000.00</OPTION> 
       <OPTION value="10000">$10,000.00</OPTION> 
       <OPTION value="20000">$20,000.00</OPTION> 
       <OPTION value="40000">$40,000.00</OPTION>  
       <OPTION value="60000">$60,000.00</OPTION>  
       <OPTION value="80000">$80,000.00</OPTION>  
       <OPTION value="100000">$100,000.00</OPTION>  
       <OPTION value="200000">$200,000.00</OPTION>  
     </SELECT> 
  </TD>
</TR>

<TR>
  <TD align="center"> 
    <INPUT type="submit" value="Buscar"> 
    <INPUT type="reset" value="Reiniciar">
  </TD>
</TR> 

</TABLE>
</FORM>
</BODY>
</HTML>
  • Esta página simplemente contiene una forma HTML que solicita los rangos de búsqueda al usuario.
  • Una vez proporcionados los respectivos datos, la forma es procesada por el JSP busqueda.jsp(action="busqueda.jsp") descrito a continuación .

 Página busqueda.jsp

<HTML>
<BODY>
 

<%@ page language="java" import="javax.naming.*,javax.rmi.*,com.osmosislatina.ejb.cuenta.*,java.util.*"%>
<%
	double rangoinf = Double.parseDouble((String)request.getParameter("rangoinf"));
	double rangosup = Double.parseDouble((String)request.getParameter("rangosup"));
%>
<H3 align="center"> Resultados Búsqueda de Cuentas Bancarias </H3> 
<H3 align="center"> a través de EJB's ("Enterprise Java Beans") </H3> 
<HR/>
<UL>

<TABLE align="center" border="3" cellspacing="5" cellpadding="5">
<TR> 
  <TH>Nombre</TH> 
  <TH>Cuenta</TH> 
  <TH>Saldo</TH> 
</TR>
 

<%
  Properties env = new Properties();

              // Definir las propiededes y ubicacion de busqueda de Nombres JNDI.
              env.setProperty("java.naming.factory.initial",  "org.jnp.interfaces.NamingContextFactory");
              env.setProperty("java.naming.provider.url",  "localhost:1099");
              env.setProperty("java.naming.factory.url.pkgs",  "org.jboss.naming");
       try {

           Context initial = new InitialContext(env);
           Object objref = initial.lookup("BancoDeMexico");

           CuentaBancariaHome home = 
               (CuentaBancariaHome)PortableRemoteObject.narrow(objref, 
                                            CuentaBancariaHome.class);
           Collection c = home.findEnRango(rangoinf, rangosup);
           Iterator i=c.iterator();
           i=c.iterator();

           while (i.hasNext()) {
              CuentaBancaria cuenta = (CuentaBancaria)i.next();
              String id = (String)cuenta.getPrimaryKey();
              double balance = cuenta.getSaldo(); 
	      String nombre = (String)cuenta.getNombre();
	      String apellido = (String)cuenta.getApellido();
%>
<TR>
  <TD align=center><%=nombre%> <%=apellido%></TD>
  <TD align=center><%=id%></TD>
  <TD align=center><%=balance%></TD>
</TR>
 
<%
   }
       } catch (Exception ex) {
           System.err.println("Ocurrio una excepcion." );
           ex.printStackTrace();

%>
     <H3> Ocurrio un error al comunicarse con el EJB-Engine </H3> 
     <H3> <%=ex.toString()%> </H3>
 
<%
       }

%>
</TABLE>
</UL>

<HR>

</BODY>
</HTML>

 

  • En la parte inicial de esta página se importan las librerias (“packages”) que serán utilizadas en el JSP; la libreria (“packages”) javax.naming es utilizada para realizar busquedas JNDI, java.rmi representa las Clases para llamadas remotas (RMI) asociadas con la comunicación del EJB,com.osmosislatina.ejb.cuenta son las clases del EJB empleadas como “Stubs” y java.util contiene clases auxilares para programas Java.
  • Posteriormente se extraen los valores de la forma HTML a través del objeto request los cuales son asignados a sus respectivas variables y convertidos al tipo Double; la conversión se debe a que el metodo del EJB esta diseñado con estos parametros de entrada .
  • Es definido un fragmento HTML que inicia la definición de una tabla HTML en donde serán colocados los resultados de la búsqueda.
  • Posteriormente se definen las propiedades del directorio para nombramientos JNDI, en este caso se indica el Directorio de nombres que reside en la maquina local (localhost) utilizando el puerto TCP 1099, este directorio JNDI es ejecutado automaticamente al iniciar JBoss y es el que otorga servicios de nombramiento a los EJB’s.
  • Una vez inicializado el Contexto JNDI y dentro del bloque try/catch se realiza una búsqueda para el componente llamado BancoDeMexico, y posteriormente se trae una referencia del “Home Interface”, seguido se invoca la función findEnRango del Objeto con los datos proporcionados por el usuario.
  • Los resultados de la invocación anterior son colocados dentro de un Objeto Collection y posteriormente se genera un ciclo para extraer sus valores.
  • En cada iteración de ciclo se genera un renglón HTML con los resultados correspondientes.
  • Se define la sección catch del bloque, donde se imprime a pantalla un posible error no contemplado en la búsqueda.
  • NOTA : El diseño de este JSP se realizó de esta manera por razones didacticas, este tipo de invocaciones hacia EJB’s generalmente se debe realizar con un diseño apegado al paradigma “MVC” (“Model-View-Controller”) que permite una división efectiva entre el despliegue gráfico (HTML) y lógica de negocios (Invocación EJB). Este tema es descrito a detalle en Patrones de Diseño para EJB’s

NAPSTER2011

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s