tutorjava j2ee

95
 Java 2 Enterprise Edition [TutorJava] [Siguiente >>] Este tutorial presenta los APIs, las herramientas y los servicios que proporciona la Implementació n de Referencia de Java TM  2 Enterprise Edition (J2EE TM ). Podemos obtener la implementación de referencia J2EE como descarga gratuita para demostraciones, prototipos y uso educacional. Para soportar estos usos, la Implementación de Referencia viene con herramientas de desarrollo y despliegue J2EE, Java WebServer TM , base de datos Cloudscape, servidor de aplicaciones Java Software, soporte de Extensible Markup Language (XML), y los APIs J2EE. Índice de Contenidos Un Sencillo Bean de Sesión Un Sencillo Bean de Entidad Comunicaciones entre Beans Enterprise JavaServer Pages Añadir Tecnologia JavaBeans a la Mezcla XML (Extensible Markup Langauge) Tecnología JDBC y Persistencia Controlada por el Bean [TutorJava] [Siguiente >>] J2EE http://usuarios.tripod.es/Ozito/j2ee/index.html [18/03/2001 23:30:26]

Upload: miguel-angel-j

Post on 14-Jul-2015

154 views

Category:

Documents


0 download

TRANSCRIPT

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 1/95

Java 2 Enterprise Edition

[TutorJava] [Siguiente >>]

Este tutorial presenta los APIs, las herramientas y los servicios que proporciona laImplementación de Referencia de JavaTM 2 Enterprise Edition (J2EETM).

Podemos obtener la implementación de referencia J2EE como descarga gratuita parademostraciones, prototipos y uso educacional.

Para soportar estos usos, la Implementación de Referencia viene con herramientas dedesarrollo y despliegue J2EE, Java WebServerTM, base de datos Cloudscape, servidor deaplicaciones Java Software, soporte de Extensible Markup Language (XML), y los APIs

J2EE.

Índice de ContenidosUn Sencillo Bean de Sesiónq

Un Sencillo Bean de Entidadq

Comunicaciones entre Beans Enterpriseq

JavaServer Pagesq

Añadir Tecnologia JavaBeans a la Mezclaq

XML (Extensible Markup Langauge)q

Tecnología JDBC y Persistencia Controlada por el Beanq

[TutorJava] [Siguiente >>]

J2EE

http://usuarios.tripod.es/Ozito/j2ee/index.html [18/03/2001 23:30:26]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 2/95

Java 2 Enterprise Edition

[<< Inicio] [Siguiente >>]

Un Sencillo Bean de SesiónEsta lección nos presenta la programación de aplicaciones J2EE, y el SDK J2EEmostrándonos como escribir una sencilla y pequeña aplicación Enterprise multi-capa queconsiste en una página HTML, un servlet y un Bean de sesión.

El SDK J2EE es una definición y especificación operacional no comercial de la plataformaJ2EE que Sun Microsystem a liberado para demostraciones, prototipos y usoseducacionales. Viene con el servidor de aplicaciones J2EE, servidor Web, base de datos,los APIs J2EE, y un completo conjunto de herramientas de desarrollo. Nos iremosencontrando con estas características y herramientas según vayamos avanzando en estetutorial.

Ejemplo de Aplicación Cliente Multi-Capaq

Software y Configuración J2EEq

Selecciones de Path y ClassPathq

Componentes de Aplicación J2EEq

Crear la Página HTMLq

Crear el Servletq

Crear le Bean de Sesiónq

Compilar el Bean de Sesión y el Servletq

Arrancar el Servidor de Aplicaciones J2EEq

Arrancar la Herramienta Deployq

La Herramienta Deployq

Ensamblar la Aplicación J2EEq

Verificar y Desplegar la Aplicación J2EEq

Ejecutar la Aplicación J2EEq

Actualizar el Código de Componenteq

Código fuente de los ejemplos de la lecciónq

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (1 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 3/95

Ejemplo de Aplicación Cliente Multi-CapaLa pequeña aplicación cliente de ejemplo de esta lección acepta entrada de usuario através de un formulario HTML que invoca un servlet. El servlet usa el API JNDI (JavaNaming and Directory Interface™) para buscar un Bean de sesión que realice los cálculospor él.

Este ejemplo es una aplicación pequeña porque el servlet no ejecuta ninguna lógica de

negocio. El sencillo cálculo lo realiza un Bean de sesión que se ejecuta en el servidor deaplicaciones J2EE. Por eso el cliente es pequeño, porque no maneja el proceso; lo haceel Bean de sesión.

Las aplicaciones multi-capa pueden consistir en 3 ó 4 capas. Como se ve en la Figura 1,el ejemplo multi-capa para este tutorial tiene cuatro capas. La arquitectura de tres capasextiende al cliente estándar de dos capas y el modelo del servidor situando un servidorde aplicaciones multi-capa entre la aplicación cliente no-basada-en-web y la base dedatos final. La arquitectura de cuatro capas extiende el modelo de tres capasreemplazando la aplicación cliente con un navegador Web y una página HTML potenciadacon las tecnologías servlet/JavaServer Pages™.

Arquitectura Multi-Capa

Mientras que esta lección usa sólo tres o cuatro capas, la siguiente lección extiende estemismo ejemplo para acceder al servidor de base de datos en el cuarta capa. Leccionesposteriores adaptan el ejemplo para usar las tecnologías JavaServer™ Pages y ExtensibleMarkup Language (XML).

Software J2EE y ConfiguraciónPara ejecutar los ejemplos del tutorial, necesitas descargar e instalar el SDK Java 2Enterprise Edition (J2EE), Versión 1.2.1 (http://java.sun.com/j2ee/download.html), ySDK Java 2, Standard Edition (J2SE), Versión 1.2 o posterior

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (2 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 4/95

(http://java.sun.com/jdk/index.html).

Las instrucciones de este tutorial asumen que J2EE y J2SE están instalados en eldirectorio J2EE debajo del directorio home del usuario.

Nota:Siempre que se utilice monicap en un nombre de path, tendrás quecambiarlo por tu nombre de usuario.

Unix:/home/monicap/J2EE/j2sdkee1.2.1

/home/monicap/J2EE/jdk1.2.2

Windows:

 

\home\monicap\J2EE\j2sdkee1.2.1

\home\monicap\J2EE\jdk1.2.2

Configuración del Path y ClassPathLa descarga contiene el servidor de aplicaciones J2EE, la base de datos Cloudscape, unservidor Web que usa capas de socket seguras (SSL) también conocido como HTTP sobreHTTPS, herramientas de desarrollo y despliegue, y los APIs Java para Enterprise. Parausar estar características, debemos configurar las variables de entorno path yclasspath como se describe aquí:

Configuración del PathLa configuración del Path hacen accesibles las herramientas de desarrollo y desplieguedesde cualquier lugar de nuestro sistema. Debemos asegurarnos de seleccionar estospath antes de cualquier otro path que pudiéramos tener de viejas instalaciones del JDK.

Unix:

/home/monicap/J2EE/jdk1.2.2/bin

/home/monicap/J2EE/j2sdkee1.2.1/bin

Windows:

\home\monicap\J2EE\jdk1.2.2\bin

\home\monicap\J2EE\j2sdkee1.2.1\bin

Configuración del ClassPath

La configuración del ClassPath le dice a las herramientas de desarrollo y despliegue deJava 2 dónde encontrar las distintas librerías de clases que usa:

Unix:/home/monicap/J2EE/j2sdkee1.2.1/lib/j2ee.jar

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (3 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 5/95

Windows:

\home\monicap\J2EE\j2sdkee1.2.1\lib\j2ee.jar

Componentes de Aplicación J2EELos programadores de aplicaciones J2EE escriben componentes de aplicación J2EE. Un

componente J2EE es una unidad de software funcional auto-contenida que se ensambladentro de una aplicación J2EE y que se comunica con otros componentes de aplicación.La especificación J2EE define los siguientes componentes de aplicación:

Componentes de Aplicación Clienteq

Componentes JavaBeans Enterpriseq

Componentes Servlets y JavaServer Pages (también llamados componentes Web)q

Appletsq

En esta lección, crearemos una aplicación y dos componentes J2EE: un servlet y un Beande sesión. El servlet está empaquetado con su fichero HTML en un fichero Web Archive

(WAR), y las clases e interfaces del Bean de sesión están empaquetadas en un ficheroJAR. Los ficheros WAR y JAR se añaden a la aplicación J2EE y se empaquetan dentro deun fichero Enterprise Archive (EAR) para probar, verificar y desplegar el entorno deproducción.

Mientras estemos haciendo todos estos pasos para esta lección, realmente estaremosrealizando varias funciones diferentes. Escribir el código del servlet y del Bean de sesiónes una función de desarrollo, mientras que crear la aplicación J2EE y añadir loscomponentes J2EE a una aplicación es una función de ensamblaje. En realidad, estasfunciones podrían ser realizadas por diferentes personas de diferentes compañías.

Crear la Página HTMLLa página HTML para esta lección se llama bonus.html. Su código HTML está debajo de laFigura 2, que muestra cómo vería la página HTML el usuario. El fichero bonus.html tienedos campos de datos en los que usuario puede introducir un número de seguridad socialy un multiplicador. Cuando el usuario pulsa el botón Submit, BonusServlet.javarecupera el dato del usuario, busca el Bean de sesión, y le pasa el dato del usuario alBean de sesión. el Bean de sesión calcula un valor "bonus" y lo devuelve al servlet. Elservlet devuelve otra página HTML con el valor del "bonus" para que lo vea el usuario.

Página HTML

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (4 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 6/95

La Figura 3 muestra el flujo de los datos entre el navegador y el Bean de sesión. El Beande sesión se ejecuta en el servidor de aplicaciones J2EE.

Flujo de Datos

Código HTML

Lo más interesante sobre el código del formulario HTML es el alias usado para invocar aBonusServlet . Cuando el usuario pulsa el botón Submit sobre el formulario HTML, sellama a BonusServlet porque se ha mapeado a BonusAlias durante el ensamblaje dela aplicación descrito en Ensamblar la Aplicación J2EE.

El ejemplo asume que bonus.html está en el directorio / home/ monicap/ J2EE/ ClientCode en UNIX. Aquí y desde ahora los usuarios deWindows pueden invertir las barras inclinadas para obtener los paths correctos para suplataforma:

<HTML>

<BODY BGCOLOR = "WHITE">

<BLOCKQUOTE>

<H3>Bonus Calculation</H3>

<FORM METHOD="GET" ACTION="BonusAlias">

<P>Enter social security Number:

<P>

<INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT>

<P>

Enter Multiplier:

<P>

<INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>

<P>

<INPUT TYPE="SUBMIT" VALUE="Submit">

<INPUT TYPE="RESET">

</FORM></BLOCKQUOTE>

</BODY>

</HTML>

Crear el ServletEl ejemplo asume que el fichero BonusServlet.java está en el directorio / home/ monicap/ J2EE/ ClientCode en UNIX. Durante la ejecución, el código delservlet hace lo siguiente:

Recupera los datos del usuarioq

Busca el bean de sesiónq

Le pasa los datos al bean de sesiónq

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (5 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 7/95

Después de recibir un valor de vuelta desde el bean de sesión, crea una páginaHTML para mostrar el valor devuelto al usuario.

q

La siguiente sección describe las diferentes partes del código del servlet. Aquí puedes verel código del Servlet completo.

Sentencias Import

El código del servlet empieza con sentencias import para los siguientes paquetes: javax.servlet, que contiene clases servlets genéricas (independientes delprotocolo). La clase HTTPServlet usa la clase ServletException de este paquetepara indicar un problema en el servlet.

q

 javax.servlet.http, que contiene clases servelts HTTP. La clase HttpServlet estáen este paquete.

q

 java.io para entrada y salida del sistema. La clase HttpServlet usa la claseIOException de este paquete para señalar que se ha producido una excepción dealgún tipo de entrada o salida.

q

 javax.naming para poder usar los APIs Java Naming and Directory Interface

(JNDI™) para buscar el interface home del bean de sesión.

q

 javax.rmi para buscar el interface home del bean de sesión y poner su objetoservidor remoto listo para las comunicaciones.

q

Método init()

El método BonusServlet.init busca el interface home del bean de sesión y crea suejemplar. El método usa el nombre JNDI especificado durante el ensamblado decomponentes (calcs) para obtener una referencia al interface home por su nombre. Lasiguiente línea pasa la referencia y la clase del interface home al método

PortableRemoteObject.narrow para asegurarse de que la referencia puede forzarse altipo CalcHome.

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("calcs");

homecalc = (CalcHome)PortableRemoteObject.narrow(obj ref, CalcHome.class);

Método doGet

La lista de parámetros de doGet toma un objeto request y un response. El navegadorenvía una petición (request) al servlet y el servlet envía una respuesta (response) devuelta al navegador. La implementación del método accede a información del objetorequest para encontrar quién ha hecho la petición, en qué formulario están los datos dela petición, y que cabeceras HTTP se enviarón, y usa el objeto response para crear unapágina HTML en respuesta a la petición del navegador.

El método doGet lanza una IOException si hay algún problema con los datos deentrada o salida cuando maneja la petición, y una ServletException si la petición no sepuede manejar. Para calcular el valor del bonus, el método doGet crea el interface homey llama al método calcBonus.

public void doGet (HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

String socsec = null;int multiplier = 0;

double calc = 0.0;

PrintWriter out;

response.setContentType("text/html");

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (6 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 8/95

String title = "EJB Example";

out = response.getWriter();

out.println("<HTML><HEAD><TITLE>")

out.println(title);

out.println("</TITLE></HEAD><BODY>");

try{

//Retrieve Bonus and Social Security Information

String strMult = request.getParameter(

"MULTIPLIER");Integer integerMult = new Integer(strMult);

multiplier = integerMult.intValue();

socsec = request.getParameter("SOCSEC");

//Calculate bonus

double bonus = 100.00;

theCalculation = homecalc.create();

calc = theCalculation.calcBonus(

multiplier, bonus);

}catch(Exception CreateException){

CreateException.printStackTrace();

}

//Display Data

out.println("<H1>Bonus Calculation</H1>");

out.println("<P>Soc Sec: " + socsec + "<P>");

out.println("<P>Multiplier: " +

multiplier + "<P>");

out.println("<P>Bonus Amount: " + calc + "<P>");

out.println("</BODY></HTML>");

out.close();

}

Código del ServletAquí está el código completo:

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import javax.naming.*;

import javax.rmi.PortableRemoteObject;

import Beans.*;

public class BonusServlet extends HttpServlet {

CalcHome homecalc;

public void init(ServletConfig config)

throws ServletException{

//Look up home interface

try{

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("calcs");homecalc =

(CalcHome)PortableRemoteObject.narrow(

objref,

CalcHome.class);

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (7 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 9/95

} catch (Exception NamingException) {

NamingException.printStackTrace();

}

}

public void doGet (HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

String socsec = null;

int multiplier = 0;

double calc = 0.0;PrintWriter out;

response.setContentType("text/html");

String title = "EJB Example";

out = response.getWriter();

out.println("<HTML><HEAD><TITLE>");

out.println(title);

out.println("</TITLE></HEAD><BODY>");

try{

Calc theCalculation;

//Get Multiplier and Social Security Information

String strMult =

request.getParameter("MULTIPLIER");

Integer integerMult = new Integer(strMult);

multiplier = integerMult.intValue();

socsec = request.getParameter("SOCSEC");

//Calculate bonus

double bonus = 100.00;

theCalculation = homecalc.create();

calc =

theCalculation.calcBonus(multiplier, bonus);

} catch(Exception CreateException){

CreateException.printStackTrace();

}//Display Data

out.println("<H1>Bonus Calculation</H1>");

out.println("<P>Soc Sec: " + socsec + "<P>");

out.println("<P>Multiplier: " +

multiplier + "<P>");

out.println("<P>Bonus Amount: " + calc + "<P>");

out.println("</BODY></HTML>");

out.close();

}

public void destroy() {

System.out.println("Destroy");

}

}

Crear el Bean de SessionUn bean de sesión representa una conversación temporal con un cliente. Si el servidor oel cliente, se cuelgan, el bean de sesión y sus datos se van. En contraste, los beans deentidad son persistentes y representan datos en una base de datos. Si el servidor o elcliente se bloquean, los servicios relacionados aseguran que los datos del bean de

entidad se graban.La Figura 4 muestra como funcionan el servlet y el bean de sesión como una aplicaciónJ2EE completa una vez que se han ensamblado y desplegado. El contenedor, mostradoen la caja sombreada, es el interface entre el bean de sesión y las funcionalidades

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (8 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 10/95

especificas de la plataforma de bajo-nivel que soporta el bean de sesión. El contenedorse crea durante el despliegue.

Componentes de Aplicación

La siguiente sección muestra el código del bean de sesión. El ejemplo asume que losficheros CalcBean.java , Calc.java , y CalcHome.java están situados en el directorio

 / home/ monicap/ J2EE/ Beans. La sentencia package Beans en la parte superior delinterface CalcBean y los ficheros de clases es el mismo nombre que el nombre de estedirectorio. Cuando se compilen estos ficheros, se hara desde el directorio superior Beansy el nombre del paquete Beans (o directorio) se pretende que apunte al interface y losficheros class compilados. Compilar el Bean de Sesión.

Nota: Este ejemplo muestra cómo escribir un bean de sesión, perotambién es posible comprar beans enterprise a un proveedor yensamblarlos dentro de una aplicación J2EE.

CalcHome

BonusServlet no trabaja directamente con el bean de sesión, sino que crea un ejemplarde su interface home. El interface home extiende EJBHome y tiene un método createpara crear el bean de sesión en su contendor. Se lanzará una CreateException si no sepuede crear el bean de sesión y una RemoteException si ocurre una excepciónrelacionada con las comunicaciones durante la ejecución del método remoto.

package Beans;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;

public interface CalcHome extends EJBHome {

Calc create() throws CreateException,

RemoteException;

}

Calc

Cuando se crea el interface home, el servidor de aplicaciones J2EE crea el interfaceremoto y el bean de sesión. El interface remoto extiende EJBObject declara el métodocalcBonus para el cálculo del valor del bonos. Este método requiere que se lance unaavax.rmi.RemoteException , y está implementado por la clase CalcBean.

package Beans;

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (9 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 11/95

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

public interface Calc extends EJBObject {

public double calcBonus(int multiplier,

double bonus)

throws RemoteException;

}

CalcBean

La clase del bean de sesión implementa el interface SessionBean y proporciona elcomportamiento para el método calcBonus. Los métodos setSessionContext yejbCreate son llamados en este orden por el contendor después de que BonusServletllame al método create CalcHome.

Los métodos vacíos son del inteface SessionBean. Estos métodos los llama elcontenedor del bean. No tenemos que proporcionar comportamiento para estos métodosa menos que necesitemos funcionalidades adicionales, por ejemplo cuando el bean es

añadido o eliminado de su contenedor.

package Beans;

import java.rmi.RemoteException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

public class CalcBean implements SessionBean {

public double calcBonus(int multiplier,

double bonus) {

double calc = (multiplier*bonus);return calc;

}

//These methods are described in more

//detail in Lesson 2

public void ejbCreate() { }

public void setSessionContext(

SessionContext ctx) { }

public void ejbRemove() { }

public void ejbActivate() { }

public void ejbPassivate() { }

public void ejbLoad() { }

public void ejbStore() { }

}

Compilar el Bean de Sesión y el ServletPara ahorrarnos tecleado, la forma más sencilla para compilar el bean de sesión y elservlet es con un script (en Unix) o un fichero batch (en Windows).

Compilar el Bean de Session

Unix

#!/bin/sh

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (10 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 12/95

cd /home/monicap/J2EE

J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1

CPATH=.:$J2EE_HOME/lib/j2ee.jar

javac -d . -classpath "$CPATH" Beans/CalcBean.java

Beans/CalcHome.java Beans/Calc.java

Windows

cd \home\monicap\J2EE

set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1set CPATH=.;%J2EE_HOME%\lib\j2ee.jar

javac -d . -classpath %CPATH% Beans/CalcBean.java

Beans/CalcHome.java Beans/Calc.java

Compilar el Servlet

Unix

#!/bin/sh

cd /home/monicap/J2EE/ClientCodeJ2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1

CPATH=.:$J2EE_HOME/lib/j2ee.jar:

/home/monicap/J2EE

javac -d . -classpath "$CPATH" BonusServlet.java

Windows

cd \home\monicap\J2EE\ClientCode

set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2

set CPATH=.;%J2EE_HOME%\lib\j2ee.jar;

\home\monicap\J2EEjavac -d . -classpath %CPATH% BonusServlet.java

Arrancar el Servidor de Aplicaciones J2EENecesitamos arrancar el servidor de aplicaciones J2EE para desplegar y ejecutar elejemplo. El comando para arrancar el servidor está en el directorio bin debajo denuestra instalación J2EE. Si tenemos el path configurado para que lea el directorio bin,vamos directamente al directorio J2EE (entonces nuestra versión real corresponde con loque veremos en el texto) y tecleamos:

j2ee -verbose

Nota:Algunas veces el servidor J2EE no arranca si estámos ejecutandoOutlook

 ;

Si esto no funciona, tecleamos lo siguiente desde el directorio J2EE:

Unix:

j2sdkee1.2.1/bin/j2ee -verbose

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (11 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 13/95

Windows:

j2sdkee1.2.1\bin\j2ee -verbose

La opción verbose imprime mensajes de información en la línea de comandos cuando elservidor arranca. Cuando veamos J2EE server startup complete , podemos arrancarla herramienta de despliegue. Por ahora, podemos ignorar los otros mensajes queaparecen.

Arrancar la Herramienta DeployToolPara ensamblar y desplegar la aplicación J2EE, tenemos que arrancar la herramientadeploytool. Si tenemos el path configurado para que lea el directorio bin, vamosdirectamente al directorio J2EE (entonces nuestra versión real corresponde con lo queveremos en el texto) y tecleamos:

deploytool

Si esto no funciona, hacemos lo siguiente desde el directorio J2EE:

Unix:

j2sdkee1.2.1/bin/deploytool

Windows:

j2sdkee1.2.1\bin\deploytool

Notas:Si ocurre un error de acceso a memoria mientras arrancamosdeploytool , añadimos una variable de entorno llamadaJAVA_FONTS y seleccionamos el path a c: \ <font directory> . Porejemplo c:\ w innt\ fonts. También, si se encuentra unaNullPointerException para BasicFileChooserUI cuando se arrancadeploytool, debemos asegurarnos de no arrancar la herramientadesde el directorio raíz (es decir c:\  ). Si la ejecutamos desdecualquier otro lugar, como el directorio bin de nuestra instalación j2sdkee1.2, no encontraremos este problema.

DeployToolEl herramienta DeployTool mostrada en la Figura 5 tiene cuatro ventanas principales. Laventana "Local Aplications" muestra las aplicaciones J2EE y sus componentes. Laventana "Inspecting" muestra información sobre la aplicación o componentesseleccionados. La ventana "Servers" nos dice si el servidor de aplicaciones se estáejecutando en un host local. Y la ventana "Server Aplications" nos dice qué aplicacionestenemos instaladas. Cuando sigamos los pasos para ensamblar la aplicación de ejemploJ2EE, veremos que todas estas ventanas nos muestran información.

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (12 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 14/95

DeployTool

 

Nota:a la derecha de la ventana Server Applications hay un botón grisUninstall. Después de desplegar la aplicación, veremos la aplicaciónlistada en esta ventana. Podemos pulsar sobre Uninstall paradesinstalarla, hacerle cambios, y reinstalarla sin tener que parar yrearrancar el servidor de aplicaciones.

Ensamblar la Aplicación J2EEEnsamblar una aplicación J2EE implica crear una nueva aplicación, y añadirle loscomponentes de aplicación. Aquí tenemos un sumario de los pasos para ensamblar, quese describen abajo con más detalle.

Crear una nueva aplicación J2EE (BonusApp.ear).1.

Crear un nuevo bean enterprise (CalcBean.jar).2.

Crear un nuevo componente web (Bonus.war).3.

Especificar un nombre JNDI para el bean enterprise (calcs).4.Especificar el contexto raíz para la aplicación J2EE (BonusRoot ).5.

Ejecutar la aplicación J2EE

Los componentes J2EE se ensamblan dentro de ficheros (EAR) "Enterprise Archive".

Menu File : Seleccionamos New Application .

Caja de diálogo New Application:

Tecleamos BonusApp.ear para el Application File Name.q

Pulsamos el botón derecho del ratón en el campo Application Display Name.BonusApp aparece en el nombre.

q

Pulsamos el botón Browse para abrir el selector de ficheros para seleccionar laq

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (13 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 15/95

localización donde queremos grabar el fichero EAR

Selector de Ficheros New Application:

Localizamos el directorio donde queremos situar el fichero EAR de la aplicación.q

En este ejemplo, este directorio es / home/ monicap/ J2EE .q

En el campo File name, tecleamos BonusApp.ear.q

Pulsamos sobre New Application .q

Pulsamos sobre OK .q

En la ventana de Local Applications ahora aparecerá "Bonusapp.ear", y en la ventanaInspector a la derecha muestyra el nombre, la localización y la información decontenidos para BonusApp . La meta información mostrada en la ventrana contentsdescribe el fichero JAR y la aplicación J2EE, y prorporciona información de tiempo deejecución sobre la aplicación.

Crear el Bean de Sesión

Los beans Enterprise (tanto de entidad como de sesión) se empaquetan en un fichero

JAR.Menú File: Seleccionamos New Enterprise Bean. Arrancará el New Enterprise BeanWizard y mostrará un diágolo de introducción que sumariza los pasos que vamos atomar. Después de leerlos, pulsamos sobre Next .

Caja de Diálogo EJB JAR: Especificamos la siguiente información:

Enterprise Bean will go in : BonusAppDisplay name: CalcJarDescription: Un sencillo Bean de sesión que calcula un bonus y tiene un método.

q

Pulsamos sobre Add. Hay dos botones en esta pantalla. No aseguramos de pulsar

el segundo que está cerca de la ventana Contents.

q

Caja de Diálogo Add Files to .JAR: vamos al directorio J2EE. Podemos teclear elnombre del path o usar el navegador para obetenerlo. Una vez en el directorio J2EE,hacemos doble click sobre beans para mostrar el contenido del directorio beans.

Selecionamos Calc.class .q

Pulsamos sobre Add .q

Seleccionamos CalcHome.class .q

Pulsamos sobre Add .q

Seleccionamos CalcBean.class .q

Pulsamos sobre Add .q

Nota Importante:La caja de diálogo Add Contents to .JAR se debería parecer a la dela Figura 6. Las clases Enterprise Bean JAR se deberían mostrar conel prefijo del nombre de directorio Beans.

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (14 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 16/95

Seleccionar los Ficheros de las Clases Beans de Sesión

Pulsamos OK . Ahora deberíamos estar de nuevo en la caja de diálogo EJB JAR.Beans/ Calc.class , Beans/ CalcHome.class, y Beans/ CalcBean.classdeberían aparecer en la ventana Contents.

q

Pulsamos Next.q

Caja de diálogo General: Seleccionamos la siguiente información:

classname: Beans.CalcBeanHome interface: Beans.CalcHomeRemote interface: Beans.CalcBean type: Session y Stateless

q

Especificamos el nombre (el nombre que aparece cuando el fichero JAR se añade aBonusApp en la ventana de "Local Applications"), y proporcionamos unadescripción para los contenidos del ficheros JAR.

q

Display Name: CalcBeanq

Description: Este fichero JAR contiene el bean de sesión CalcBean.q

Pulsamos sobre Next .q

Caja de Diálogo Environment Entries: Este ejemplo no hace uso de las propiedades(entradas de entorno) pero nosotros si podríamos:

Pulsamos sobre Finish .q

Verificar que el fichero JAR se añadido realmente a la aplicación J2EE:

Vamos a la ventana "Local Applications"q

Pulsamos el gráfico gris en frente de BonusApp . Veremos el fichero JAR CalcJar.q

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (15 de 22) [18/03/2001 23:32:34]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 17/95

Pulsamos el gráfico gris en frente de CalcJar para ver el bean de sesión CalcBean.q

Crear Componentes Web

Los componentes Web (servlets, o JavaServer Pages™) se empaquetan dentro de unfichero Web Archive (WAR).

Menú File : Seleccionamos New Web Component . Se arrancará el New WebComponent Wizard y mostrará una ventana que sumariza los pasos que vamos atomar. Después de leerlos, pulsamos sobre Next .

Caja de diálogo WAR File General Properties : Proporcionamos la siguienteinformación:

WAR file: BonusAppDisplay name: BonusWarDescription: Este fichero war contiene un servlet y una página HTML

q

Pulsamos Add .q

Caja de Diálogo Add Contents to WAR:

Vamos el directorio ClientCode tecleando ClientCode después de J2EE en elcampo Root Directory.q

Seleccioamos bonus.html. Debemos asegurarnos de que WAR contents muestrael listado como bonus.html sin el directorio ClientCode precediendo al nombre.

q

Pulsamos sobre Add .q

Nota:Debemos asegurarnos de añadir bonus.html antes de añadirBonusServlet.class

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (16 de 22) [18/03/2001 23:32:35]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 18/95

Añadir la clase BonusServlet.class

Pulsamos sobre Next .q

Elegimos de nuevo el directorio ClientCode.q

Seleccionamos BonusServlet.class. Debemos asegurarnos de que WARcontents muestra el nombre de BonusServlet.class sin el directorio precediendo elnombre.

q

Pulsamos sobre Add .q

Caja de Diágolo Contents to WAR: La pantalla se debería parecer a la de la Figura 8.

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (17 de 22) [18/03/2001 23:32:35]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 19/95

añadir bonus.html

Pulsamos Finish .q

Caja de diágolo WAR File General Properties :

Pulsamos Next .q

Caja de diálogo Choose Component Type:

Selecccionamos Servlet (si no está ya seleccionado)q

Puslamos Next .q

Caja de Diálogo Component General Properties:

Nos aseguramos de que BonusServlet está seleccionado para la clase Servlet.q

Introducimos un nombre ( BonusServlet ) y una descripción.q

Podemos ignornar las selecciones de Startup y load sequence aquí porque esteejemplo sólo usa un servlet.

q

Caja de diálogo Component Initialization Parameters:

Pulsamos Next . BonusServlet no usa ningún parámetro de inicialización.q

Caja de diálogo Component Aliases:

Pulsamos Add .q

Tecleamos BonusAlias y pulsamos Return . Este es el mismo nombre de aliasque pusimos en el campo ACTION del formulario HTML embebido en el ficherobonus.html.

q

Pulsamos Finish .q

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (18 de 22) [18/03/2001 23:32:35]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 20/95

En el panel de contenido, podemos ver que el fichero WAR contiene un fichero XML coninformación estructural y de atributos sobre la aplicación web. el fichero bonus.html, yel fichero class BonusServlet. El formato del fichero WAR es donde van todas las clasesservlet en un punto de entrada con Web-INF/ classes. Sin embargo, cuando sedespliega el fichero WAR, la clase BonusServlet se sitúa en un directorio raíz decontexto bajo public_html . Esta situación es la convención parra servidores webcompatibles con Servlet 2.2.

Para cambiar el nombre o la descripción:

Ponemos el cursor en el campo apropiado en la ventanaq

Lo cambiamos según nuestros deseosq

Pulsamos la tecla Return para que las ediciones tengan efecto.q

Especificar el Nombre JNDI y el Contexto Raíz

Antes de poder desplegar la aplicación BonusApp y sus componentes, tenemos queespecificar el nombre JNDI que BonusServlet usa para buscar el bean de sesiónCalcBean, y especificar un directorio de contexto raíz donde el desplegador pondrá los

componentes web.

Nombre JNDI:

Seleccionamos el fichero BonusApp en la ventana "Local Applications". La ventana"Inspecting" muestra pestañas en la parte superior, y una de esas pestañas esJNDI Names.

q

Seleccionamos Select JNDI. La ventana "Inspecting" muestra una pantalla contres columnas y una fila. CalcBean se ve en la columna central.

q

En la columna más a la derecha bajo el nombre JNDI, tecleamos calc. Estenombre JNDI es el mismo nombre JNDI pasado al método BonusServlet.lookup.

q

Pulsamos la tecla Return.q

Contexto Raíz:

Pulsamos la pestaña Web Context en la parte superior de la ventana Inspecting.Veremos BonusWar en la columna de la izquierda.

q

Tecleamos BonusRoot en la columna de la derechaq

Pulsamos la tecla Return. Durante el despliegue se crea el directorio BonusRootbajo el directorio public_html en nuestra instalación J2sdkee1.2, y los ficherosbonus.html y BonusServlet se copian como muestra en la Figura 9.

q

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (19 de 22) [18/03/2001 23:32:35]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 21/95

Extructura del Directorio del Contexto Raíz

Alias:

En la ventana LocalApp, pulsamos BonusWar y luego BonusServletq

Pulsamos la pestaña Aliases de la parte superior de la ventana Inspecting.Deberíamos ver BonusAlias en el campo.

q

Si BonusAlias no está ahí, lo tecleamos y pulsamos Return.q

Verificar y Desplegar la Aplicación J2EEAntes de desplegar la aplicación, es una buena idea ejecutar el verificador. El verificadornos mostrará errores en los componentes de la aplicación como un método no existenteen el bean que el compilador no captura.

Verificar:

Con BonusApp seleccionado, elegimos Verifier desde el menú Tools.q

En el diálogo que aparece, pulsamos OK. La ventana nos debería decir si no hanfallado los tests.

q

Cerramos la ventana del verificador porque ya estamos listos para desplegar la

aplicación.

q

Nota:En la versión 1.2 podríamos obtener un error tests app.WebURI .Esto significa que la herramienta de desarrollo no puso una extensión.war al fichero WAR durante su creación. Este es un bug menor y laapliación J2EE se despliega bien sin notarlo.

Desplegar:

Desde el menú Tools, elegimos Deploy Application . Se mostrará una caja dediálogo Deploy BonusApp. Debemos verificar que la selección Target Server eso localhost o el nombre del servidor donde se está ejecutando el J2EE.

q

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (20 de 22) [18/03/2001 23:32:35]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 22/95

Nota:No debemos seleccionar el check box Return Client Jar. La única vezque necesitamos seleccionar este check box es cuando despleguemosuna aplicación solitaria para el programa cliente. Este ejemplo usa unservlet y una página HTML por eso no debemos seleccionarlo.Seleccionar este check box crea un fichero Jar con la información dedespliegue necesaria para una aplicación solitaria.

Pulsamos Next. Nos aseguramos de que el nombre JNDI muestra calcs. Si no lohace, lo tecleamos nosotros mismos y pulsamos la tecla Return.

q

Pulsamos Next. Nos aseguramos de que el nombre Context Root muestraBonusRoot. Si no lo hace, lo tecleamos nosotros y pulsamos la tecla Return.

q

Pulsamos Next .q

Pulsamos Finish para empezar el despliegue. Aparecerá una caja de diálogo quemostrará el estado de la operación de desliegue.

q

Cuando esté completa, las tres barras de la izquierda estárán completamentesombreadas, como se ve en la Figura 10. Cuando esto suceda, pulsamos OK .

q

Ejecutar la Aplicación J2EEEl servidor web se ejecuta por defecto en el puerto 8000. Para abrir la páginabonus.html apuntamos nuestro navegador ahttp:/ / localhost:8000/ BonusRoot/ bonus.html, que es donde DeployTool puso elfichero HMTL.

Nota:Si necesitamos usar un puerto diferente porque el puerto 8000 estásiendo utilizado por otra cosa, editamos el fichero web.properties enel directorio ~/ J2EE/ j2sdkee1.2/ config y arrancamos de nuevo elservidor J2EE.

Rellenamos un número de seguridad social.q

Rellenamos un multiplicador.q

Pulsamos el botón Submit. BonusServlet procesa nuestros datos y devuelve unapágina HTML con el cálculo del bono.

q

Bonus Calculation

Soc Sec: 777777777

Multiplier: 25

Bonus Amount 2500.0

Actualizar el Código de ComponentesEl menú Tools tiene dos opciones de interés. Son Update Application Files y Updateand Redeploy Application .Estas opciones nos permiten cambiar el código y redesplegar nuestra aplicación confacilidad. Simplemente hacemos los cambios en el código, lo recompilamos, y elegimosuna de estas opciones del menú.

Update Application Files actualiza los ficheros de la aplicación con nuestro nuevocódigo. En este punto podemos verificar la aplicación o desplegarla.

q

Update and Redeploy Application actualiza los ficheros de la aplicación connuestro nuevo código y redespliega la aplicación sin ejecutar el verificador.

q

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (21 de 22) [18/03/2001 23:32:35]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 23/95

Código Fuente de los EjemplosAquí tienes un fichero Zip con los ficheros fuente de los ejemplos de esta página:

fuentes_L1.zip

[<< Inicio] [Siguiente>>]

Un Sencillo Bean de Sesión

http://usuarios.tripod.es/Ozito/j2ee/sesion.html (22 de 22) [18/03/2001 23:32:35]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 24/95

Java 2 Enterprise Edition

[<< Anterior] [Inicio] [Siguiente >>]

Añadirle un Bean de EntidadEsta lección amplía el ejemplo de la lección anterior para usar un bean de entidad.BonusServlet llama al bean de entidad para grabar información sobre el número de laseguridad social y el bono y recuperarlo desde una tabla de la base de datos. Estefuncionalidad de acceso a la base de datos añade la cuarta capa y la capa final alpequeño cliente empezado en la lección anterior.

El SDK J2EE viene con una base de datos Cloudscape, y no necesitamos configuraciónadicional en nuestro entorno para el bean de entidad. De echo en este jemplo, noescribimos ningún código SQL o JDBC™ para crear las operaciones de acceso a la basede datos. La tabla y el código SQL se generan con la herramienta de Despliegue duranteen el ensamble y el despliegue. La lección sobre Tecnología JDBC y PersistenciaManejada por el Bean nos enseñará como escribir código SQL para un bean de entidad.

Crear el Bean de Entidadq

Cambiar el Servletq

Compilarq

Arrancar la Plataforma y las Herramientasq

Ensamblar y Desplegarq

Ejecutar la Aplicación J2EEq

Código fuente de los ejemplos de la lecciónq

Crear el Bean de EntidadUn bean de entidad representa datos persistentes almacenados en una fila de una tablade una base de datos. Cuando se crea un bean de entidad, los datos se escriben en lafila apropiada de la tabla, y si se actualizan los datos de un bean de entidad, los datos dela fila apropiada de la tabla también se actualizan. La creación de la tabla de la base dedatos y la actualización de las filas ocurre sin escribir nada de código SQL o JDBC.

Los datos de un bean de entidad son persistentes porque sobreviven a los crashs.

Si ocurre un crash mientras se están actualizando los datos de un bean de entidad,estos datos son restaurados autmáticamente al estado de la última transaciónenviada a la base de datos.

q

si ocurre un crash en medio de una transación a la base de datos, la transación se"deshace" para evitar que un envío parcial corrompa los datos.

q

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (1 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 25/95

BonusHome

La principal diferencia entre el bean de sesión CalcHome de la lección anterior y el beande entidad BonusHome de esta lección es el método findByPrimaryKey. Este métodode búsqueda toma la clave primaria como un parámetro. En este ejemplo, la claveprimara es el número de la seguridad social, que se usa para recuperar la fila con elvalor de la clave primaria que corresponde con el número de la seguridad social pasadoa este método.

El método create toma el valor del bono y de la clave primaria como parámetros.Cuando BonusServlet ejemplariza el interface home y llama a su método create, elcontenedor crea un ejemplar de BonusBean y llama a su método ejbCreate. Losmétodos BonusHome.create y BonusBean.ejbCreate deben tener la misma firma ,para que los valores del bono y la clave primaria puedan ser pasados desde el interfacehome al bean de entidad mediante el contenedor del bean de entidad. Si una fila parauna clave primada dada (número de seguridad social) ya existe, se lanza unaava.rmi.RemoteException que es manejada por el código cliente BonusServlet.

package Beans;

import java.rmi.RemoteException;import javax.ejb.CreateException;

import javax.ejb.FinderException;

import javax.ejb.EJBHome;

public interface BonusHome extends EJBHome {

public Bonus create(double bonus, String socsec)

throws CreateException, RemoteException;

public Bonus findByPrimaryKey(String socsec)

throws FinderException, RemoteException;

}

Bonus

Después de crear el interface home, el contenedor crea el interface remoto y el bean deentidad. El interface Bonus declara los métodos getBonus y getSocSec para que elservlet pueda recuperar los datos desde el bean de entidad

package Beans;

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

public interface Bonus extends EJBObject {

public double getBonus() throws RemoteException;

public String getSocSec() throws RemoteException;

}

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (2 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 26/95

BonusBean

BonusBean es un bean de entidad controlado por contenedor. Esto significa que elcontenedor maneja la persistencia de los datos y el control de las transaciones sin tenerque escribir código para transferir datos entre el bean de entidad y la base de datos odefinir paquetes de transaciones.

Si por alguna razón queremos que el bean de entidad maneje su propia persistencia olas transaciones, podríamos proporcionar implementaciones para algunos de los métodosvacíos mostrados en el código de BonusBean de abajo.

Cuando BonusServlet llama a BonusHome.create, el contenedor llama al métodoBonusBean.setEntityContext. El ejemplar de EntityContext pasado al métodosetEntityContext tiene métodos que permiten al bean devolver una referencia a sí mismo o para obtener su clave primaria.

Luego, el contenedor, llama al método ejbCreate. Este método asigna datos a lasvariables de ejemplar del bean, y luego el contenedor escribe los datos en la base de

datos. Se llama al método ejbPostCreate después de ejbCreate y realiza cualquierproceso necesario después de que se cree el bean. Este sencillo ejemplo no haceprocesamiento post-creacción.

Los otros métodos vacíos son métodos de retrollamada usados por el contenedor paranotificar al bean algún evento que va a ocurrir. Podríamos proporcionar comportamientopara algunos de estos métodos si estámos usando persistencia controlada por el bean, yotros si necesitamos proporcionar limpieza específica del bean u operaciones de limpieza.Estas operaciones de limpieza e inicialización tienen lugar en momentos específicosdurante el ciclo de vida del bean, y el contenedor se lo notifica al bean y llama al métodoaplicable en el momento apropiado. Aquí tenemos una breve descripción de los métodosvacíos:

Los métodos ejbPassivate y ejbActivate los llama el contenedor antes de que elcontenedor mueva el bean de su almacenamiento. Este proceso es similar alconcepto de intercambio de una página de memoria virtual entre la memoria y eldisco.

q

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (3 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 27/95

El contenedor llama al método ejbRemove si el interface home tiene elcorrespondiente método remove que es llamado por el cliente.

q

Los métodos ejbLoad y ejbStore los llama el contenedor antes de que sesincronize el estado del bean con la base de datos subyacente.

q

Los métodos getBonus y getSocSec son llamados por los clientes para recuperar datosalmacenados en variables de ejemplar. Este ejemplo no tiene métodos del tipo set<type >, pero si los tuviera, el cliente podría llamarlos para modificar los datos de lasvariables de ejemplar del bean. Cualquier cambio hecho en una variable de ejemplar

resulta en una actualización de la fila de la tabla de la base de datos subyacente.

package Beans;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EntityBean;

import javax.ejb.EntityContext;

public class BonusBean implements EntityBean {

public double bonus;public String socsec;

private EntityContext ctx;

public double getBonus() {

return this.bonus;

}

public String getSocSec() {

return this.socsec;

}

public String ejbCreate(double bonus,String socsec)

throws CreateException{

//Called by container after setEntityContext

this.socsec=socsec;

this.bonus=bonus;

return null;

}

public void ejbPostCreate(double bonus,

String socsec) {

//Called by container after ejbCreate

}

//These next methods are callback methods that

//are called by the container to notify the

//Bean some event is about to occur

public void ejbActivate() {

//Called by container before Bean

//swapped into memory

}

public void ejbPassivate() {//Called by container before

//Bean swapped into storage

}

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (4 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 28/95

public void ejbRemove() throws RemoteException {

//Called by container before

//data removed from database

}

public void ejbLoad() {

//Called by container to

//refresh entity Bean's state

}

public void ejbStore() {

//Called by container to save

//Bean's state to database

}

public void setEntityContext(EntityContext ctx){

//Called by container to set Bean context

}

public void unsetEntityContext(){

//Called by container to unset Bean context

}

}

Cambiar el ServletEl código de esta lección es muy similar al de la página anterior con cambios en losmétodos init y doGet. El método init de esta lección busca el bean de sesión CalcBean,y el bean de entidad BonusBean.

public class BonusServlet extends HttpServlet {CalcHome homecalc;

BonusHome homebonus;

Bonus theBonus, record;

public void init(ServletConfig config)

throws ServletException{

try {

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("bonus");

Object objref2 = ctx.lookup("calcs");

homebonus=(

BonusHome)PortableRemoteObject.narrow(

objref, BonusHome.class);

homecalc=(CalcHome)

PortableRemoteObject.narrow(

objref2, CalcHome.class);

} catch (Exception NamingException) {

NamingException.printStackTrace();

}

}

La sentencia try en el método doGet crea los interfaces home de CalcBean y

BonusBean. Después de llamar a calcBonus para calcular el bono, se llama al métodoBonusHome.create para crear un ejemplar del bean de entidad y la correspondientefila en la tabla de la base de datos subyacente. Después de crear la tabla, se llama almétodo BonusHome.findByPrimaryKey para recuperar el mismo registro por su claveprimaria (número de la seguridad social). Luego, se devuelve una página HTML al

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (5 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 29/95

navegador mostrado los datos pasados originalmente, el bono calculado, y los datosrecuperados desde la fila de tabla de la base de datos.

La sentencia catch captura y maneja los valores de claves primaria duplicados (númerosde seguridad social. La tabla de la base de datos subyacente no puede tener dos filascon la misma clave primaria, por eso si pasamos el mismo número de la seguridadsocial, el servlet captura el error antes de intentar crear el bean de entidad. En el eventode una clave duplicada, el servlet devuelve una página HTML con los datos pasadosoriginalmente, el bono calculado, y un mensaje de error de clave duplicada:

try {

Calc theCalculation;

//Retrieve Bonus and Social Security Information

String strMult = request.getParameter(

"MULTIPLIER");//Calculate bonus

Integer integerMult = new Integer(strMult);

multiplier = integerMult.intValue();

socsec = request.getParameter("SOCSEC");

//Calculate bonus

double bonus = 100.00;

theCalculation = homecalc.create();calc = theCalculation.calcBonus(

multiplier, bonus);

//Create row in table

theBonus = homebonus.create(calc, socsec);

record = homebonus.findByPrimaryKey(socsec);

//Display data

out.println("<H1>Bonus Calculation</H1>");

out.println("<P>Soc Sec passed in: " +

theBonus.getSocSec() + "<P>");

out.println("<P>Multiplier passed in: " +

multiplier + "<P>");

out.println("<P>Bonus Amount calculated: " +theBonus.getBonus() + "<P>");

out.println("<P>Soc Sec retrieved: " +

record.getSocSec() + "<P>");

out.println("<P>Bonus Amount retrieved: " +

record.getBonus() + "<P>");

out.println("</BODY></HTML>");

//Catch duplicate key error

} catch (javax.ejb.DuplicateKeyException e) {

String message = e.getMessage();

//Display data

out.println("<H1>Bonus Calculation</H1>");out.println("<P>Soc Sec passed in: " +

socsec + "<P>");

out.println("<P>Multiplier passed in: " +

multiplier + "<P>");

out.println("<P>Bonus Amount calculated: " +

calc + "<P>");

out.println("<P>" + message + "<P>");

out.println("</BODY></HTML>");

} catch (Exception CreateException) {

CreateException.printStackTrace();

}

}

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (6 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 30/95

CompilarPrimero, compilamos el Bean de entidad y el servlet. Puedes volver a la lección anteriorpara ver la configuración del path, classpath y dónde situar los ficheros fuentes.

Compilar el Bean de Entidad

Unix

#!/bin/sh

cd /home/monicap/J2EE

J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1

CPATH=.:$J2EE_HOME/lib/j2ee.jar

javac -d . -classpath "$CPATH" Beans/BonusBean.java

Beans/BonusHome.java Beans/Bonus.java

Windows

cd \home\monicap\J2EE

set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1

set CPATH=.;%J2EE_HOME%\lib\j2ee.jar

javac -d . -classpath %CPATH% Beans/BonusBean.java

Bean s/BonusHome.java Beans/Bonus.java

Compilar el Servlet

Unix:

cd /home/monicap/J2EE/ClientCode

J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1

CPATH=.:$J2EE_HOME/lib/j2ee.jar:/home/monicap/J2EE

javac -d . -classpath "$CPATH" BonusServlet.java

Windows:

cd \home\monicap\J2EE\ClientCodeset J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1

set CPATH=.;%J2EE_HOME%\lib\j2ee.jar;

\home\monicap\J2EE

javac -d . -classpath %CPATH% BonusServlet.java

Arrancar la Plataforma y las HerramientasPara ejecutar este ejemplo, necesitamos arrancar el servidor J2EE, la herramientaDeploy y la base de datos Cloudscape. En diferentes ventanas, tecleamos los siguientes

comandos.

j2ee -verbose

deploytool

cloudscape -start

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (7 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 31/95

Si esto no funciona, tecleamos esto desde el directorior J2EE:

Unix

j2sdkee1.2.1/bin/j2ee -verbose

j2sdkee1.2.1/bin/deploytool

j2sdkee1.2.1/bin/cloudscape -start

Windows

j2sdkee1.2.1\bin\j2ee -verbose

j2sdkee1.2.1\bin\deploytool

j2sdkee1.2.1\bin\cloudscape -start

Ensamblar y DesplegarLos pasos de esta sección son:

Actualizar el Fichero de Aplicaciónq

Crear el Bean de Entidadq

Actualizar el Fichero de Aplicación

El archivo web (WAR) contiene BonusServlet y bonus.html. Como hemos modificadoBonusServlet, tenemos que actualizar la aplicación J2EE con el nuevo código delservlet.

Ventana Local Applicatons: Iluminamos la aplicación BonusApp.q

Menú Tools Menu: Seleccionamos Update Application Files .q

Nota:Se desinstalará automáticamente la aplicación BonusApp de lalección anterior.

Crear el Bean de Entidad

Los pasos para crear el EJB JAR para el bean de entidad son muy similares a los pasosdel bean de sesión cubiertos en la lección anterior. Sin embargo, hay algunasdiferencias, y se explican aquí:

Nota:En esta lección, el bean de entidad va en un ficjero JAR separado delbean de sesión para continuar el ejemplo de la lección anterior con elmenor número de cambios. Sin embargo, como estos beans tienenfuncionalidades relacionadas podríamos empaquetarlos y desplegarlosen el mismo fichero JAR. Vermos como hacer esto en la siguientelección

Menu File:

Seleccionamos New Enterprise Bean.q

Introducción :

Leer y Pulsar Nextq

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (8 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 32/95

EJB JAR :

Nos aseguramos de que BonusApp se ve en Enterprise Bean will go in field .q

Especificamos BonusJar como nombre.q

Pulsamos Add (el más cercano a la ventana Contents).q

Añadir Componentes al JAR:

Cambiamos el directorio para que el directorio de beans muestre su contenido.q

Seleccionamos Bonus.classq

Pulsamos Add.q

Selecionamos BonusBean.classq

Pulsamos Add.q

Seleccionamos BonusHome.classq

Pulsamos Add.q

Pulsamos OK .q

añadir clases a BonusJar

EJB JAR:

Pulsamos Next .q

General:

Beans.BonusBean es el nombre de la clase.q

Beans.BonusHome es el interface Home.q

Beans.Bonus es el interface Remoto.q

Introducimos BonusBean como nombre a mostrar.q

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (9 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 33/95

Pulsamos Entity .q

Pulsamos Next .q

Configuración Entity:

Seleccionamos Container-Managed persistence.q

En la ventana inferior, marcamos bonus y socsec .q

Especificamos java.lang.String para la clase de la clave primaria. Observa que laclave primaria tiene que ser un tipo de clase. Los tipos primitivos no pueden ser

claves primaria.

q

Especificamos socsec para el nombre de campo de la clave primaria.q

Pulsamos Next .q

Entradas de Entorno:

Pulsamos Next. Este sencillo bean de entidad no usa propiedades (entradas deentorno).

q

Referencias a Beans Enterprise:

Pulsamos Next. Este sencillo bean de entidad no referencia otros beans enterprise.q

Referencias a Recursos:

Pulsamos Next. Este sencillo bean de entidad no busca un objeto database oJavaMail™ session.

q

Seguridad:

Pulsamos Next. Este sencillo bean de entidad no usa roles de seguridad.q

Control de Transación :

Seleccionamos Container-managed transactions (si no está ya seleccionado).q

En la lista hacemos que sean requeridos create, findByPrimaryKey, getBonus ygetSocSec. Esto significa que el contenedor empieza una nueva transación antesde ejecutar estos métodos. Las transaciones se envían justo antes de que losmétodos terminen.

q

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (10 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 34/95

Control de Transación

 

Pulsamos Next .q

Pulsamos Finish .q

Aplicaciones Locales:

Seleccionamos BonusApp .q

En la ventana Inspecting, seleccionamos JNDI namesq

La damos a BonusBean el nombre JNDI de bonusq

Pulsamos la tecla Returnq

Antes de poder desplegar la aplicación J2EE, necesitamos especificar las condiciones dedespliegue para el bean de entidad y generar el SQL. Aquí está cómo hacerlo:

Ventana Local Applications:

Seleccionamos BonusBean .q

Ventana Inspecting:

Seleccionamos Entityq

Pulsamos el botón Deployment Settings de la parte inferior izquierda.q

Configuración de Despliegue:

Especificamos jdbc/ Cloudscape (con una C maýuscula en Cloudscape) para elnombre JNDI de la base de datos.

q

Pulsamos Return.q

Nos aseguramos de que las cajas Create table on deploy y Delete table onDeploy están marcadas.

q

Ahora pulsamos Generate SQL.q

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (11 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 35/95

Nota:Si obtenemos un error de que la conexión fue rechazada, arrancamosla base de datos como se describe en Arrancar la Plataforma y lasHerramientas.

Generar SQL y la Tabla de la Base de Datos

 

Cuando se complete la generación de SQL, seleccionamos el métodofindByPrimaryKey en la caja EJB method. Aparecerá una secuencia SQL a laderecha. Debería leerse SELECT " socsec" FROM "BonusBeanTable" WHERE"socsec"=?. El interrogante representa el parámetro pasado por el métodofindByPrimaryKey.

q

Pulsamos OK .q

Verificar y Desplegar la aplicación J2EE

Verificar:

Con BonusApp seleccionado, elegimos Verifier desde el menú Tools.q

En el diálogo que aparece, pulsamos OK. La ventana debería decirnos que no hafallado ningún test.q

Cerramos la ventana del verificador porque ya estamos listos para desplegar laapliación.

q

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (12 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 36/95

Nota:En la versión 1.2 del software podría obtener un error testsapp.WebURI . La Aplicación J2EE se desplegará de todas formas.

Despliegue:

En el Meú Tools: Seleccionamos Tools.Deploy Application.q

Nota:No marcamos la caja "Return Client Jar". El único momento en que

debemos chequear esta caja es cuando usamos persistenciacontrolada por el bean o desplegamos una aplicación solitaria para elprograma cliente. Este ejemplo usa un servlet y una página HTML porlo que no debe estár marcada. Esta caja crea un fichero JAR con todala información de despliegue necesaria para una aplicación solitaria.

Pulsamos Next. Nos aseguramos de que JNDI names muestra calcs paraCalcBean y bonus para BonusBean . Tecleamos cualquier nombre JNDI que noesté y pulsamos la tecla Return.

q

Pulsamos Next. Nos aseguramos que el nombre Context Root muestraBonusRoot. Si no lo hace, lo tecleamos nosotros mismos y pulsamos la teclaReturn.

q

Pulsamos Next.q

Pulsamos Finish para empezar el despliegue.q

Cuando se haya completado el despliegue, pulsamos OK.q

Ejecutar la Aplicación J2EEEl servidor web se ejecuta por defecto en el puerto 8000. Para abrir la páginabonus.html apuntamos nuestros navegador a

http:/ / localhost:8000/ BonusRoot/ bonus.html, que es donde DeployTool puso elfichero HMTL.

Rellenamos un número de la seguridad social y un múltiplicador, y pulsamos el botónSubmit. BonusServlet procesa nuestros datos y devuelve una página HTML con elbono calculado.

Bonus Calculation

Soc Sec passed in: 777777777

Multiplier passed in: 25

Bonus Amount calculated: 2500.0

Soc Sec retrieved: 7777777777

Bonus Amount retrieved: 2500.0

Si volvemos al código de bonus.html y cambiamos el multiplicador por 2, pero usamosel mismo número de la seguridad social, veremos esto:

Bonus Calculation

Soc Sec passed in: 777777777

Multiplier passed in: 2

Bonus Amount calculated: 200.0

Duplicate primary key.

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (13 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 37/95

Código Fuente de los EjemplosAquí tienes un fichero Zip con los ficheros fuente de los ejemplos de esta página:

fuentes_L2.zip

[<< Anterior] [Inicio] [Siguiente >>]

Añadir un Bean de Entidad

http://usuarios.tripod.es/Ozito/j2ee/entity.html (14 de 14) [18/03/2001 23:33:46]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 38/95

Java 2 Enterprise Edition

[<< Anterior] [Inicio] [Siguiente >>]

Comunicaciones Entre BeansEn la lección anterior, el servlet buscaba y creaba un bean de sesión para realizar elcálculo de un bono, y luego buscaba y creaba un bean de entidad para almacenar elvalor del bono y el número de la seuridad social asociado. Esta lección modifica elejemplo para que el bean de sesión busque y cree el bean de entidad. Como el bean desesión y el de entidad trabajan juntos, están empaquetados en un sólo fichero JAR para

su despliegue.Cambiar el Bean de Sesiónq

Cambiar el Servletq

Compilarq

Arrancar la Plataforma y las Herramientasq

Ensamblar la aplicaciónq

Verificar y Desplegar la Aplicación J2EEq

Ejecutar la Aplicación J2EEq

Código fuente de los ejemplos de la lecciónq

Nota:Algunas personas tienen problemas con esta lección al trabajar 2beans en un fichero JAR. Si sucede esto, podemos borrar el ficheroJAR con los dos beans y poner cada bean en su propio fichero JAR.Podríamos necesitar parar y rearrancar el servidor y las herramientasantes de poder generar el SQL y desplegar.

Cambiar el Bean de SesiónEn esta lección y como se ve en la Figura 14, el bean de entidad es un cliente del beande sesión. Esto significa que el bean de entidad obtiene sus datos del bean del sesión envez de BonusServlet como lo hizo en la Leccion anterior. Por eso, se modifica el métodocalcBonus del bean de sesión para tomar el número de la seguridad social como unparámetro y crear el bean de entidad.

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (1 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 39/95

Beans Trabajando Juntos

CalcHome

El interface CalcHome no se modifica. Tiene el mismo método create que devuelve unejemplar del interface remoto.

package Beans;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;

public interface CalcHome extends EJBHome {

public Calc create()throws CreateException, RemoteException;

}

Calc

El método calcBonus del interface Calc se ha modificado para tomar el número de laseguridad social como parámetro. Por eso CalcBean puede pasar el bono y el númerode la seguridad social al bean de entidad después de calcular el valor del bono. Se añadeun nuevo método getRecord para que CalcBean peuda encontrar el bean de entidad

por sus clave primaria (el número de la seguridad social).También, la firma del método calcBonus lanza DuplicateKeyException yCreateException. Esto es por lo que BonusServlet puede capturar y manejarcualquiera de estas condiciones de excepción. DuplicateKeyException desciende deCreateException. Si diseñamos el método calcBonus para lanzarDuplicateKeyException , pero capturamos CreateException ,DuplicateKeyException no se lanzará. El atajo es hacer que calcBonus lanceDuplicateKeyException y CreateException .

package Beans;

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

import javax.ejb.DuplicateKeyException;

import javax.ejb.CreateException;

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (2 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 40/95

public interface Calc extends EJBObject {

public Bonus calcBonus(int multiplier,

double bonus,

String socsec)

throws RemoteException,

DuplicateKeyException,

CreateException;

public Bonus getRecord(String socsec)

throws RemoteException;

}

CalcBean

El código para crear el bean de entidad se ha movido desde BonusServlet hastacalcBonus para que el bono y el número de la seguridad social puedan escribirse en elbean de entidad después de haber calculado el bono. La variable homebonus es unavariable de ejemplar para que pueda ser usada en el método calcBonus para buscar elbean de entidad y en el método getRecord para localizar el bean de entidadcorrespondiente al número de la seguridad social.

package Beans;

import java.rmi.RemoteException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

import javax.naming.InitialContext;

import javax.rmi.PortableRemoteObject;

import javax.ejb.DuplicateKeyException;

import javax.ejb.CreateException;

public class CalcBean implements SessionBean {

BonusHome homebonus;//Throw DuplicateKeyException and CreateException

//so BonusServlet can catch and handle these

//exception conditions.

public Bonus calcBonus(int multiplier,

double bonus, String socsec)

throws DuplicateKeyException,

CreateException {

Bonus theBonus = null;

double calc = (multiplier*bonus);

try {

InitialContext ctx = new InitialContext();Object objref = ctx.lookup("bonus");

homebonus = (BonusHome)

PortableRemoteObject.narrow(

objref, BonusHome.class);

} catch (Exception NamingException) {

NamingException.printStackTrace();

}

//Store data in entity bean

try {

theBonus = homebonus.create(calc, socsec);

} catch (java.rmi.RemoteException e) {

String message = e.getMessage();e.printStackTrace();

}

return theBonus;

}

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (3 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 41/95

public Bonus getRecord(String socsec) {

Bonus record = null;

//Use primary key to retrieve data from entity bean

try {

record = homebonus.findByPrimaryKey(socsec);

} catch (java.rmi.RemoteException e) {

String message = e.getMessage();

} catch (javax.ejb.FinderException e) {

e.printStackTrace();}

return record;

}

public void ejbCreate() { }

public void setSessionContext(

SessionContext context){

}

public void ejbRemove() { }

public void ejbActivate() { }

public void ejbPassivate() { }

public void ejbLoad() { }

public void ejbStore() { }

}

Cambiar el ServletEl programa BonusServlet es muy similar a la versión de la Lección anterior conalgunos cambios en los métodos init y doGet. El método init para esta sección sólobusca el bean de sesión.

public class BonusServlet extends HttpServlet {CalcHome homecalc;

//Need Bonus variables because CalcBean methods

//called in the doGet method return instances

//of type Bonus

Bonus theBonus, record;

public void init(ServletConfig config)

throws ServletException{

try {

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("calcs");homecalc = (CalcHome)

PortableRemoteObject.narrow(

objref, CalcHome.class);

} catch (Exception NamingException) {

NamingException.printStackTrace();

}

}

La sentencia try del método doGet calcula el bono, crea el interface home del bean desesión y llama a los métodos calcBonus y getRecord. Si el método se completa conéxito, se devuelve una página HTML que muestra los datos recuperados desde el bean

de entidad. Si el método calcBonus lanza una DuplicateKeyException, se devuelveuna página HTML mostrando el número de la seguridad social y el multiplicador pasados,y un mensaje de excepción, Duplicate primary key.

Como en la lección anterior, la sentencia catch captura y maneja valores de claves

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (4 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 42/95

primarias duplicadas (números de la seguridad social).

try {

Calc theCalculation;

//Retrieve Bonus and Social Security Information

String strMult = request.getParameter(

"MULTIPLIER");//Calculate bonus

Integer integerMult = new Integer(strMult);

multiplier = integerMult.intValue();

socsec = request.getParameter("SOCSEC");//Calculate bonus

double bonus = 100.00;

theCalculation = homecalc.create();

//Call session bean

//Pass 3 parameters:multiplier, bonus, and socsec

theBonus = theCalculation.calcBonus(

multiplier, bonus, socsec);

record = theCalculation.getRecord(socsec);

//Display data returned by session bean

out.println("<H1>Bonus Calculation</H1>");

out.println("<P>Soc Sec retrieved: " +record.getSocSec() + "<P>");

out.println("<P>Bonus Amount retrieved: " +

record.getBonus() + "<P>");

out.println("</BODY></HTML>");

} catch (javax.ejb.DuplicateKeyException e) {

String message = e.getMessage();

out.println("<H1>Bonus Calculation</H1>");

out.println("<P>Soc Sec passed in: " + socsec +

"<P>");

out.println("<P>Multiplier passed in: " +

multiplier + "<P>");

out.println("</BODY></HTML>");} catch (Exception CreateException) {

CreateException.printStackTrace();

}

CompilarPrimero compilamos el bean de sesión y el servlet. Puedes referirte a la primera lecciónpara la configuración del path y del classpath y más información sobre dónde situar los

ficheros fuente.

Compilar el Bean de Sesión

Unix

#!/bin/sh

cd /home/monicap/J2EE

J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1

CPATH=.:$J2EE_HOME/lib/j2ee.jar

javac -d . -classpath "$CPATH" Beans/CalcBean.javaBeans/CalcHome.java Beans/Calc.java

 

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (5 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 43/95

Windows

cd \home\monicap\J2EE

set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1

set CPATH=.;%J2EE_HOME%\lib\j2ee.jar

javac -d . -classpath %CPATH% Beans/CalcBean.java

Beans/CalcHome.java Beans/Calc.java

 

Compilar el Servlet

Unix:

cd /home/monicap/J2EE/ClientCode

J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2

CPATH=.:$J2EE_HOME/lib/j2ee.jar:

/home/monicap/J2EE

javac -d . -classpath "$CPATH" BonusServlet.java

Windows:

cd \home\monicap\J2EE\ClientCode

set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2

set CPATH=.;%J2EE_HOME%\lib\j2ee.jar:\home\monicap\J2EE

javac -d . -classpath %CPATH% BonusServlet.java

Arrancar la Plataforma y las HerramientasPara ejecutar este ejemplo, necesitamos arrancar el servidor J2EE, la herramientaDeploy y la base de datos Cloudscape. En diferentes ventanas, tecleamos los siguientescomandos.

j2ee -verbose

deploytool

cloudscape -start

Si esto no funciona, tecleamos esto desde el directorior J2EE:

Unix

j2sdkee1.2.1/bin/j2ee -verbose

j2sdkee1.2.1/bin/deploytool

j2sdkee1.2.1/bin/cloudscape -start

Windows

j2sdkee1.2.1\bin\j2ee -verbose

j2sdkee1.2.1\bin\deploytool

j2sdkee1.2.1\bin\cloudscape -start

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (6 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 44/95

Ensamblar la AplicaciónLos pasos de esta sección incluyen:

Crear una nueva aplicación J2EE.q

Crear un nuevo componente Web.q

Empaquetar los Beans de Sesión y de Entidad en un fichero JAR.q

Crear una Nueva aplicación J2EE

En vez de actualizar la aplicación J2EE de las lecciones anteriores, estos pasos crean unanueva aplicación J2EE.

Borrar BonusApp:

Pulsamos BonusApp para que se ilumineq

Seleccionamos Delete desde el menú Editq

Crear 2BeansApp :

Desde el menú File, seleccionamos New Application .q

Pulsamos con el botón derecho del ratón en el campo Application Display Name.Aparecerá 2BeansApp como nombre.

q

Pulsamos el botón Browse para abrir el selector de ficheros y seleccionar lalocalización donde queremos grabar el fichero EAR de la aplicación.

q

Selector de ficheros New Application :

Localizamos el directorio donde queremos situar el fichero de aplicación EAR.q

En este ejemplo, el directorio es / export/ home/ monicap/ J2EE.q

En el campo File name, tecleamos 2BeansApp.ear.q

Pulsamos New Application.q

Pulsamos OK .q

Crear un nuevo componente Web.

Ahora, veremos los pasos para crear el fichero WAR. Estos pasos que se presentaron enla primera lección se sumarizan abajo.

Con 2BeansApp seleccionado:

File Menu:

Seleccionamos New Web Component.q

Introducción :

Leemos y Pulsamos Nextq

War File General Properties :

Especificamos BonusWar para el nombre.q

Pulsamos Addq

Vamos al directorio ClientCode y añadimos bonus.htmlq

Pulsamos Nextq

Vamos al directorio ClientCode y añadimos BonusServlet.classq

Pulsamos Finish.q

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (7 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 45/95

War File General Properties :

Pulsamos Next.q

Choose Component Type: .

Nos aseguramos de seleccionar Describe a servlet.q

Pulsamos Next.q

Component General Properties :

Hacemos la clase de servlet BonusServlet.q

Hacemos el nombre de display BonusServlet .q

Pulsamos Next.q

Component Initialization Parameters.

Pulsamos Next.q

Component Aliases :

Especificamos BonusAliasq

Pulsamos Finish.q

Ventana Inspecting:

Seleccionamos Web Contextq

Especificamos BonusRoot.q

Empaquetar los Beans de Sesión y de Entidad en un FicheroJAR

En esta lección, pondremos los beans de sesión y de entidad en el mismo fichero JAR.

Para hacer esto, primero creamos el fichero JAR con sólo el bean de sesión, y luego leañadimos el bean de entidad.

Crear JAR con el Bean de Sesión

Con 2BeansApp seleccionado,

Menú File:

Seleccionamos New Enterprise Bean.q

Introducción :

Leemos y pulsamos Next .q

EJB JAR :

Nos aseguramos de que 2BeansApp se muestra en el campo Enterprise Beanw ill go in .

q

Especificamos 2BeansJar como nombre.q

Pulsamos Add (el más cercano a la ventana Contents).q

Cambiamos el directorio para que el directorio Beans muestre su contenido.q

Seleccionamos Calc.classq

Pulsamos Add .q

Seleccionamos CalcBean.classq

Pulsamos Add .q

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (8 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 46/95

Seleccionamos CalcHome.classq

Pulsamos Add.q

Clases Enterprise Bean JAR :

Nos aseguramos de que vemos Beans/ Calc.class , Beans/ CalcHome.class, yBeans/ CalcBean.class en la pantalla.

q

Pulsamos OK .q

EJB JAR :Pulsamos Next.q

General :

CalcBean es el nombre de la clase, Beans.CalcHome es el interface Home, yBeans.Calc es el interface remoto.

q

Introducimos CalcBean como nomre de display.q

Pulsamos session and stateless.q

Pulsamos Next.q

Entradas de Entorno:Pulsamos Next. Este sencillo bean de sesión no usa propiedades (entradas deentorno)

q

Referencias a Beans Enterprise:

Pulsamos Next. Las referencias se manejarán durante el despliegue mejor queaquí.

q

Referencias a Recursos:

Pulsamos Next. Este sencillo bean de sesión no busca ningún objeto de base dedatos o sesión JavaMail™.

q

Seguridad:

Pulsamos Next. Este sencillo bean de sesión no usa roles de seguridad.q

Control de Transaciones :

Seleccionamos Container-managed transactions (si no lo está ya).q

En la lista de abajo hacemos necesarios calcBonus, y getRecord. Esto significaque el contenedor arranca una nueva transación antes de ejecutar estos métodos.La transación se envía justo antes de que los métodos terminen.

q

Pulsamos Next.q

Revisar configuraciones:

Pulsamos Finish .q

Local Applications:

Seleccionamos 2BeansApp .q

En la ventana Inspecting seleccionamos JNDI names, le damos el nombreCalcBean JNDI de calcs, y pulsamos la tecla Return.

q

Añadir el Bean de Entidad

Con 2BeansApp seleccionado,

File Menu:

Seleccionamos New Enterprise Beanq

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (9 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 47/95

Introduction :

Leemos y pulsamos Next.q

EJB JAR :

Nos aseguramos de que 2BeansJar se muestra en el campo Enterprise Beanw ill go in . Esta selección añadirá el nuevo bean al fichero JAR existente en lugarde ponerlo en un nuevo fichero JAR.

q

Pulsamos Add (el más cercano a la ventana Contents).q

Cambiamos el directorio para que el directorio Beans muestre su contenido.q

Seleccionamos Bonus.classq

Pulsamos Add .q

Seleccionamos BonusBean.classq

Pulsamos Add .q

Seleccionamos BonusHome.classq

Pulsamos Add.q

Enterprise Bean JAR classes :Nos aseguramos de ver Beans/ Bonus.class , Beans/ BonusHome.class, yBeans/ BonusBean.class en el display.

q

Pulsamos OK .q

EJB JAR :

Pulsamos Next .q

General :

Nos aseguramos de que Beans.BonusBean es el nombre de la clase,Beans.BonusHome es el interface Home, y Beans.Bonus es el interface remoto.

q

Introducimos BonusBean como nombre de pantalla.q

Pulsamos Entity .q

Pulsamos Next .q

Entity Settings:

Seleccionamos Container managed persistence .q

En la ventana inferior, marcamos bonus y socsec. la clase de clave primaria es java.lang.String, y el nombre del campo de la clave primaria es socsec. Observaque la clave primara tiene que ser un tipo de clase. Los tipos primitivos no son

válidos para claves primarias.

q

Pulsamos Next .q

Environment Entries:

Pulsamos Next . Este sencillo bean no usa propiedades (entradas de entorno).q

Enterprise Bean References:

Pulsamos Next. Este sencillo bean no referencia otros beans enterprise.q

Resource References:

Pulsamos Next. Este sencillo bean no busca objetos de base de datos ni sesionesJavaMail™.

q

Seguridad:

Pulsamos Next. Este sencillo Bean no usa roles de seguridad.q

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (10 de 14) [18/03/2001 23:34:31]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 48/95

Control de Transaciones :

Seleccionamos Container-managed transactions (si no lo está ya)q

En la lista de abajo hacemos necesarios create , findByPrimaryKey , getBonus ygetSocSec. Esto significa que el contenedor arrancará una nueva transación antesde ejecutar estos métodos. La transación se envía justo antes de que los métodosterminen.

q

Pulsamos Next .q

Review Settings:Pulsamos Finish .q

Local Applications:

Seleccionamos 2BeansApp .q

En la ventana Inspecting, seleccionamos JNDI names, dando a BonusBean elnombre JNDI de bonus y a CalcBean el nombre JNDI de calcs

q

Pulsamos la tecla Return después de cada entrada.q

Antes de poder desplegar la aplicación J2EE, necesitamos especificar las configuraciones

de despliegue para el bean de entidad y generar el SQL:Ventana Local Applications:

Seleccionamos BonusBean.q

Ventana Inspecting:

Seleccionamos Entityq

Pulsamos el botón Deployment Settings inferior derecha.q

Ventana Deployment Settings:

Especificar jdbc/ Cloudscape (con una C mayúsculas en Cloudscape) para elnombre JNDI de la base de datos.

q

Pulsamos Returnq

Nos aseguramos de que las cajas Create table on deploy y Delete table onDeploy están marcadas.

q

Ahora pulsamos Generate SQL.q

Nota:Si obtenemos un error de que la conexión fue rechazada, arrancamosde nuevo la base de datos como se describe en Arrancar la Plataformay las Herramientas.

Cuando se complete la generación del SQL,

Seleccionamos el método findByPrimaryKey en la caja EJB method.q

Aparecerá una sentencia SQL a la derecha. Debería ser SELECT "socsec" FROM"BonusBeanTable" WHERE "socsec"=?. El interrogante representa elparámetro pasado para el método findByPrimaryKey .

q

Pulsamos OK .q

Verificar y Desplegar la Aplicación J2EEAntes de desplegar la aplicación, es una buena idea ejecutar el verificador. El verificadormostrará los errores en los componentes de la aplicación como métodos inexistentes queel compilador no captura.

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (11 de 14) [18/03/2001 23:34:32]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 49/95

Nota:Si obtenemos un error Save cuando verificamos o desplegamos,debemos parar todo y rearrancar el servidor y las herramientas.

Verificar:

Con 2BeansApp seleccionado, elegimos Verifier desde el menú Tools.q

En el diálogo que aparece, pulsamos OK. La ventana debería decir que no hayningún fallo.

q

Cerramos la ventana del verificador porque ahora estamos listos para desplegar laaplicación.

q

Nota:En la versión 1.2.1 del software podríamos obtener un error testsapp.WebURI . Esto significa que la herramienta DeployTool no puso laextensión .war al fichero WAR durante su creacción. Es un errormenor y la aplicación J2EE se despliega sin problemas.

Desplegar:

Desde el menú Tools, elegimos Deploy Application. Se mostrará una caja de

diálogo Deploy BonusApp.

q

Verificar que la selección de Target Server es un host local o el nombre de unhost donde se está ejecutando el servidor J2EE.

q

Nota:No marcamos la caja "Return Client Jar". El único momento en quedebemos chequear esta caja es cuando usamos persistenciacontrolada por el bean o desplegamos una aplicación solitaria para elprograma cliente. Este ejemplo usa un servlet y una página HTML porlo que no debe estár marcada. Esta caja crea un fichero JAR con todala información de despliegue necesaria para una aplicación solitaria.

Pulsamos Next .q

Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean ybonus para BonusBean. Si no es así, tecleamos los nombres JNDI nosotrosmismos, y pulsamos la tecla Return.

q

Pulsamos Next. Nos aseguramos de que el nombre Context Root muestraBonusRoot. Si no es así, lo tecleamos nosotros mismos y pulsamos la teclaReturn.

q

Pulsamos Next .q

Pulsamos Finish para empezar el despliegue. Se mostrará una caja de diálogo quemostrará el estado de la operación de despliegue.

q

Cuando se haya completado, las tres barras de la izquierda se habrán sombreadocompletamente, como se ve en la Figura 15. Cuando esto suceda pulsamos OK .

q

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (12 de 14) [18/03/2001 23:34:32]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 50/95

Despliegue de la Aplicación

Eejcutar la Aplicación J2EE 

El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la páginabonus.html apuntamos nuestros navegador a

http:/ / localhost:8000/ BonusRoot/ bonus.html, que es donde DeployTool puso elfichero HMTL.

Rellenamos un número de la seguridad social y un múltiplicador, y pulsamos el botónSubmit. BonusServlet procesa nuestros datos y devuelve una página HTML con elbono calculado

Bonus Calculation

Soc Sec retrieved: 777777777

Bonus Amount Retrieved: 200.0

Si volvemos al código de bonus.html y cambiamos el multiplicador por 2, pero usamosel mismo número de la seguridad social, veremos esto:

Bonus Calculation

Soc Sec passed in: 777777777

Multiplier passed in: 2

Duplicate primary key

Código Fuente de los EjemplosAquí tienes un fichero Zip con los ficheros fuente de los ejemplos de esta página:

fuentes_L3.zip

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (13 de 14) [18/03/2001 23:34:32]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 51/95

[<< Anterior] [Inicio] [Siguiente >>]

Comunicaciones entre Beans

http://usuarios.tripod.es/Ozito/j2ee/communicate.html (14 de 14) [18/03/2001 23:34:32]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 52/95

>

Java 2 Enterprise Edition

[<< Anterior] [Inicio] [Siguiente >>]

Tecnología JavaServer Pages™ (JSP)La tecnología JavaServer Pages™ (JSP) nos permite poner segmentos de código servletdirectamente dentro de una página HTML estática. Cuando el navegador carga unapágina JSP, se ejecuta el código del servlet y el servidor de aplicaciones crea, compila,carga y ejecuta un servlet en segundo plano para ejecutar los segmentos de código

servlet y devolver una página HTML o imprimir un informe XML.

Esta lección modifica el fichero WAR de la Lección anterior para usar una página JSP enlugar de BonusServlet.

Crear la Página JSPq

modificar bonus.htmlq

Arrancar la Plataforma y las Herramientasq

Eliminar el Fichero WARq

Crear el Nuevo Fichero WARq

Verificar y Desplegar la Aplicación J2EEq

Ejecutar la Aplicación J2EEq

Más Informaciónq

Código fuente de los ejemplos de la lecciónq

Crear la Página JSP

Una página JSP se parece a una página HTML con segmentos de código servletembebidos entre varias etiquetas de apertura ( <% ) y cierre ( % > ) JSP. No haymétodos HttpServlet como init , doGet, o doPost. En su lugar, el código quenormalmente iría en estos métodos está directamente embebido en la página JSPusando etiequetas JSP.

La siguiente página JAP ( Bonus.jsp ) es equivalente al BonusServlet de la lecciónanterior. Después del código podremos ver una descripción detallada de las etiquetasJSP. Observa que las etiquetas JSP no pueden estar anidadas. Por ejemplo, no podemosanidar una etiqueta de comentario JSP con una etiqueta scriptlet JSP.

<HTML><HEAD>

<TITLE>Bonus Calculation</TITLE>

</HEAD>

<%-- Comment

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (1 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 53/95

Scriptlet for import statements

<%@ indicates a jsp directive --%>

<%@ page import="javax.naming.*" %>

<%@ page import="javax.rmi.PortableRemoteObject" %>

<%@ page import="Beans.*" %>

<%-- Comment

Scriptlet to get the parameters,

convert string to Integer to int for bonus

calculation, and declare/initialize bonus

variable. <% indicates a jsp scriptlet --%><%! String strMult, socsec; %>

<%! Integer integerMult; %>

<%! int multiplier; %>

<%! double bonus; %>

<%

strMult = request.getParameter("MULTIPLIER");

socsec = request.getParameter("SOCSEC");

integerMult = new Integer(strMult);

multiplier = integerMult.intValue();

bonus = 100.00;

%>

<%-- Comment

Scriptlet to look up session Bean --%>

<%

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("calcs");

CalcHome homecalc = (CalcHome)

PortableRemoteObject.narrow(

objref, CalcHome.class);

%>

<%-- Comment

Scriptlet to create session Bean,

call calcBonus method, and retrieve a databaserecord by the social security number

(primary key) --%>

<%

try {

Calc theCalculation = homecalc.create();

Bonus theBonus = theCalculation.calcBonus(

multiplier,

bonus,

socsec);

Bonus record = theCalculation.getRecord(socsec);

%>

<%-- Comment

HTML code to display retrieved data

on returned HTML page. --%>

<H1>Bonus Calculation</H1>

Social security number retrieved:

<%= record.getSocSec() %>

<P>

Bonus Amount retrieved: <%= record.getBonus() %>

<P>

<%-- Comment

Scriptlet to catch DuplicateKeyException --%>

<%} catch (javax.ejb.DuplicateKeyException e) {

String message = e.getMessage();

%>

<%-- Comment

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (2 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 54/95

HTML code to display original data passed to JSP

on returned HTML page --%>

Social security number passed in: <%= socsec %>

<P>

Multiplier passed in: <%= strMult %>

<P>

Error: <%= message %>

<%-- Comment

Scriptlet to close try and catch block --%>

<%}

%>

<%-- Comment

HTML code to close HTML body and page --%>

</BODY>

</HTML>

Comentarios

Las primeras siete líneas de Bonus.jsp muestran un HTML normal seguido por un

comentario JSP. Los comentarios JSP son similares a los comentarios HTML excepto enque empiezan con <%-- en lugar de <!--, que es como empiezan en HTML. Podemosusar comentarios JSP o HTML en una página HTML. Los comentarios HTML se envían alnavegador web del cliente donde aparezcan como parte de la página HTML, y loscomentarios JSP son eliminados y no aparecen en el HTML generado.

Nota:Hemos visto que poner dos puntos (:) en un comentario JSP como en<% -- Comment: Scriptlet for import statements . . . creaba unerror en tiempo de ejecución que desaparecía cuando eliminabamoslos dos puntos.

<HTML>

<HEAD>

<TITLE>Bonus Calculation</TITLE>

</HEAD>

<%-- Comment

Scriptlet for import statements

<%@ indicates a jsp directive --%>

Directivas

Las directivas JSP son instrucciones procesadas por el motor JSP cuando la página JSP setraduce a un servlet. Las directivas usadas en este ejemplo le dicen al motor JSP queincluya ciertos paquetes y clases. Las directivas están encerradas entre etiquetas dedirectiva <% @ y % >.

<%@ page import="javax.naming.*" %>

<%@ page import="javax.rmi.PortableRemoteObject" %>

<%@ page import="Beans.*" %>

Declaraciones

Las declaraciones JSP nos permiten configurar variables para su uso posterior enexpresiones o scriptlets. También podemos declarar variables dentro de expresiones oscriptlets en el momento de usarlas. El ámbito es toda la página JSP, no hay concepto devariables de ejemplar. Es decir, no tenemos que declarar variables de ejemplar para usar

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (3 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 55/95

en más de una expresión o scriptlet. Las declaraciones van encerradas entre etiquetasde declaración <% ! y % >. Podemos tener varias declaraciones. Por ejemplo, <% !double bonus; String text; % > .

<%! String strMult, socsec; %>

<%! Integer integerMult; %>

<%! int multiplier; %>

<%! double bonus; %>

ScriptletsLos scriptlets JSP nos permiten embeber segmentos de código java dentro de una páginaJSP. El codigo embebido se inserta directamente en el servlet generado que se ejecutacuando se pide la página. Este scriptlet usa las variables declaradas en las directivasdescritas arriba. Los Scriptlets van encerradas entre etiquetas <% y % >.

<%

strMult = request.getParameter("MULTIPLIER");

socsec = request.getParameter("SOCSEC");

integerMult = new Integer(strMult);multiplier = integerMult.intValue();

bonus = 100.00;

%>

Variables Predefinidas

Un scriptlet puede usar las siguientes variables predefinidas: session , request,response , out , e in. Este ejemplo usa la variable predefinida request, que es unobjeto HttpServletRequest. De igual forma, response es un objetoHttpServletResponse, out es un objeto PrintWriter, e in es un objetoBufferedReader.

Las variables predefinidas se usan en los scriptlets de la misma forma que se usan en losservelts, excepto que no las declaramos.

<%

strMult = request.getParameter("MULTIPLIER");

socsec = request.getParameter("SOCSEC");

integerMult = new Integer(strMult);

multiplier = integerMult.intValue();

bonus = 100.00;

%>

Expresiones

La expresiones JSP nos permiten recuperar dinámicamente o calcular valores a insertardirectamente en la página JSP. En este ejemplo, una expresión recupera el número de laseguridad social desde el bean de entidad Bonus y lo pone en la página JSP.

<H1>Bonus Calculation</H1>

Social security number retrieved:

<%= record.getSocSec() %><P>

Bonus Amount retrieved: <%= record.getBonus() %>

<P>

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (4 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 56/95

Etiquetas Especificas de JSP

La especificación JavaServer Pages 1.1 define etiquetas específicas de JSP que nospermiten extender la implementación JSP con nuevas características y ocultar muchacomplejidad a los diseñadores visuales que necesitan buscar la página JSP y modificarla.El ejemplo JSP de esta lección no usa ninguna de estas etiquetas específicas, pero lasveremos en la siguiente lección. Las etiquetas específicas JSP definidas en laespecificación 1.1 son las siguientes:

sp:forward y jsp:include para instruir al motor JSP que pase de la página actual aotra página JSP.

sp:useBean, jsp:setProperty, jsp:getProperty nos permiten embeber y utilizartecnología JavaBeans en páginas JSP.

sp:plugin descarga automáticamente el Plug-In Java al cliente para ejecutar applet enla plataforma Java adecuada.

Modificar bonus.htmlEl único cambio que necesitamos hacer a bonus.html es hacer que el parametroACTION del formulario HTML invoque a Bonus.jsp en lugar de a BonusServlet .

<HTML>

<BODY BGCOLOR = "WHITE">

<BLOCKQUOTE>

<H3>Bonus Calculation</H3>

<FORM METHOD="GET" ACTION="Bonus.jsp"><P>

Enter social security Number:

<P><INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT>

<P>

Enter Multiplier:

<P>

<INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>

<P>

<INPUT TYPE="SUBMIT" VALUE="Submit">

<INPUT TYPE="RESET">

</FORM>

</FORM>

</BLOCKQUOTE></BODY>

</HTML>

Arrancar la Plataforma y las HerramientasPara ejecutar este ejemplo, necesitamos arrancar el servidor J2EE, la herramientaDeploy, y la base de datos Cloudscape. En diferentes ventanas, tecleamos los siguientescomandos:

j2ee -verbosedeploytool

cloudscape -start

Si esto no funciona, tecleamos esto desde el directorio J2EE:

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (5 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 57/95

Unix

j2sdkee1.2.1/bin/j2ee -verbose

j2sdkee1.2.1/bin/deploytool

j2sdkee1.2.1/bin/cloudscape -start

Windowsj2sdkee1.2.1\bin\j2ee -verbose

j2sdkee1.2.1\bin\deploytool

j2sdkee1.2.1\bin\cloudscape -start

Eliminar el Fichero WARComo se ha añadido una página JSP al componente Web, tenemos que borrar el fichero

WAR de las lecciones anteriores y crear uno nuevo con la página JSP.

Local Applications:

Pulsar el icono 2BeansApp para poder ver los componentes de nuestra aplicación.q

Seleccionamos BonusWar para que se ilumine.q

Seleccionamos Delete desde el menú Edit.q

Crear el Nuevo Fichero WAR

Menú File:

Seleccionamos New Web Componentq

Introduction:

Leemos y pulsamos Next .q

War File General Properties :

Nota:Parece que hay un bug en la herramienta Deploy. Debemosasegurarnos de añadir primero Bonus.jsp seguido de bonus.html. Si

añadimos primero bonus.html, la herramienta Deploy ponebonus.html donde debería ir Bonus.jsp y Bonus.jsp donde deberíair bonus.html. Si esto sucede, podemos corregirlo manualmentecopiándolos en las localizaciones correctas. Así es como deben estardespués del despliegue:

~/j2sdkee1.2/public_html/JSPRoot/bonus.html~/j2sdkee1.2/public_html/JSPRoot/WEB-INF/classes/Bonus.jsp

Especificamos BonusWar para el nombre de display.q

Pulsamos Addq

Vamos al directorio ClientCode y añadimos Bonus.jsp,q

Pulsamos Nextq

Vamos al directorio ClientCode y añadimos bonus.htmlq

Pulsamos Finish .q

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (6 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 58/95

Propiedades Generales del Fichero War:

Pulsamos Next.q

Elegir el tipo de Componente: .

Seleccionamos Describe a JSP .q

Pulsamos Next.q

Propiedades generales del Componente:

Ponemos Bonus.jsp como nombre de fichero JSP.q

Ponemos BonusJSP como nombre de display.q

Pulsamos Finish .q

Ventana Inspecting:

Seleccionamos Web Contextq

Especificamos JSPRoot.q

Verificar y Desplegar la Aplicación J2EEAntes de desplegar la aplicación, es una buena idea ejecutar el verificador. El verificadormostrará los errores en los componentes de la aplicación como métodos inexistentes queel compilador no captura.

Verificar:

Con 2BeansApp seleccionado, elegimos Verifier desde el menú Tools.q

En el diálogo que aparece, pulsamos OK. La ventana debería decir que no hayningún fallo.

q

Cerramos la ventana del verificador porque ahora estamos listos para desplegar la

aplicación.

q

Nota:En la versión 1.2.1 del software podríamos obtener un error testsapp.WebURI . Esto significa que la herramienta DeployTool no puso laextensión .war al fichero WAR durante su creacción. Es un errormenor y la aplicación J2EE se despliega sin problemas.

Desplegar:

Desde el menú Tools, elegimos Deploy Application. Se mostrará una caja dediálogo Deploy BonusApp.

q

Verificar que la selección de Target Server es un host local o el nombre de unhost donde se está ejecutando el servidor J2EE.

q

Nota:No marcamos la caja "Return Client Jar". El único momento en quedebemos chequear esta caja es cuando usamos persistenciacontrolada por el bean o desplegamos una aplicación solitaria para elprograma cliente. Este ejemplo usa un servlet y una página HTML porlo que no debe estár marcada. Esta caja crea un fichero JAR con todala información de despliegue necesaria para una aplicación solitaria.

Pulsamos Next .q

Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean ybonus para BonusBean. Si no es así, tecleamos los nombres JNDI nosotrosmismos, y pulsamos la tecla Return.

q

Pulsamos Next. Nos aseguramos de que el nombre Context Root muestraJSPRoot. Si no es así, lo tecleamos nosotros mismos y pulsamos la tecla Return.

q

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (7 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 59/95

Pulsamos Next .q

Pulsamos Finish para empezar el despliegue. Se mostrará una caja de diálogo quemostrará el estado de la operación de despliegue.

q

Cuando se haya completado, las tres barras de la izquierda se habrán sombreadocompletamente, como se ve en la Figura 16. Cuando esto suceda pulsamos OK .

q

Despliegue de la Aplicación

Ejecutar la Aplicación J2EEEl servidor web se ejecuta por defecto en el puerto 8000. Para abrir la páginabonus.html apuntamos nuestro navegador ahttp:/ / localhost:8000/ JSPRoot/ bonus.html, que es dónde la herramienta dedespliegue puso el fichero HTML.

Nota:La Herramienta Deploy pone Bonus.jsp bajo public_html/ JSPRoot, y bonus.html bajo public_html/ JSPRoot/ WEB-INF/ classes,que es lo opuesto a donde realmente pertenecen. Manualmente los

copiamos en sus localizaciones correctas como siguepublic_html/ JSPRoot/ bonus.html ypublic_html/ JSPRoot/ WEB-INF/ classes/ Bonus.jsp.

Rellenamos un número de la seguridad social y un multiplicador.q

Pulsamos el botón Submit. Bonus.jsp procesa nuestros datos y devuelve unapágina HTML con el bono calculado.

q

Bonus Calculation

Social Security number retrieved: 777777777

Bonus Amount Retrieved: 200.0

Si hemos suministrado dos veces el mismo número de la seguridad social, veremos algosimilar a esto:

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (8 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 60/95

Bonus Calculation

Soc Sec passed in: 777777777

Multiplier passed in: 2

Error: Duplicate primary key

Más Información

Otra forma de usar la tecnología JavaServer Pages es en combinación con la tecnologíaJavaBeans™ donde la página JSP presenta un formulario al usuario y llama al JavaBeanpara procesar los datos introducidos en el formulario. Puedes ver un ejemplo en lasiguiente dirección J2EE Developer's Guide (en inglés)

En esta otra dirección podrás encontrar una excelente explicación (en Inglés) sobre lastecnologías JavaServer Pages y JavaBeans: Buiding Your Own JSP Components

Código Fuente de los EjemplosAquí tienes un fichero Zip con los ficheros fuente de los ejemplos de esta página:

fuentes_L4.zip

[<< Anterior] [Inicio] [Siguiente >>]

Tecnología JavaServer Pages™ (JSP)

http://usuarios.tripod.es/Ozito/j2ee/jsp.html (9 de 9) [18/03/2001 23:35:00]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 61/95

Java 2 Enterprise Edition

[<< Anterior] [Inicio] [Siguiente>>]

Tecnología JavaBeansPodemos usar la tecnología JavaBeans™ para poner un JavaBean entre una página JSP yel bean de sesión CalcBean para obtener una mejor separación "Model, View, Controller(MVC)". MVC es un patrón de diseño que consiste en tres tipos de objetos. El Modeloproporciona la lógica de negocio de la aplicacón, la Vista es la presentación en pantalla, yel Controlador es un objeto que maneja lo que sucede cuando el usuario interactúa con

la Vista. Un patrón de diseño describe un problema recurrente y sus soluciones cuando lasolución no es siempre exactamente la misma para cada recurrencia.

La lección sobre Tecnología JSP se configuró para que las páginas HTML y JSPproporcionaran la presentación en pantalla (Vista) y manejar lo que sucedia cuando elusuario interactúa con los datos (Controlador). Los beans de entidad y de sesión (BonusBean y CalcBean) son los objetos de la aplicación o Modelo.

Esta lección usa una página JSP para la presentación en pantalla (View), un JavaBeanpara manejar lo que sucede cuando el usuario interactúa con la vista (Controlador), y losbeans de entidad y de sesión para los objetos de aplicación (Modelo). Separando elControlador de la Vista permite al JavaBean servir como una envoltura para el bean de

sesión y ofrece un ejemplo mucho más claro de la separación MVC. Una aplicación queusa patrones de diseño es mucho más sencilla de actualizar, mantener y manejar.

Sobre el Ejemploq

Crear bonus.jspq

Crear las clases JavaBeanq

Propiedades del Beanq

Eliminar el Fichero WARq

Crear el Nuevo Fichero WARq

Verificar y Desplegar la Aplicación J2EEq

Ejecutar la Aplicación J2EEq

Más Informaciónq

Código fuente de los ejemplos de la lecciónq

Sobre el EjemploEn la Lección anterior, el interface de usuario de la aplicación consiste en una página

HTML con un formulario HTML. El formulario llama a la página JSP cuando el usuariopulsa el botón Submit de la página HTML.

Otra forma de crear el interface de usuario es con una página JSP que incluya elformulario HTML, scriptlets JSP, y etiquetas específicas JSP para interactúar con el

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (1 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 62/95

JavaBean. Cuando se carga la página JSP, se muestra el formulario HTML y se ejecutanlos escriptlets y las etiquetas especificas JSP para interactuar con el JavaBean. Comotodavía no se han suministrado datos, la pantalla se parecerá a la de la figura Figura 17:

Cuando se Carga bonus.jsp

Cuando el usuario introduce algún dato y pulsa el botón Submit, se vuelve a mostrar elformulario HTML, y se ejecutan de nuevo los scriptlets y las etiquetas especificas JSP conlos datos suministrados. La pantalla se parecería algo a la de la Figura 18. Esto esporque el parámetro ACTION del formulario HTML de bonus.jsp se llama a sí mismo de

forma recursiva.

Después de que el usuario introduzca datos y Pulse Submit

Si el usuario introduce el mismo número de la seguridad social, se devuelve un error declave duplicada y se muestra sobre la página JSP como se muestra en la Figura 19.

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (2 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 63/95

Error de Clave Duplicada

Crear bonus.jspEl código de bonus.jsp es bastante sencillo poque el código que busca el bean de sesióny calcula el bono está ahora en el JavaBean. La primera parte del fichero contiene elcódigo HTML para crear el formulario. El código para pasar los datos del formulario HTMLal JavaBean está en la segunda parte del fichero. Abajo podemos ver el ficherobonus.jsp completo:

<HTML><BODY BGCOLOR = "WHITE"><HEAD><TITLE>Bonus Calculation</TITLE></HEAD>

<BLOCKQUOTE><H3>Bonus Calculation</H3>

<!--ACTION parameter calls this page-->

<FORM METHOD="GET" ACTION="bonus.jsp">

<P>Enter social security Number:<P><INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT><P>

Enter Multiplier:<P><INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>

<P><INPUT TYPE="SUBMIT" VALUE="Submit"><INPUT TYPE="RESET"></FORM>

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (3 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 64/95

<!--Scriptlet and JavaBeans Tags start here --><jsp:useBean id = "jbonus" class = "JBonusBean"/>

<%! String sMult, ssec; %><%sMult = request.getParameter("MULTIPLIER");ssec = request.getParameter("SOCSEC");%>

<jsp:setProperty name = "jbonus" property="strMult"value="<%=sMult%>"/><jsp:setProperty name = "jbonus" property="socsec"value="<%=ssec%>"/>

Social security number retrieved:<jsp:getProperty name="jbonus" property="socsec"/>

<P>Bonus Amount retrieved:<jsp:getProperty name="jbonus" property="bonusAmt"/>

<P>Error messages:<jsp:getProperty name = "jbonus" property="message"/>

</BLOCKQUOTE></BODY></HTML>

Especificar el JavaBean

La siguiente etiqueta HTML especifica el JavaBean que se esta utilizando en esteejemplo. El parámetro id define un alias para usarlo como referencia al JavaBean, y elparámetro class especifica la clase JavaBean. En este ejemplo el id es jbonus y elclass es JBonusBean .

<jsp:useBean id = "jbonus" class = "JBonusBean"/>

Obtener los Datos

Los siguientes scriptlets JSP recuperan los datos suministrados por el usuario desde los

campos del formulario HTML. El multiplicador se almacena en la variable sMult String, yel número de la seguridad social en la variable ssec String.

<%! String sMult, ssec; %><%sMult = request.getParameter("MULTIPLIER");ssec = request.getParameter("SOCSEC");%>

Pasar los Datos al JavaBean

Las siguientes etiquetas HTML configuran dos propiedades del JavaBean. Una propiedades un campo privado de la clase JavaBean. La primera línea usa la etiquetasp:setProperty para configurar el campo strMult en la clase JBonusBean (con el

alias jbonus id) al valor almacenado en la variable sMult. La segunda línea realiza unaoperación similar para el campo socsec de la clase JBonusBean .

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (4 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 65/95

<jsp:setProperty name = "jbonus" property="strMult" value="<%=sMult%>"/><jsp:setProperty name = "jbonus" property="socsec" value="<%=ssec%>"/>

La expresión value="<%=ssec%>" envía el dato contenido en la variable ssec alcampo socsec del JavaBean.

Recuperar los Datos desde el JavaBean

Recuperar los datos desde el JavaBean es similar a enviárselos. Usamos la etiquetasp:getProperty e indicamos la propiedad (campo privado) cuyo dato queremos

obtener. La siguiente etiqueta getProperty obtiene el dato almacenado en el campoprivado socsec de la clase JBonusBean (con el alias jbonus id ).

Social security number retrieved:<jsp:getProperty name="jbonus" property="socsec"/>

Las siguientes etiquetas realizan operaciones similares para los campos bonusAmt ymessage de la clase JBonusBean .

<P>Bonus Amount retrieved:<jsp:getProperty name="jbonus" property="bonusAmt"/>

<P>Error messages:<jsp:getProperty name = "jbonus" property="message"/>

Crear la Clase JavaBeanUna clase JavaBeans™ (o bean para acortar) se parece a cualquier clase normal dellenguaje Java™. Pero para ser un bean, una clase JavaBean debe seguir un conjunto desencillas convenciones de nombres y diseño explicados en la especificación JavaBeans.Como los Beans cumplen la especifiación JavaBean, pueden ser accedidos y manejadospor otros programas y herramientas que cumplan las mismas convenciones.

En la sección Crear bonus.jsp, se utilizarón etiquetas HTML y scriptlets JSP para obtenery seleccionar los datos privados de la clase JBonusBean . Esto es posible porque la claseJBonusBean sigue las convenciones de nombrado y diseño de JavaBeans.

Esta sección describe el código de JBonusBean y nos ofrece una sencilla presentaciónde la tecnología JavaBeans cuando se usa con páginas JSP.

Aquí tenemos la clase JBonusBean completa.

import javax.naming.*;

import javax.rmi.PortableRemoteObject;

import Beans.*;

public class JBonusBean {

private String strMult, socsec, message;

private double bonusAmt;

CalcHome homecalc;

public JBonusBean() {

try{

InitialContext ctx = new InitialContext();

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (5 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 66/95

Object objref = ctx.lookup("calcs");

homecalc = (CalcHome)

PortableRemoteObject.narrow(

objref, CalcHome.class);

} catch (javax.naming.NamingException e) {

e.printStackTrace();

}

}

public double getBonusAmt() {

if(strMult != null){Integer integerMult = new Integer(strMult);

int multiplier = integerMult.intValue();

try {

double bonus = 100.00;

Calc theCalculation = homecalc.create();

Bonus theBonus = theCalculation.calcBonus(

multiplier, bonus, socsec);

Bonus record = theCalculation.getRecord(

socsec);

bonusAmt = record.getBonus();

socsec = record.getSocSec();

} catch (javax.ejb.DuplicateKeyException e) {

message = e.getMessage();

} catch (javax.ejb.CreateException e) {

e.printStackTrace();

} catch (java.rmi.RemoteException e) {

e.printStackTrace();

}

return this.bonusAmt;

} else {

this.bonusAmt = 0;

this.message = "None.";

return this.bonusAmt;}

}

public String getMessage(){

return this.message;

}

public String getSocsec(){

return this.socsec;

}

public String getStrMult(){

return this.strMult;

}

public void setSocsec(String socsec) {

this.socsec = socsec;

}

public void setStrMult(String strMult) {

this.strMult = strMult;

}

}

Propiedades del Bean

Las propiedades definen los datos que un JavaBean pone a disposición de otrosprogramas o herramientas a través de métodos get o set. Los datos podrían hacer cosascomo definir la apariencia o el comportamiento del JavaBean, o utilizarse para algúncálculo, etc. Las propiedades realmente son campos privados de la clase que siempre

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (6 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 67/95

deberían ser privados y sólo accesibles a través de métodos set y get.

El siguiente segmento de código muestra las propiedades privadas de la claseJBonusBean. Esta clase tiene un correspondiente método get<property> para cadacampo y sus correspondientes métodos set<property> para los campos strMult ysocsec.

public class JBonusBean {

private String strMult, socsec, message;

private double bonusAmt;

Constructor

El constructor JBonusBean busca el bean de sesión.

public JBonusBean() {

try{

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("calcs");

homecalc = (CalcHome)PortableRemoteObject.narrow(

objref, CalcHome.class);

} catch (javax.naming.NamingException e) {

e.printStackTrace();

}

}

Métodos Set

JBonusBean tiene dos métodos set (métodos precedidos por la palabra set). Estos

métodos seleccionan propiedades (campos privados) con valores especificados. Los dosmétodos set son setSocsec y setStrMult para seleccionar los campos privados socsecy strMult (propiedades JavaBean) .

En este ejemplo, los valores usados para las propiedades socsec y strMult vienen delas etiquetas setProperty name de la página JSP. El servidor J2EE usa la informaciónsuministrada en la siguiente etiqueta setProperty name para localizar elcorrespondiente método set en JBonusBean (con el alias jbonus id ):

<jsp:setProperty name = "jbonus" property="strMult" value="<%=sMult%>"/>

<jsp:setProperty name = "jbonus" property="socsec"value="<%=ssec%>"/>

En la clase JBonusBean , los métodos set<property> siguen las convenciones denombrado para que el servidor J2EE pueda mapear las etiquetas setProperty name delfichero JSP a los métodos set<property> correctos para pasar los datos desde lapágina JSP al JavaBean.

Con los métodos set, el nombre de método consiste en la palabra set y el nombre de lapropiedad. El nombre de la propiedad es el nombre de uno de los campos privados deJBonusBean. Mientras que los nombres de campos por convención empiezan siemprecon una letra minúscula, la segunda palabra de un nombre de método siempre empiezacon una máyuscula. Por eso, para seleccionar el campo privado socsec, el nombre delmétodo es setSocsec. El servidor J2EE mapea la mayúscula de Socsec en el nombredel método a la minúscula socsec del campo. Los métodos set no tienen valor deretorno y tienen un argumento del tipo apropiado.</p>

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (7 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 68/95

public void setSocsec(String socsec) {

this.socsec = socsec;

}

public void setStrMult(String strMult) {

this.strMult = strMult;

}

Métodos Get

JBonusBean tiene cuatro métodos get (métodos precedidos por la palabra get ). Losmétodos Get obtienen y devuelven un valor de propiedad (valores de campos privados).Los cuatro métodos get son getBonusAmt, getMessage, getSocsec, y getStrMultpara devolver datos desde los campos privados bonusAmt, message , socsec , ystrMult (propiedades JavaBean).

En este ejemplo, los valores usados para seleccionar los campos bonusAmt y messagevienen desde el método getBonusAmt. La página JSP recupera los datos de laspropiedades de JBonusBean usando las siguientes etiquetas getProperty name. Lapágina JSP sólo recupera los valores que le interesan, por eso podríamos observar que

aunque hay una propiedad en JBonusBean para el multiplicador (el campo strMult),este valor no es recuperado por la página JSP.

Social security number retrieved:<jsp:getProperty name="jbonus" property="socsec"/>

<P>Bonus Amount retrieved:<jsp:getProperty name="jbonus" property="bonusAmt"/>

<P>

Error messages:<jsp:getProperty name = "jbonus" property="message"/>

Los métodos Get siguen las mismas convenciones de nombres que los métodos Set poreso la página JSP puede recuperar los datos del JBonusBean . Los métodos Get siempretienen un valor de retorno y no tienen argumentos. Podríamos observar que aunque elmétodo getBonusAmt seleccciona valores de propiedades, realmente no necesitadevolver ningún valor en este ejemplo, devuelve this.bonusAmt para evitar un error entiempo de ejecución del servidor J2EE.

El método getBonusAmt usa una sentencia if-else para manejar el caso cuando no sesuministra ningún valor strMult. Cuando la página JSP se carga por primera vez, elusuario final no ha suministrado ningún dato, pero todas las etiquetas y scriptlets de lapágina son ejecutados de cualquier forma. En este caso, el valor de la propiedad strMultpasada a JBonusBean es null, lo que resulta en un multiplicador nulo y un valor nulode bonusAmt. Ocurre un error de servidor cuando la página JSP obtiene e intentamostrar el valor null de bonusAmt. Para evitar este error, bonusAmt se selecciona acero en el caso de que se reciba un valor null desde la página JSP.

public double getBonusAmt() {

if(strMult != null){

Integer integerMult = new Integer(strMult);

int multiplier = integerMult.intValue();

try {double bonus = 100.00;

Calc theCalculation = homecalc.create();

Bonus theBonus = theCalculation.calcBonus(

multiplier, bonus, socsec);

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (8 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 69/95

Bonus record = theCalculation.getRecord(

socsec);

bonusAmt = record.getBonus();

socsec = record.getSocSec();

} catch (javax.ejb.DuplicateKeyException e) {

message = e.getMessage();

} catch (javax.ejb.CreateException e) {

e.printStackTrace();

} catch (java.rmi.RemoteException e) {

e.printStackTrace();}

return this.bonusAmt;

} else {

this.bonusAmt = 0;

this.message = "None.";

return this.bonusAmt;

}

}

public String getMessage(){

return this.message;

}

public String getSocsec(){

return this.socsec;

}

public String getStrMult(){

return this.strMult;

}

public void setSocsec(String socsec) {

this.socsec = socsec;

}

public void setStrMult(String strMult) {

this.strMult = strMult;

}

Arrancar la Plataforma y las HerramientasPara ejecutar este ejemplo, necesitamos arrancar el servidor J2EE, la herramientaDeploy, y la base de datos Cloudscape. En diferentes ventanas, tecleamos los siguientescomandos:

j2ee -verbose

deploytool

cloudscape -start

Si esto no funciona, tecleamos esto desde el directorio J2EE:

Unix

j2sdkee1.2.1/bin/j2ee -verbose

j2sdkee1.2.1/bin/deploytool

j2sdkee1.2.1/bin/cloudscape -start

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (9 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 70/95

Windows

j2sdkee1.2.1\bin\j2ee -verbose

j2sdkee1.2.1\bin\deploytool

j2sdkee1.2.1\bin\cloudscape -start

Eliminar el Fichero WARComo se ha añadido una página JSP al componente Web, tenemos que borrar el ficheroWAR de las lecciones anteriores y crear uno nuevo con la página JSP.

Local Applications:

Pulsar el icono 2BeansApp para poder ver los componentes de nuestra aplicación.q

Seleccionamos BonusWar para que se ilumine.q

Seleccionamos Delete desde el menú Edit.q

Crear el Nuevo Fichero WARMenú File:

Seleccionamos New Web Componentq

Introduction:

Leemos y pulsamos Next .q

War File General Properties :

Especificamos BonusWar para el nombre de display.q

Pulsamos Addq

Vamos al directorio ClientCode y añadimos Bonus.jsp,q

Pulsamos Nextq

Vamos al directorio ClientCode y añadimos JBonusBean.classq

Pulsamos Finish .q

Propiedades Generales del Fichero War:

Pulsamos Next.q

Elegir el tipo de Componente: .Seleccionamos Describe a JSP .q

Pulsamos Next.q

Propiedades generales del Componente:

Ponemos Bonus.jsp como nombre de fichero JSP.q

Ponemos BonusJSP como nombre de display.q

Pulsamos Finish .q

Ventana Inspecting:

Seleccionamos Web Contextq

Especificamos JSPRoot.q

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (10 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 71/95

Verificar y Desplegar la Aplicación J2EEAntes de desplegar la aplicación, es una buena idea ejecutar el verificador. El verificadormostrará los errores en los componentes de la aplicación como métodos inexistentes queel compilador no captura.

Verificar:

Con 2BeansApp seleccionado, elegimos Verifier desde el menú Tools.q

En el diálogo que aparece, pulsamos OK. La ventana debería decir que no hayningún fallo.

q

Cerramos la ventana del verificador porque ahora estamos listos para desplegar laaplicación.

q

Nota:En la versión 1.2.1 del software podríamos obtener un error testsapp.WebURI . Esto significa que la herramienta DeployTool no puso laextensión .war al fichero WAR durante su creacción. Es un errormenor y la aplicación J2EE se despliega sin problemas.

Desplegar:Desde el menú Tools, elegimos Deploy Application. Se mostrará una caja dediálogo Deploy BonusApp.

q

Verificar que la selección de Target Server es un host local o el nombre de unhost donde se está ejecutando el servidor J2EE.

q

Nota:No marcamos la caja "Return Client Jar". El único momento en quedebemos chequear esta caja es cuando usamos persistenciacontrolada por el bean o desplegamos una aplicación solitaria para elprograma cliente. Este ejemplo usa un servlet y una página HTML por

lo que no debe estár marcada. Esta caja crea un fichero JAR con todala información de despliegue necesaria para una aplicación solitaria.

Pulsamos Next .q

Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean ybonus para BonusBean. Si no es así, tecleamos los nombres JNDI nosotrosmismos, y pulsamos la tecla Return.

q

Pulsamos Next. Nos aseguramos de que el nombre Context Root muestraJSPRoot. Si no es así, lo tecleamos nosotros mismos y pulsamos la tecla Return.

q

Pulsamos Next .q

Pulsamos Finish para empezar el despliegue. Se mostrará una caja de diálogo quemostrará el estado de la operación de despliegue.q

Cuando se haya completado, las tres barras de la izquierda se habrán sombreadocompletamente, como se ve en la Figura 16. Cuando esto suceda pulsamos OK .

q

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (11 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 72/95

Desplegar la Aplicación

Ejecutar la Aplicación J2EEEl servidor web se ejecuta por defecto en el puerto 8000. Para abrir la páginabonus.html apuntamos nuestro navegador ahttp:/ / localhost:8000/ JSPRoot/ bonus.html, que es dónde la herramienta dedespliegue puso el fichero HTML.

Rellenamos un número de la seguridad social y un multiplicador.q

Pulsamos el botón Submit. Bonus.jsp procesa nuestros datos y devuelve unapágina HTML con el bono calculado.

q

Bonus Calculation

Social Security number retrieved: 777777777

Bonus Amount Retrieved: 200.0

Si hemos suministrado dos veces el mismo número de la seguridad social, veremos algo

similar a esto:

Bonus Calculation

Soc Sec passed in: 777777777

Multiplier passed in: 2

Error: Duplicate primary key

Más Información

Visita la home page de JavaBeans en la site de sunhttp://java.sun.com/beans/index.html para posterior inormación sobre la tecnologíaJavaBeans.

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (12 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 73/95

Código Fuente de los EjemplosAquí tienes un fichero Zip con los ficheros fuente de los ejemplos de esta página:

fuentes_L5.zip

[<< Anterior] [Inicio] [Siguiente>>]

Tecnología JavaBeans

http://usuarios.tripod.es/Ozito/j2ee/jbeans.html (13 de 13) [18/03/2001 23:35:49]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 74/95

Java 2 Enterprise Edition

[<< Anterior] [Inicio] [Siguiente >>]

Añadir eXtensible Markup Language (XML)eXtensible Markup Language (XML) es un lenguaje para representar y describir datosbasados en texto para que los datos puedan ser leídos y manejados por cualquierprogrma o herramienta que usae los APIs XML. Los programas y herramientas puedengenerar ficheros XML que otros programas y herramientas pueden leer y manejar.

Por ejemplo, una compañía puede usar XML para producir informes para que lasdiferentes partes que reciban los informes puedan manejar los datos de una formaapropiada a sus necesidades. Una parte podría pasar los datos XML a través de unprograma para traducirlos a HTML y poder ponerlos en la Web, otra parte podría pasarlos datos por una herramienta para producir un inform de stocks, y otra tercera partepodría pasar los datos XML a través de una herramienta para crear una presentación demarketing. Mismos datos, diferentes necesidades, y un grupo de programas yherramientas independientes de la plataforma para usar los mismos datos en varisformas distintas. Estas capaciades tan flexibles y baratas están disponibles a través deetiquetas XML, Definiciones de Tipos de Documentos (DTDs) también conocidos comesquemas XML, y los APIs XML.

Esta lección adapta el ejemplo de la Lección anterior para que la clase JavaBeans use losAPIs XML para impriir un sencillo informe donde los datos están marcados con etiquetasXML.

Marcar y Manejar Textoq

Modificar la Clase JavaBeanq

Los APIsq

Actualizar y Ejecutar la Aplicaciónq

Más Informaciónq

Código fuente de los ejemplos de la lecciónq

Marcar y Manejar TextoCon XML definimos etiquetas de marcas para representar diferentes elementos de datosen un fichero de texto. Por ejemplo, si tenemos un fichero de texto que consiste en unpequeño artículo, definimos etiquets que represente el título, el autor, las cabeceras deprimer nivel, las cabeceras de segundo nivel, las listas bulleteadas, el texto del artículo,etc. Una vez que los datos están representados por etiquetas XML, podemos crear unaDefinición de Tipo de Documento (DTD) y/o un fichero "eXtensible Style sheet Language

(XSL)" para describir cómo queremos que se manejen los datos.Los estilos XSL nos pemiten hacer cosas como el mapeo de XML a HTML. Porejemplo, podemos definir una etiqueta de título XML para que represente el títulode un artículo, y crear un fichero XSL que mapee la etiqueta de título CML a unaetiqueta H1 de HTML para mostrarselo al usuario final.

q

Añadir eXtensible Markup Language (XML)

http://usuarios.tripod.es/Ozito/j2ee/xml.html (1 de 7) [18/03/2001 23:36:26]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 75/95

Un DTD (también conocido como esquema XML) contiene especificaciones quepermiten a otros programa validad la estructura de un fichero XML para asegurarseque los datos están etiquetados de la forma correcta. Por eemplo, un DTD para unartículo podría permitir una etiqueta de título, pero cero o más primeros ysegundos niveles de cabeceras.

q

Cualquier programa capaz de analizar XML puede chequear etiquetas XMLbien-formadas, y cualquier programa capaz de aplicar estilos XLS o especificaciones DTDa datos XML puede manejar datos que fueron etiquetados de forma inteligente. Por

ejemplo, si un artículo titne dos etiquetas de título, pero el DTD permite sólo una, elprograma devuelve un error. Chequear un documento XML contra un DTD es lo que seconoce como verificación.

Lo más bonito sobre XML es que el etiquetado está separado de las hojas de estilos yDTD. Esto significa que podemos tener un documento XML y desde a muchas hojas deestilo o DTDs. Diferentes hojas de estilo nos permiten tener diferentes presentacionesdependiendo de cómo se utilice el documento. Por ejemplo, un artículo en XML puedetener una hoja de estilo para diferentes web sites donde se va a publicar para quecorresponda con el aspecto y comportamietno de cada site.

La versión actual de J2EE no tiene un motor de "eXtensible Style sheet Language

Transformation (XSLT)" por eso no es posible actualmente usar una hoja de estilo parahacer cosas como transformar un documento XML en HTML para mostrarlo.

Modificar la Clase JavaBeanEn esta lección, se añade un método genXML a la clase JBonusBean para generar eldocumento XML mostrado abajo. Después de ver las etiquetas y estructura de undocumento XML vermos el código que genera este documento XML.

<?xml version="1.0"?><report>

<bonusCalc ssnum="777777777" bonusAmt="300.0" />

</report>

Prólogo XML

La línea <?xml version="1.0"?> es el prólogo XML. Un fichero XML siempre debeempezar con un prologo que lo identifique como un fichero XML. El prólo no es necesariosi sólo va a ser leído por humanos, pero es buena idea incluirlo. Junto con la informaciónde versión, el prólogo también puede incluir información de codificación e información

"standalone.In formación de Codificación: indica el conjunto de caracteres usado en losdatos del documento. Unicode descomprimido se representa como <?xmlversion="1.0" encoding="UTF-8"?>. El conjunto de caracteres WesternEuropean y lenguaje Inglés se indica como:<?xml version="1.0"encoding="ISO-8859-1"?>.

q

In formación Standalone: idnica si este documento usa información de otrosficheros. Por ejemplo, un documento XML podría relacionarse con una hoja deestilo para infomación sobre cómo crear un interface de usuario e HTML, o un DTDpara especificaciones de etiquetas válidas.

q

Añadir eXtensible Markup Language (XML)

http://usuarios.tripod.es/Ozito/j2ee/xml.html (2 de 7) [18/03/2001 23:36:26]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 76/95

Documento Raíz

La etiqueta <report> es la primera etiqueta XML de este fichero. Es la etiqueta XML demás alto nivel y marca el inicio de los datos del documento. Otro nombre para este nivelde etiqueta es root. Las etiquetas XML tienen su correspondiente etiqueta final, por esoel final de este documento tiene su correspondiente etiqueta </ report> para cerrar lapareja.

Podemos darle a una etiqueta XML cualquier nombre que queramos. Este ejemplo usa

report porque el fichero XML es un informe de bonos. Podría haberse llamado <root> o<begin> o cualquier otra cosa. el nombre tiene significado en la hoja de estilo y en elDTD porque es donde asignamos especificaciones para las etiquetas por sus nombres.

Nodos Hijos

La etiqueta <bonusCalc> representa el informe de bonos. Esta etiqueta es un nodo hijoque se añade al raíz. Usa atributos para especificar el número de la seguridad social y elvalor del bono (ssnum y bonusAmt ). Podemos definir un DTD para chequear que lasetiquetas bonusCalc tienen los atributos ssnum y bonusAmt, y poder hacer que

nuestro programa corriga un error si ha desaparecido algún atributo o si los atributospresentes no deberian estar ahí.

<bonusCalc ssnum="777777777" bonusAmt="300.0" />

Otras Etiquetas XML

Hay varias formas de etiquetar datos XML. Este ejemplo usa etiquetas vacías, que sonetiquetas que no encierran datos, usan atributos para especificar datos, y se cierran conuna barra inclinada. La siguiente etiqueta vacía de este ejemplo, podría crearse para quelos datos se encerraran entre etiquetas XML. El analizador XML chequea todos los datosencerrados por datos que llamados etiquetas bien-formadas. Las etiquetasbien-formadas consisten en una etiqueta de apertura y una de cierre como es muestraen el ejemplo de abajo:

Etiqueta Vacía:<bonusCalc ssnum="777777777" bonusAmt="300.0" />

Etiquetas bien-formadas:<bonusCalc>

<ssnum>"777777777"</ssnum>

<bonusAmt>300.0</bonusAmt></bonusCalc>

Los comentarios XML son como las etiquetas de comentario HTML.

<!-- Bonus Report -->

<bonusCalc ssnum="777777777" bonusAmt="300.0" />

Las instrucciones de procesamiento le dan comandos o información a una aplicación queestá procesando los datos XML. Las instrucciones de procesamiento tienen el formado<? target instructions?> donde target es el nombre de la aplicación que estáhaciendo el procesamient, e instructions encierra la información o comandos para quelos procese la aplicación. El prólogo es un ejemplo de una instrucción de procesamiento,donde xml es la fuente y version="1.0" encierra las instrucciones. Debemos observarque el nombre de fuente xml esta reservado para estándar XML.

<?xml version="1.0"?>

Añadir eXtensible Markup Language (XML)

http://usuarios.tripod.es/Ozito/j2ee/xml.html (3 de 7) [18/03/2001 23:36:26]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 77/95

También podemos usar instrucciones de procesamiento par ahacer cosas como distinguirentre diferentes versiones de una representación como la versión de alto nivel ejecutivoy la versión de nivel técnico.

Código del JavaBean

La clase JBonusBean para esta lección tiene sentencias import para crear eldocumento XML, manejar errores, y escribir el documento en el terminal. Esta lección

escribe la salida del XML en el terminal para mantener las cosas sencillas. Tambiénpodría escribirse en un fichero, pero necesitaríamos configutrar nuestro navegador parausar el Java Plug-In e incluir un fichero de policía de seguridad que concediera permisopara escribir un fichero.

Para generar el fichero XML para esta lección, necesitamos importar las clasesElementNode y XmlDocument. También necesitamos las clases StringWriter eIOException para escribir datos XML en el terminal.

import javax.naming.*;

import javax.rmi.PortableRemoteObject;

import Beans.*;

import java.io.StringWriter;

import java.io.IOException;

import com.sun.xml.tree.ElementNode;

import com.sun.xml.tree.XmlDocument;

Esta versión de la clase JBonusBean tiene una variable más de ejemplar. El interfaceremoto del bean de sesión, theCalculation, necesita ser accedido desde los métodosgetBonusAmt y genXML. Esto es porque genXML lee la base de datos para generarXML para todos los registros almacenados ene lla y tiene que poder acceder al métodogetRecord del bean de sesión.

Calc theCalculation;

El método JBonusBean .genXML es llamado desde el método getBonusAmt despuésde que el proceso se complete en el evento strMult y no sea null . Lo prmero que estemétodo hace es crear un objeto XMLDocument y el nodo raíz, y añade la raíz aldocumento. El nodo raíz represetna el punto de más alto nivel en el árbol del documentoy es el punto donde empieza el procesamiento.

private void genXML(){

Bonus records = null;

//Create XML document

XmlDocument doc = new XmlDocument();

//Create nodeElementNode root = (ElementNode)

doc.createElement("report");

//Add node to XML document

doc.appendChild(root);

 

Los bloques try y catch que vienen luego, obtienen el registro de la base de datos,recuperar el valor del bono y el número de la seguridad social desde el registro,convierte el valor del bono a un string, crea un nodo hijo (bonusCalc ), y añade elnúmero de la seguridad social y el bono al nodo hijo bonusCalc como atributos. El nodo

hijo epresenta la herencia o árbol, y los atributos representan el tercer nivel.

try{

//Get database record

records = theCalculation.getRecord(socsec);

Añadir eXtensible Markup Language (XML)

http://usuarios.tripod.es/Ozito/j2ee/xml.html (4 de 7) [18/03/2001 23:36:26]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 78/95

//Retrieve the social security number from record

String ssRetrieved = records.getSocSec();

//Retrieve bonus amount from record

double bRetrieved = records.getBonus();

//Convert double to string

Double bonusObj = new Double(bRetrieved);

String bString = bonusObj.toString();

//Create child node

ElementNode bonusCalc = (ElementNode)

doc.createElement("bonusCalc");//Add attributes to child node

bonusCalc.setAttribute("ssnum", ssRetrieved);

bonusCalc.setAttribute("bonusAmt", bString);

//Add child node to root

root.appendChild(bonusCalc);

} catch (java.rmi.RemoteException e) {

e.printStackTrace();

}

La última parte del método genXML crea un objeto StringWriter, escribe la herenciadel documento o árbol al objeto StringWriter, y escribe el objeto StringWriter al

terminal.

try{

StringWriter out = new StringWriter();

doc.write(out);

System.out.println(out);

} catch (java.io.FileNotFoundException fe) {

System.out.println("Cannot write XML");

} catch (IOException ioe) {

System.out.println("cannot write XML");

}

El árbol o estructura del documento XML se llama Document Object Model (DOM). LaFigura 21 muestra una representación simplificada del DOM del ejemplo de esta lección.Las llamadas al API en el método genXML crea el DOM y podemos aplicar las llamadasal API para acceder al DOM paa hacer cosas como añadir, borrar y editar nodos hijos, ovalidar el DOM contra un DTD. Podemos crear un DOM desde un fichero XML.

Document Object Model (DOM)

Añadir eXtensible Markup Language (XML)

http://usuarios.tripod.es/Ozito/j2ee/xml.html (5 de 7) [18/03/2001 23:36:26]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 79/95

Los APIsEl fichero j2ee.jar que viene con nuestra instalación J2EE proporciona APIs para analizary manipular datos XML. El fichero JAR realmente prporciona APIs XML para SAX, DOM yJ2EE. Podemos usar cuaquier API que necesitmos como se muestra en la Figura 22, eltexto XML es independiente de la plataforma y el lenguaje de creacción...

Texto Neutral al Lenguaje y a la Plataforma

SAX y DOM

El API SAX es un mecanismo de acceso serial dirigido por eventos que hace un procesoelemento por elemento.

El API DOM proporciona una estructura de objetos del tipo árbol relativamente familiar.Podemos usar el API DOM para manipular la herencia de los objetos que encapsula. ElAPI DOM es ideal para aplicaciones interactivas porque el modelo completo del objetoestá presente en la memoria, donde el usuario puede acceder a él y modificarlo.

Construir el DOM requiere la lectura de la estructura XML completa y mantener el árbolde objetos en memoria, lo que significa mucho consumo de CPU y de memoria. Por estarazón, se tiende a preferir el API SAX para aplicaciones cliente-servidor y para filtros dedatos que no requieren una representación de los datos en memoria.

Nota:Puedes encontrar más información en la sección Java y XML delTutorJava

J2EE

el API XML J2EE independiente de la plataforma usa un árbol DOM y proporciona muchosmétodos para manipularlo. los APIs XML J2EE están en el paquete com.sun y se hanutilizado en el ejemplo de esta lección. No olvidemos que estos APIs están sujetos amodificaciones.

Actualizar y Ejecutar la AplicaciónComo todo lo que hemos hecho en esta lección ha sido modificar la clase JBonusBean ,simplementen podemos actualizar y redesplegar la aplicación.

Ventana Local Applicatons: Seleccionamos la aplicación 2BeansApp.q

Menú Tools: Seleccionamos Update and Redeploy Application.q

Añadir eXtensible Markup Language (XML)

http://usuarios.tripod.es/Ozito/j2ee/xml.html (6 de 7) [18/03/2001 23:36:26]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 80/95

Nota:La aplicación BonusApp de la lección anterior se desinstalaautomáticamente.

El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página bonus.jspapuntamos el navegador a http:/ / localhost:8000/ JSPRoot/ bonus.jsp, que es dondela herramietna Deploy puso la página JSP.

Rellenamos un número de la seguridad social y un multiplicador.q

Pulsamos el botón Submit. Bonus.jsp procesa nuestros datos y devuelve unapágina HTML con el bono calculado.q

Más InformaciónHay mucha información sobre XML en la Web a la que podemos acceder con buen motorde búsqueda. Un muy buen sitio es www.xml.com, y la sección la sección Java y XML deeste TutorJava.

Código Fuente de los EjemplosAquí tienes un fichero Zip con los ficheros fuente de los ejemplos de esta página:

fuentes_L6.zip

[<< Anterior] [Inicio] [Siguiente >>]

Añadir eXtensible Markup Language (XML)

http://usuarios.tripod.es/Ozito/j2ee/xml.html (7 de 7) [18/03/2001 23:36:26]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 81/95

Java 2 Enterprise Edition

[<< Anterior] [Inicio] [TutorJava]

Añadir JDBCHasta ahora, la aplicación de ejemplo J2EE ha escrito y leído los datos desde una basede datos Cloudscape subyancente sin que hayamos escrito código SQL. Esto es porqueel contenedor ha estado manejando el almacenamiento y recuperación de los datos através del bean de entidad. La persistencia controlada por el contenedor es el terminousado para describir la situación donde el contenedor maneja el almacenamiento y la

recuperación. Esta lección nos muestra como sobreescribir la persistencia controlada porel contenedor por defecto e implementar la persistencia controlada por el bean.

La persistencia controlada por el bean es cuando nosotros escribimos métodos de losbeans de entidad o de sesión para usar los comandos SQL que le proporcionamos. Laperistencia controlada por el bean puede ser util si necesitamos mejorar el rendimiento omapear datos de varios beans en un fila de una tabla de base de datos.

Esta lección modifica el bean de entidad de la aplicación de ejemplo J2EE para usarpersistencia controlada por el bean.

Ciclo de Vida del Beanq

Modificar el código de BonusBeanq

Modificar el Código de CalcBean y JBonusBeanq

Crear la Tabla de la Base de Datosq

Eliminar el Fichero JARq

Verificar y Desplegar la Aplicaciónq

Ejecutar la Aplicaciónq

Más Informaciónq

Código fuente de los ejemplos de la lecciónq

Ciclo de Vida del BeanLa Lección 3 mostraba la clase BonusBean manejada por el contenedor. Los únicosmétodos con implementaciones eran getBonus para devolver el valor del bono,getSocSec para devolver el número de la seguridad social, y ejbCreate para crear unbean de entidad y pasarle los valores bonus y socsec. El contenedor tenía en cuentacosas como la creacción de la fila en la tabla de la base de datos, y asegurarse de quelos datos en memoria era consistentes con los datos de la fila de la tabla. Con la

persistencia controlada por el bean nosotros tenemos que implementar todos estoscomportamientos, lo que significa añadir codigo JDBC™ y SQL, e implementar losmétodos vacíos del ejemplo controlado por el contenedor.

Un bean de sesión o de entidad consiste en métodos de negocio y métodos de ciclo devida. en el ejemplo, CalcBean tiene dos métodos de negocio, calcBean y getRecord ,

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (1 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 82/95

y BonusBean tiene dos métodos de negocio getBonus y getSocsec. Tanto CalcBeancomo BonusBean tienen los siguientes métodos de ciclo de vida. A los métodos denegocio los llama el cliente y a los métodos del ciclo de vida los llama el contenedor delbean.

setEntityContext: El contenedor llama primero a este método para pasar unobjeto contexto al bean de entidad. El contexto de entidad lo actualizadinamicamente el contenedor incluso si muchos clientes llaman al bean de entidada la vez, el contexto contiene datos actuales para cada llamada. Un bean de sesióntiene un método setSessionContext correspondiente que realiza una función

similar a la del método setEntityContext.

 

q

ejbCreate: El contenedor llama a este método cuando un cliente llama al métodocreate del interface home del bean. Por cada método create en el interface home,el bean tiene un método ejbCreate correspondiente con la misma firma(parámetros y valor de retorno).

 

q

ejbPostCreate: El contenedor llama a este método después de que se complete elmétodo ejbCreate. Hay un método ejbPostCreate por cada método ejbCreate

que toma los mismos argumentos que su método create. Sin embargo,ejbPostCreate no tiene valor de retorno. Usamos ejbPostCreate paraimplementar cualquier procesamiento especial que necesitemos hacer después decrear el bean y antes de que esté disponible para el cliente. Lo podemos dejar enblanco si no necesitamos procesamiento especial.

 

q

ejbRemove: El contenedor llama a este método cuando un cliente llama almétodo remove del interface home del bean. La aplicación de ejemplo J2EE paraeste tutorial no incluye ningún método remove en el interface home.

 

q

unsetEntityContext: El contenedor llama a este método después de que se hayallamado a ejbRemove para eliminar el bean de entidad. Sólo los beans de entidadtienen un método unsetEntityContext. Un bean de sesión no tiene elcorrespondiente método unsetSessionContext.

 

q

ejbFindByPrimaryKey: El contenedor llama a este método cuando un clientellama al método findByPrimaryKey del interface home del bean. Por cadamétodo find del interface home del bean, tiene su correspondiente métodoejbFind< type > con la misma firma (parámetros y valor de retorno).

 

q

ejbLoad y ejbStore : El contenedor llama a estos métodos para sincronizar elestado del bean con la base de datos subyacente. Cuando un cliente selecciona uobtiene los datos de un bean como en el caso de un método get , el contenedorllama al método ejbStore para envíar el objeto a la base de datos y llama aejbLoad para leerlo de nuevo. Cuando un cliente llama a un método find, elcontenedor llama a ejbLoad para inicializar el bean con los datos desde la base dedatos subyacente.

 

q

ejbActivate y ejbPassivate: El contenedor llama a estos métodos para activar odesactivar el estado del bean. La activación o desactivación se refieren alintercambio del bean dentro y fuera del almacenamiento temporal para liberarmemoria, que podría ocurrir si un bean dado no ha sido llamado por un clientedesde hace mucho tiempo. Las implementaciones de ejbPassivate podrían incluir

q

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (2 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 83/95

cosas como el cierre de conexiones o ficheros usados por el bean, y paraejbActivate podría incluir cosas como la reapertura de las mismas conexiones oficheros.

Modificar el código de BonusBeanEsta sección nos lleva a través del código de BonusBean con persistencia controlada porel bean. Lo primero que observaremos es que hay mucho más código que en la versióncon persistencia controlada por el contenedor.

Sentencias Import

Los interfaces InitialContext, DataSource, y Connection se importan para establecerconexiones con la base de datos. El interface PreparedStatement se importa parausarlo como plantilla para crear una petición SQL. El interface ResultSet se importapara manejar accesos a filas de datos devueltas por una consulta. Las clasesFinderException y SQLException se importan para manejar excepciones de búsqueday accesos a bases de datos.

package Beans;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EntityBean;

import javax.ejb.EntityContext;

import javax.naming.InitialContext;

import javax.sql.DataSource;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import javax.ejb.FinderException;import java.sql.SQLException;

Variables de Ejemplar

Las variables de ejemplar añadidas en esta lección nos permiten establecer y cerrarconexiones con bases de datos. El string java:comp/ env/ jdbc/ BonusDB indica elnombre de referencia para el recurso, que también deberíamos especificar cuandoañadamos el bean de entidad a la aplicación J2EE usando la herramienta Deploy. En esteejemplo, la referencia de recursos es un alias a la base de datos Cloudscape(CloudscapeDB) donde está almacenada la tabla de datos.

Después crearemos la tabla BONUS en CloudscapeDB, y durante el desplieguemapearemos jdbc/ BonusDB a jdbc/ CloudscapeDB .

public class BonusBean implements EntityBean {

private EntityContext context;

private Connection con;

private String dbName =

"java:comp/env/jdbc/BonusDB";

private InitialContext ic = null;

private PreparedStatement ps = null;

private double bonus;private String socsec;

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (3 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 84/95

Métodos de Negocio

Los métodos de negocio no han cambiado para esta lección excepto en las llamadas aSystem.out.println, que nos permiten ver el orden en que se llaman los métodos denegocio y ciclo de vida durante la ejecución.

public double getBonus() {

System.out.println("getBonus");

return this.bonus;}

public String getSocSec() {

System.out.println("getSocSec");

return this.socsec;

}

Métodos de Ciclo de Vida

Estos métodos incluyen llamadas a System.out.println para que podamos ver en queorden se llaman durante la ejecución.

ejbCreate

La firma del método ejbCreate para esta lección lanza RemoteException ySQLException además de CreateException . SQLException es necesaria porque elmétodo ejbCreate proporciona su propio código SQL, y RemoteException es necesariaporque ese método realiza acceso remoto

Una cosa a observar de esta clase es que devuelve un valor String que es la claveprimaria, pero la declaración para este método en el interface home espera recibir unejemplar de la clase Bonus. El contenedor usa la clave primaria devuelta por este

método para crear un ejemplar de Bonus.

public String ejbCreate(double bonus, String socsec)

throws RemoteException,

CreateException,

SQLException {

this.socsec=socsec;

this.bonus=bonus;

System.out.println("Create Method");

try {

//Establish database connectionic = new InitialContext();

DataSource ds = (DataSource) ic.lookup(dbName);

con = ds.getConnection();

//Use PreparedStatement to form SQL INSERT statement

//to insert into BONUS table

ps = con.prepareStatement(

"INSERT INTO BONUS VALUES (? , ?)");

//Set 1st PreparedStatement value marked by ? , with

//socsec and the 2nd value marked by ?) with bonus

ps.setString(1, socsec);

ps.setDouble(2, bonus);ps.executeUpdate();

} catch (javax.naming.NamingException ex) {

ex.printStackTrace();

} finally {

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (4 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 85/95

//Close database connection

ps.close();

con.close();

}

//Return primary key

return socsec;

}

ejbPostCreateEste método tiene la misma firma que ejbCreate, pero no tiene implementación porquenuestro ejemplo no realiza procesamientos o inicializaciones posteriores a la creacción.

public void ejbPostCreate(double bonus,

String socsec)

throws RemoteException,

CreateException,

SQLException {

System.out.println("Post Create");

}

ejbFindByPrimaryKey

La versión controlada por el contenedor de BonusBean no incluia una implementaciónde ejbFindByPrimaryKey porque el contenedor podría localizar los registros de la basede datos por su clave primaria si especificamos persistencia controlada por el contenedory proporcionamos un campo de clave primaria durante el despliegue. En esta lección,BonusBean se despliega con persistencia controlada por el bean por eso debemosproporcionar una implementación para este método y lanzar una SQLException . Laversión controlada por contenedor sólo lanzaba RemoteException y FinderException.

Si la operación find localiza un registro con la clave primaria pasada aejbFindByPrimaryKey , se devuelve el valor de la clave primaria para que elcontenedor pueda llamar al método ejbLoad para inicializar BonusBean con los datosbonus y socsec recuperados.

Una cosa a observar sobre esta clase es que devuelve un valor String que es la claveprimaria, pero la declaración para este método en el interface home espera recibir unejemplar de la clase Bonus. El contenedor usa la clave primaria devuelta por estemétodo para crear un ejemplar de Bonus.

public String ejbFindByPrimaryKey(String primaryKey)throws RemoteException,FinderException,

SQLException {

System.out.println("Find by primary key");

try {

//Establish database connection

ic = new InitialContext();

DataSource ds = (DataSource) ic.lookup(dbName);

con = ds.getConnection();

//Use PreparedStatement to form SQL SELECT statement

//to select from BONUS table

ps = con.prepareStatement(

"SELECT socsec FROM BONUS WHERE socsec = ? ");

ps.setString(1, primaryKey);

//Use ResultSet to capture SELECT statement results

ResultSet rs = ps.executeQuery();

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (5 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 86/95

//If ResultSet has a value, the find was successful,

//and so initialize and return key

if(rs.next()) {

key = primaryKey;

} else {

System.out.println("Find Error");

}

} catch (javax.naming.NamingException ex) {

ex.printStackTrace();

} finally {//Close database connection

ps.close();

con.close();

}

//Return primary key

return key;

}

ejbLoad

Este método se llama después de una llamada exitosa a ejbFindByPrimaryKey paracargar y recuperar datos y sincronizar los datos del bean con los de la base de datos.

public void ejbLoad() {

System.out.println("Load method");

try {

//Establish database connection

ic = new InitialContext();

DataSource ds = (DataSource) ic.lookup(dbName);

con = ds.getConnection();

//Use PreparedStatement to form SQL SELECT statement

//to select from BONUS tableps = con.prepareStatement(

"SELECT * FROM BONUS WHERE SOCSEC = ?");

ps.setString(1, this.socsec);

//Use ResultSet to capture SELECT statement results

ResultSet rs = ps.executeQuery();

//If ResultSet has a value, the find was successful

if(rs.next()){

this.bonus = rs.getDouble(2);

} else {

System.out.println("Load Error");

}

} catch (java.sql.SQLException ex) {

ex.printStackTrace();

} catch (javax.naming.NamingException ex) {

ex.printStackTrace();

} finally {

try {

//Close database connection

ps.close();

con.close();

} catch (java.sql.SQLException ex) {

ex.printStackTrace();

}}

}

ejbStore

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (6 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 87/95

Se llama a este método cuando un cliente selecciona u obtiene datos en el bean paraenvíar el objeto a la base de datos y mantener el bean y la base de datos sincronizados.

public void ejbStore() {

System.out.println("Store method");

try {

//Establish database connection

DataSource ds = (DataSource)ic.lookup(dbName);

con = ds.getConnection();//Use PreparedStatement to form SQL UPDATE statement

//to update BONUS table

ps = con.prepareStatement(

"UPDATE BONUS SET BONUS = ? WHERE SOCSEC = ?");

//Set 1st PreparedStatement value marked by ? with

//bonus and the 2nd value marked by ?) with socsec

ps.setDouble(1, bonus);

ps.setString(2, socsec);

int rowCount = ps.executeUpdate();

} catch (javax.naming.NamingException ex) {

ex.printStackTrace();} catch (java.sql.SQLException ex) {

ex.printStackTrace();

} finally {

try {

//Close database connection

ps.close();

con.close();

} catch (java.sql.SQLException ex) {

ex.printStackTrace();

}

}

}

ejbRemove

Se llama a este método cuando un cliente llama al método remove del interface homedel bean. El cliente JavaBean de este ejemplo no proporciona un método remove que elcliente pueda llamar para eliminar BonusBean desde su contenedor. De todas formas,aquí podemos ver la implementación de un método ejbRemove. cuando el contenedorllama a ejbRemove, éste obtiene la clave primaria (socsec) de la variable de ejemplarsocsec, elimina el bean de su contenedor, y borra la correspondiente fila de la base dedatos.

public void ejbRemove()

throws RemoteException {

System.out.println("Remove method");

try {

DataSource ds = (DataSource)ic.lookup(dbName);

con = ds.getConnection();

ps = con.prepareStatement(

"DELETE FROM BONUS WHERE SOCSEC = ?");

ps.setString(1, socsec);

ps.executeUpdate();

} catch (java.sql.SQLException ex) {

ex.printStackTrace();

} catch (Exception ex) {

ex.printStackTrace();

try {

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (7 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 88/95

ps.close();

con.close();

} catch (java.sql.SQLException ex) {

ex.printStackTrace();

}

}

ejbActivate

Cuando un bean no se ha utilizado durante mucho tiempo, el contenedor lo desactiva olo mueve a un almacenamiento temporal donde el contenedor puede rápidamentereactivar el bean en el caso de que algún cliente llame a un método de negocio del bean.Este método llama al método getPrimaryKey en el contexto de entidad para que laclave primaria esté disponible para los clientes del bean. Cuando se hace una petición, elcontenedor usa la clave primaria para cargar los datos del bean.

public void ejbActivate() {

System.out.println("Activate method");

socsec = (String)context.getPrimaryKey();

}

ejbPassivate

Cuando un bean no se ha utilizado durante mucho tiempo, el contenedor lo desactiva olo mueve a un almacenamiento temporal donde el contenedor puede rápidamentereactivar el bean en el caso de que algún cliente llame a un método de negocio del bean.Este método selecciona la clave primaria a null para liberar memoria mientras el beanestá desactivado.

public void ejbPassivate() {

System.out.println("Passivate method");socsec = null;

}

setEntityContext

El contenedor llama a este método para inicializar la variable de ejemplar context delbean. Es necesario porque el método ejbActivate llama al método getPrimarykeysobre la variable de ejemplar context para pasar el bean del estado desactivado al deactivado.

public void setEntityContext(javax.ejb.EntityContext ctx){

System.out.println("setEntityContext method");

this.context = ctx;

}

unsetEntityContext

El contenedor llama a este método para poner a null la variable de ejemplar contextdespués de que se haya llamado al método ejbRemove para eliminar el bean. Sólo losbeans de entidad tienen un método unsetEntityContext.

public void unsetEntityContext(){

System.out.println("unsetEntityContext method");

ctx = null;

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (8 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 89/95

}

}

Modificar el Código de CalcBean yJBonusBeanComo BonusBean proporciona su propio código SQL, el método CalcBean.calcbonus ,que crea ejemplares de BonusBean, tiene que modificarse para lanzar la excepciónava.sql.SQLException. Aquí tenemos la forma de hacer este cambio:

public class CalcBean implements SessionBean {

BonusHome homebonus;

public Bonus calcBonus(int multiplier,

double bonus, String socsec)

throws RemoteException,

SQLException,

CreateException {

Bonus theBonus = null;

double calc = (multiplier*bonus);

try {

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("bonus");

homebonus = (BonusHome)

PortableRemoteObject.narrow(

objref, BonusHome.class);

} catch (Exception NamingException) {

NamingException.printStackTrace();}

//Store data in entity Bean

theBonus=homebonus.create(calc, socsec);

return theBonus;

}

La clase JBonusBean tiene que modificarse para capturar la SQLException lanzada porCalcBean. DuplicateKeyExcpetion es una subclase de CreateException , por esoserá capturada por la sentencia catch (javax.ejb.CreateException e) .

public double getBonusAmt() {

if(strMult != null){

Integer integerMult = new Integer(strMult);

int multiplier = integerMult.intValue();

try {

double bonus = 100.00;

theCalculation = homecalc.create();

Bonus theBonus = theCalculation.calcBonus(

multiplier, bonus, socsec);

Bonus record = theCalculation.getRecord(

socsec);

bonusAmt = record.getBonus();

socsec = record.getSocSec();

} catch (java.sql.SQLException e) {

this.bonusAmt = 0.0;

this.socsec = "000";

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (9 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 90/95

this.message = e.getMessage();

} catch (javax.ejb.CreateException e) {

this.bonusAmt = 0.0;

this.socsec = "000";

this.message = e.getMessage();

} catch (java.rmi.RemoteException e) {

this.bonusAmt = 0.0;

this.socsec = "000";

this.message = e.getMessage();

}genXML();

return this.bonusAmt;

} else {

this.bonusAmt = 0;

this.message = "None.";

return this.bonusAmt;

}

}

Crear la Tabla de la Base de DatosComo este ejemplo usa persistencia controlada por el bean, tenemos que crear la tablaBONUS en la base de datos CloudscapeDB. Con persistencia controladda por elcontenedor, la tabla se creaba automáticamente.

Para mantener las cosas sencillas, la tabla de la base de datos se crea con dos scripts:createTable.sql y cloudTable.sh (Unix) o cloudTable.bat (Windows/NT). Para esteejemplo, el escript createTable.sql va en nuestro directorio ~/ J2EE/ Beans, y el scriptcloudTable.sh (Unix) o cloudTable.bat (Windows/NT) va en nuestro directorio~/ J2EE.

Para ejecutar estos scripts, vamos al directorio Beans y tecleamos los siguiente:

Unix:

../cloudTable.sh

Windows/ NT:

..\cloudTable.bat

createTable.sql

Este fichero se proporciona con los ficheros fuentes de esta leccción.

drop table bonus;

create table bonus

(socsec varchar(9) constraint pk_bonus primary key,

bonus decimal(10,2));

exit;

cloudTable.batEste fichero se proporciona con los ficheros fuentes de esta leccción.

rem cloudTable.bat

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (10 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 91/95

rem Creates BONUS table in CloudscapeDB.

rem

rem Place this script in ~\J2EE

rem To run: cd ~\J2EE\cloudTable.sh

rem

rem Change this next line to point to *your*

rem j2sdkee1.2.1 installation

rem

set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1

remrem Everything below goes on one line

java -Dij.connection.CloudscapeDB=

jdbc:rmi://localhost:1099/jdbc:cloudscape:

CloudscapeDB\;create=true -Dcloudscape.system.home=

%J2EE_HOME%\cloudscape -classpath %J2EE_HOME%iib\cloudscape\client.jar;

%J2EE_HOME%iib\cloudscape\ tools.jar;

%J2EE_HOME%iib\cloudscape\cloudscape.jar;

%J2EE_HOME%iib\cloudscape\RmiJdbc.jar;

%J2EE_HOME%iib\cloudscapeiicense.jar;

%CLASSPATH% -ms16m -mx32m

COM.cloudscape.tools.ij createTable.sql

cloudTable.sh

Este fichero se proporciona con los ficheros fuentes de esta leccción.

#!/bin/sh

J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2

java -Dij.connection.CloudscapeDB=jdbc:rmi:

//localhost:1099/jdbc:cloudscape:CloudscapeDB\;

create=true -Dcloudscape.system.home=

$J2EE_HOME/cloudscape -classpath$J2EE_HOME/lib/cloudscape/client.jar:

$J2EE_HOME/lib/cloudscape/tools.jar:

$J2EE_HOME/lib/cloudscape/cloudscape.jar:

$J2EE_HOME/lib/cloudscape/RmiJdbc.jar:

$J2EE_HOME/lib/cloudscape/license.jar:

${CLASSPATH} -ms16m -mx32m

COM.cloudscape.tools.ij createTable.sql

Eliminar el Fichero JARTenemos que actualizar el fichero JAR con el nuevo código del Bean. Si tenemos los dosbeans en un sólo fichero JAR, tenemos que borrar 2BeansJar y crear uno nuevo. Lospasos para añadir CalcBean son los mismos que los de la lección Comunicaciones entreBeans. Los pasos para añadir BonusBean son ligeramente diferentes como se describeaquí.

Si tenemos los beans en ficheros JAR separados, tenemos que borrar el fichero JAR conBonusBean y crear uno nuevo como se describe aquí.

Estas instrucciones empiezan en el momento de añadir los interfaces y las clases de

BonusBean al fichero JAR.

EJB JAR :

Pulsamos Add (el más cercano a la ventana Contents).q

Cambiamos de directorio para que el directorio Beans muestre su contenido.q

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (11 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 92/95

Seleccionamos Bonus.classq

Pulsamos Add .q

Seleccionamos BonusBean.classq

Pulsamos Add .q

Seleccionamos BonusHome.classq

Pulsamos Add .q

Clases Enterprise Bean JAR :Nos aseguramos de ver Beans/ Bonus.class, Beans/ BonusHome.class, yBeans/ BonusBean.class en el display.

q

Pulsamos OK .q

EJB JAR :

Pulsamos Next .q

General :

Nos aseguramos de que Beans.BonusBean es el nombre de clase,

Beans.BonusHome es el interface Home, y Beans.Bonus es el interface Remoto.

q

Introducimos BonusBean como nombre de display.q

Pulsamos Entity .q

Pulsamos Next .q

Selecciones de Entidad:

Seleccionamos Bean-managed persistence .q

La clase de clave primaria es java.lang.String, Observa que la clave primariatiene que ser un tipo de clase, los tipos primitivos no son válidos como clavesprimarias.

q

Pulsamos Next .q

Entradas de Entornio:

Pulsamos Next. Este sencillo bean no usa propiedades (entradas de entorno).q

Referencias a Beans Enterprise:

Pulsamos Next .q

Referencias a Recursos:

Pulsamos Addq

Tecleamos jdbc/ BonusDB en la primera columna, debajo de Coded Name. Nosaseguramos de que Type es javax.sql.DataSource, y Authentication esContainer .

q

Pulsamos Next.q

Seguridad:

Pulsamos Next. Este sencillo bean no usa roles de seguridad.q

Control de Transación :

Seleccionamos Container-managed transactions (si no lo está ya).q

En la lista de abajo , marcamos como necesarios create , findByPrimaryKey,getBonus y getSocSec. Esto significa que el contenedor arranca una nuevatransación antes de ejecutar estos métodos. La transación se envía justo antes deque los métodos terminen.

q

Pulsamos Next .q

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (12 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 93/95

Revisión de Selecciones:

Pulsamos Finish .q

Ventana Inspecting:

Con 2BeansApp seleccionado pulsamos JNDI names.q

Asignamos calcs a CalcBean , bonus a BonusBean , y jdbc/ Cloudscape a jdbc/ BonusDB.

q

Verificar y Desplegar la AplicaciónAntes de desplegar la aplicación, es una buena idea ejecutar el verificador. El verificadormostrará los errores en los componentes de la aplicación como métodos inexistentes queel compilador no captura.

Verificar:

Con 2BeansApp seleccionado, elegimos Verifier desde el menú Tools.q

En el diálogo que aparece, pulsamos OK. La ventana debería decir que no hayningún fallo.

q

Cerramos la ventana del verificador porque ahora estamos listos para desplegar laaplicación.

q

Nota:En la versión 1.2.1 del software podríamos obtener un error testsapp.WebURI . Esto significa que la herramienta DeployTool no puso laextensión .war al fichero WAR durante su creacción. Es un errormenor y la aplicación J2EE se despliega sin problemas.

Desplegar:

Desde el menú Tools, elegimos Deploy Application. Se mostrará una caja dediálogo Deploy BonusApp.

q

Verificar que la selección de Target Server es un host local o el nombre de unhost donde se está ejecutando el servidor J2EE.

q

Marcar la caja Return Client Jar. Al marcar esta caja se crea un ficher JAR con lainformación de despliegue necesaria por el bean de entidad.

q

Pulsamos Next .q

Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean, bonuspara BonusBean y jdbc/ Cloudscape para BonusDB. Si no es así, tecleamos losnombres JNDI nosotros mismos, y pulsamos la tecla Return.

q

Pulsamos Next. Nos aseguramos de que el nombre Context Root muestraJSPRoot. Si no es así, lo tecleamos nosotros mismos y pulsamos la tecla Return.

q

Pulsamos Next .q

Pulsamos Finish para empezar el despliegue. Se mostrará una caja de diálogo quemostrará el estado de la operación de despliegue.

q

Cuando se haya completado,pulsamos OK .q

Ejecutar la AplicaciónEl servidor web se ejecuta por defecto en el puerto 8000. Para abrir la páginabonus.html apuntamos nuestro navegador ahttp:/ / localhost:8000/ JSPRoot/ bonus.html, que es dónde la herramienta dedespliegue puso el fichero HTML.

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (13 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 94/95

Rellenamos un número de la seguridad social y un multiplicador.q

Pulsamos el botón Submit. Bonus.jsp procesa nuestros datos y devuelve unapágina HTML con el bono calculado.

q

La salida del servidor J2EE podría mostrar los siguientes mensajes cada vez que seintente un acceso a la base de datos. Estos mensajes significan que no se suministraronnombres de usuarios ni passwords para acceder a la base de datos. Podemos ignorarestos mensajes porque los nombres de usuario y las passwords no son necesarios paraacceder a la base de datos Cloudscape, y este ejemplo funciona bien sin importarle

estos mensajesCannot find principal mapping information for data source w ith JNDIname jdbc/ Cloudscape

Aquí tenemos una versión más limpia de la salida del servidor J2EE (el mensaje de arribafue editado)

setEntityContext method

Create Method

Post Create

setEntityContext methodFind by primary key

Load method

getBonus

Store method

Load method

getSocSec

Store method

Find by primary key

Load method

getSocSec

Store method

Load method

getBonus

Store method

<?xml version="1.0"?>

<report>

<bonusCalc ssnum="777777777" bonusAmt="300.0" />

</report>

Más InformaciónPodemos obtener más información sobre los Beans de entidad y la persistenciacontrolada por el Bean en :http://java.sun.com/j2ee/j2sdkee/techdocs/guides/ejb/html/Entity.fm.html

También puedes obtener información sobre como hacer conexiones a bases de datos en:

http://java.sun.com/j2ee/j2sdkee/techdocs/guides/ejb/html/Database.fm.html

Añadir JDBC

http://usuarios.tripod.es/Ozito/j2ee/jdbc.html (14 de 15) [18/03/2001 23:37:23]

5/12/2018 Tutorjava J2EE - slidepdf.com

http://slidepdf.com/reader/full/tutorjava-j2ee 95/95

Código Fuente de los EjemplosAquí tienes un fichero Zip con los ficheros fuente de los ejemplos de esta página:

fuentes_L7.zip

[<< Anterior] [Inicio] [TutorJava]

Añadir JDBC