Escolar Documentos
Profissional Documentos
Cultura Documentos
Autor: Sun
Traductor: Juan Antonio Palos
Compilación en PDF: Javier Galdames
Indice
INTRODUCCIÓN............................................................................................. 5
7. AÑADIR JDBC.......................................................................................... 87
Mientras que esta lección usa sólo tres o cuatro capas, la siguiente lección
extiende este mismo ejemplo para acceder al servidor de base de datos en la
cuarta capa. Lecciones posteriores adaptan el ejemplo para usar las
tecnologías JavaServer™ Pages y Extensible Markup Language (XML).
Para ejecutar los ejemplos del tutorial, necesitas descargar e instalar el SDK
Java 2 Enterprise Edition (J2EE), Versión 1.2.1
(http://java.sun.com/j2ee/download.html), y SDK Java 2, Standard Edition
(J2SE), Versión 1.2 o posterior (http://java.sun.com/jdk/index.html).
Las instrucciones de este tutorial asumen que J2EE y J2SE están instalados en
el directorio J2EE debajo del directorio home del usuario.
Nota:
Siempre que se utilice monicap en un nombre de path, tendrás que cambiarlo
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
Capítulo 1.Un Sencillo Bean de Sesión 9
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
Unix:
/home/monicap/J2EE/j2sdkee1.2.1/lib/j2ee.jar
Windows:
\home\monicap\J2EE\j2sdkee1.2.1\lib\j2ee.jar
• Applets
Mientras estemos haciendo todos estos pasos para esta lección, realmente
estaremos realizando varias funciones diferentes. Escribir el código del servlet
y del Bean de sesión es una función de desarrollo, mientras que crear la
aplicación J2EE y añadir los componentes J2EE a una aplicación es una función
de ensamblaje. En realidad, estas funciones podrían ser realizadas por
diferentes personas de diferentes compañías.
<HTML>
<BODY BGCOLOR = "WHITE">
<BLOCKQUOTE>
<H3>Bonus Calculation</H3>
<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>
Capítulo 1.Un Sencillo Bean de Sesión 11
BonusServlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import Beans.*;
try{
Calc theCalculation;
//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();
}
El fichero bonus.html tiene dos campos de datos en los que usuario puede
introducir un número de seguridad social y un multiplicador. Cuando el
usuario pulsa el botón Submit, BonusServlet.java recupera el dato del usuario,
busca el Bean de sesión, y le pasa el dato del usuario al Bean de sesión. el
Bean de sesión calcula un valor "bonus" y lo devuelve al servlet. El servlet
devuelve otra página HTML con el valor del "bonus" para que lo vea el usuario.
Código HTML
Lo más interesante sobre el código del formulario HTML es el alias usado para
invocar a BonusServlet. Cuando el usuario pulsa el botón Submit sobre el
formulario HTML, se llama a BonusServlet porque se ha mapeado a BonusAlias
durante el ensamblaje de la aplicación descrito en Ensamblar la Aplicación
J2EE.
<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>
La siguiente sección describe las diferentes partes del código del servlet.
Sentencias Import
El código del servlet empieza con sentencias import para los siguientes
paquetes:
Método init()
Método doGet
El método doGet lanza una IOException si hay algún problema con los datos
de entrada o salida cuando maneja la petición, y una ServletException si la
petición no se puede manejar. Para calcular el valor del bonus, el método
doGet crea el interface home y 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");
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>");
Capítulo 1.Un Sencillo Bean de Sesión 15
out.println("<P>Multiplier: " +
multiplier + "<P>");
out.println("<P>Bonus Amount: " + calc + "<P>");
out.println("</BODY></HTML>");
out.close();
}
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import Beans.*;
System.out.println("Destroy");
}
}
package Beans;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
Calc.java
package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
CalcHome.java
package Beans;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
Nota:
Este ejemplo muestra cómo escribir un bean de sesión, pero también es
posible comprar beans enterprise a un proveedor y ensamblarlos dentro de
una aplicación J2EE.
CalcHome
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
Calc
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
CalcBean
Los métodos vacíos son del inteface SessionBean. Estos métodos los llama el
contenedor del bean. No tenemos que proporcionar comportamiento para
estos métodos a 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;
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.java
Beans/CalcHome.java Beans/Calc.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/CalcBean.java
Beans/CalcHome.java Beans/Calc.java
Compilar el Servlet
Unix
#!/bin/sh
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\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
20 Introducción a J2EE
j2ee –verbose
Nota:
Algunas veces el servidor J2EE no arranca si estámos ejecutando Outlook
Unix:
j2sdkee1.2.1/bin/j2ee -verbose
Windows:
j2sdkee1.2.1\bin\j2ee -verbose
deploytool
Unix:
j2sdkee1.2.1/bin/deploytool
Windows:
j2sdkee1.2.1\bin\deploytool
Capítulo 1.Un Sencillo Bean de Sesión 21
Notas:
Si ocurre un error de acceso a memoria mientras arrancamos deploytool ,
añadimos una variable de entorno llamada JAVA_FONTS y seleccionamos el
path a c: \<font directory> . Por ejemplo c:\winnt\fonts. También, si se
encuentra una NullPointerException para BasicFileChooserUI cuando se
arranca deploytool, debemos asegurarnos de no arrancar la herramienta
desde el directorio raíz (es decir c:\ ). Si la ejecutamos desde cualquier otro
lugar, como el directorio bin de nuestra instalación j2sdkee1.2, no
encontraremos este problema.
1.10. DeployTool
Nota:
A la derecha de la ventana Server Applications hay un botón gris Uninstall.
Después de desplegar la aplicación, veremos la aplicación listada en esta
ventana. Podemos pulsar sobre Uninstall para desinstalarla, hacerle cambios,
y reinstalarla sin tener que parar y rearrancar el servidor de aplicaciones.
22 Introducción a J2EE
Ensamblar una aplicación J2EE implica crear una nueva aplicación, y añadirle
los componentes de aplicación. Aquí tenemos un sumario de los pasos para
ensamblar, que se describen abajo con más detalle.
Caja de Diálogo Add Files to .JAR: vamos al directorio J2EE. Podemos teclear
el nombre 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 .
• Pulsamos sobre Add .
• Seleccionamos CalcHome.class .
• Pulsamos sobre Add .
• Seleccionamos CalcBean.class .
• Pulsamos sobre Add .
Nota Importante:
La caja de diálogo Add Contents to .JAR se debería parecer a la de la figura
siguiente. Las clases Enterprise Bean JAR se deberían mostrar con el prefijo
del nombre de directorio Beans.
• Pulsamos Next.
• classname: Beans.CalcBean
Home interface: Beans.CalcHome
Remote interface: Beans.Calc
Bean type: Session y Stateless
• Especificamos el nombre (el nombre que aparece cuando el fichero JAR
se añade a BonusApp en la ventana de "Local Applications"), y
proporcionamos una descripción para los contenidos del ficheros JAR.
• Display Name: CalcBean
• Description: Este fichero JAR contiene el bean de sesión CalcBean.
• Pulsamos sobre Next .
Nota:
Debemos asegurarnos de añadir bonus.html antes de añadir
BonusServlet.class
• Pulsamos Finish .
• Pulsamos Next .
• Pulsamos Add .
• Tecleamos BonusAlias y pulsamos Return . Este es el mismo nombre de
alias que pusimos en el campo ACTION del formulario HTML embebido
en el fichero bonus.html.
• Pulsamos Finish .
Nombre JNDI:
Contexto Raíz:
Alias:
Verificar:
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 la apliación J2EE se despliega
bien sin notarlo.
Desplegar:
Nota:
No debemos seleccionar el check box Return Client Jar. La única vez que
necesitamos seleccionar este check box es cuando despleguemos una
aplicación solitaria para el programa cliente. Este ejemplo usa un servlet y
una página HTML por eso no debemos seleccionarlo. Seleccionar este check
box crea un fichero Jar con la información de despliegue necesaria para una
aplicación solitaria.
El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página
bonus.html apuntamos nuestro navegador a
http://localhost:8000/BonusRoot/bonus.html, que es donde DeployTool puso
el fichero HMTL.
Nota:
Si necesitamos usar un puerto diferente porque el puerto 8000 está siendo
utilizado por otra cosa, editamos el fichero web.properties en el directorio
~/J2EE/j2sdkee1.2/config y arrancamos de nuevo el servidor J2EE.
Bonus Calculation
El menú Tools tiene dos opciones de interés. Son Update Application Files y
Update and Redeploy Application. Estas opciones nos permiten cambiar el
código y redesplegar nuestra aplicación con facilidad. Simplemente hacemos
los cambios en el código, lo recompilamos, y elegimos una de estas opciones
del menú.
BonusHome
deben tener la misma firma , para que los valores del bono y la clave primaria
puedan ser pasados desde el interface home al bean de entidad mediante el
contenedor del bean de entidad. Si una fila para una clave primada dada
(número de seguridad social) ya existe, se lanza una
java.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;
Bonus
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
BonusBean
Los métodos getBonus y getSocSec son llamados por los clientes para
recuperar datos almacenados 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 las variables 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.
34 Introducción a J2EE
package Beans;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
//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();
}
}
2.3. Compilar
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
Capítulo 2.Añadir un Bean de Entidad 37
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\ClientCode
set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar;
\home\monicap\J2EE
javac -d . -classpath %CPATH% BonusServlet.java
j2ee -verbose
deploytool
cloudscape -start
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
Nota:
Se desinstalará automáticamente la aplicación BonusApp de la lección
anterior.
Los pasos para crear el EJB JAR para el bean de entidad son muy similares a
los pasos del bean de sesión cubiertos en la lección anterior. Sin embargo, hay
algunas diferencias, y se explican aquí:
Nota:
En esta lección, el bean de entidad va en un ficjero JAR separado del bean de
sesión para continuar el ejemplo de la lección anterior con el menor número
de cambios. Sin embargo, como estos beans tienen funcionalidades
relacionadas podríamos empaquetarlos y desplegarlos en el mismo fichero
JAR. Vermos como hacer esto en la siguiente lección.
Menu File:
Introducción :
EJB JAR :
• Seleccionamos BonusHome.class
• Pulsamos Add.
• Pulsamos OK.
EJB JAR:
• Pulsamos Next .
General:
Configuración Entity:
Entradas de Entorno:
Referencias a Recursos:
Seguridad:
Control de Transación :
• Pulsamos Next .
• Pulsamos Finish .
Capítulo 2.Añadir un Bean de Entidad 41
Aplicaciones Locales:
• Seleccionamos BonusApp .
• En la ventana Inspecting, seleccionamos JNDI names
• La damos a BonusBean el nombre JNDI de bonus
• Pulsamos la tecla Return
• Seleccionamos BonusBean .
Ventana Inspecting:
• Seleccionamos Entity
• Pulsamos el botón Deployment Settings de la parte inferior izquierda.
Configuración de Despliegue:
Nota:
Si obtenemos un error de que la conexión fue rechazada, arrancamos la base
de datos como se describe en Arrancar la Plataforma y las Herramientas.
42 Introducción a J2EE
Verificar:
Nota:
En la versión 1.2 del software podría obtener un error tests app.WebURI. La
Aplicación J2EE se desplegará de todas formas.
Despliegue:
Nota:
No marcamos la caja "Return Client Jar". El único momento en que debemos
chequear esta caja es cuando usamos persistencia controlada por el bean o
desplegamos una aplicación solitaria para el programa 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 toda la información de despliegue necesaria para una
aplicación solitaria.
• Pulsamos Next. Nos aseguramos de que JNDI names muestra calcs para
CalcBean y bonus para BonusBean . Tecleamos cualquier nombre JNDI
que no esté y pulsamos la tecla Return.
• Pulsamos Next. Nos aseguramos que el nombre Context Root muestra
BonusRoot. Si no lo hace, lo tecleamos nosotros mismos y pulsamos la
tecla Return.
• Pulsamos Next.
• Pulsamos Finish para empezar el despliegue.
• Cuando se haya completado el despliegue, pulsamos OK.
El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página
bonus.html apuntamos nuestros navegador a
http://localhost:8000/BonusRoot/bonus.html, que es donde DeployTool puso
el fichero HMTL.
Bonus Calculation
Bonus Calculation
Soc Sec passed in: 777777777
Multiplier passed in: 2
Bonus Amount calculated: 200.0
Duplicate primary key.
Capítulo 3. Comunicaciones entre Beans 45
Nota:
Algunas personas tienen problemas con esta lección al trabajar 2 beans en un fichero JAR. Si
sucede esto, podemos borrar el fichero JAR con los dos beans y poner cada bean en su propio
fichero JAR. Podríamos necesitar parar y rearrancar el servidor y las herramientas antes de
poder generar el SQL y desplegar.
CalcHome
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
Calc
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
import javax.ejb.DuplicateKeyException;
import javax.ejb.CreateException;
CalcBean
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;
La sentencia try del método doGet calcula el bono, crea el interface home del
bean de sesió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 devuelve una página HTML mostrando el número de
la seguridad social y el multiplicador pasados, y un mensaje de excepción,
Duplicate primary key.
3.3. Compilar
Unix
#!/bin/sh
cd /home/monicap/J2EE
J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1
Capítulo 3. Comunicaciones entre Beans 49
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.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
j2ee -verbose
deploytool
cloudscape -start
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
50 Introducción a J2EE
j2sdkee1.2.1\bin\deploytool
j2sdkee1.2.1\bin\cloudscape -start
Borrar BonusApp:
Crear 2BeansApp :
Ahora, veremos los pasos para crear el fichero WAR. Estos pasos que se
presentaron en la primera lección se sumarizan abajo.
File Menu:
Introducción :
• Pulsamos Next.
• Pulsamos Next.
Component Aliases :
• Especificamos BonusAlias
• Pulsamos Finish.
Ventana Inspecting:
Menú File:
Introducción :
EJB JAR :
EJB JAR :
• Pulsamos Next.
General :
Entradas de Entorno:
Referencias a Recursos:
Seguridad:
Control de Transaciones :
Revisar configuraciones:
• Pulsamos Finish .
Local Applications:
• Seleccionamos 2BeansApp .
• En la ventana Inspecting seleccionamos JNDI names, le damos el
nombre CalcBean JNDI de calcs, y pulsamos la tecla Return.
File Menu:
Introduction :
EJB JAR :
EJB JAR :
• Pulsamos Next .
General :
Entity Settings:
Environment Entries:
Resource References:
Seguridad:
Control de Transaciones :
Review Settings:
• Pulsamos Finish .
Local Applications:
• Seleccionamos 2BeansApp .
• En la ventana Inspecting, seleccionamos JNDI names, dando a
BonusBean el nombre JNDI de bonus y a CalcBean el nombre JNDI de
calcs
• Pulsamos la tecla Return después de cada entrada.
• Seleccionamos BonusBean.
Ventana Inspecting:
• Seleccionamos Entity
• Pulsamos el botón Deployment Settings inferior derecha.
Nota:
Si obtenemos un error de que la conexión fue rechazada, arrancamos de
nuevo la base de datos como se describe en Arrancar la Plataforma y las
Herramientas.
Nota:
Si obtenemos un error Save cuando verificamos o desplegamos, debemos parar todo y
rearrancar el servidor y las herramientas.
Verificar:
Nota:
En la versión 1.2.1 del software podríamos obtener un error tests app.WebURI. Esto significa
que la herramienta DeployTool no puso la extensión .war al fichero WAR durante su
creacción. Es un error menor y la aplicación J2EE se despliega sin problemas.
Desplegar:
Nota:
No marcamos la caja "Return Client Jar". El único momento en que debemos chequear esta
caja es cuando usamos persistencia controlada por el bean o desplegamos una aplicación
solitaria para el programa 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 toda la información de despliegue
necesaria para una aplicación solitaria.
Capítulo 3. Comunicaciones entre Beans 57
• Pulsamos Next .
• Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean
y bonus para BonusBean. Si no es así, tecleamos los nombres JNDI
nosotros mismos, y pulsamos la tecla Return.
• Pulsamos Next. Nos aseguramos de que el nombre Context Root
muestra BonusRoot. Si no es así, lo tecleamos nosotros mismos y
pulsamos la tecla Return.
• Pulsamos Next .
• Pulsamos Finish para empezar el despliegue. Se mostrará una caja de
diálogo que mostrará el estado de la operación de despliegue.
• Cuando se haya completado, las tres barras de la izquierda se habrán
sombreado completamente, como se ve en la siguiente figura. Cuando
esto suceda pulsamos OK.
El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página
bonus.html apuntamos nuestros navegador a
http://localhost:8000/BonusRoot/bonus.html, que es donde DeployTool puso
el fichero HMTL.
Bonus Calculation
Soc Sec retrieved: 777777777
Bonus Amount Retrieved: 200.0
Bonus Calculation
Soc Sec passed in: 777777777
Multiplier passed in: 2
Duplicate primary key
Capítulo 4.Tecnología JavaServer Pages (JSP) 59
Esta lección modifica el fichero WAR de la Lección anterior para usar una
página JSP en lugar de BonusServlet.
Una página JSP se parece a una página HTML con segmentos de código servlet
embebidos entre varias etiquetas de apertura ( <% ) y cierre (%> ) JSP. No hay
métodos HttpServlet como init , doGet, o doPost. En su lugar, el código que
normalmente iría en estos métodos está directamente embebido en la página
JSP usando etiequetas JSP.
PortableRemoteObject.narrow(
objref, CalcHome.class);
%>
<%-- Comment
Scriptlet to create session Bean,
call calcBonus method, and retrieve a database
record 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
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 en que empiezan con <%-- en lugar de <!--, que es como empiezan en
HTML. Podemos usar comentarios JSP o HTML en una página HTML. Los
comentarios HTML se envían al navegador web del cliente donde aparezcan
como parte de la página HTML, y los comentarios 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 un error en tiempo de
ejecución que desaparecía cuando eliminamos los dos puntos.
Capítulo 4.Tecnología JavaServer Pages (JSP) 61
<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 se traduce a un servlet. Las directivas usadas en este ejemplo le
dicen al motor JSP que incluya ciertos paquetes y clases. Las directivas están
encerradas entre etiquetas de directiva <%@ 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
en expresiones o scriptlets. También podemos declarar variables dentro de
expresiones o scriptlets en el momento de usarlas. El ámbito es toda la página
JSP, no hay concepto de variables de ejemplar. Es decir, no tenemos que
declarar variables de ejemplar para usar en más de una expresión o scriptlet.
Las declaraciones van encerradas entre etiquetas de declaración <%! y %>.
Podemos tener varias declaraciones. Por ejemplo, <%! double bonus; String
text; %> .
Scriptlets
Los scriptlets JSP nos permiten embeber segmentos de código java dentro de
una página JSP. El codigo embebido se inserta directamente en el servlet
generado que se ejecuta cuando se pide la página. Este scriptlet usa las
variables declaradas en las directivas descritas 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
<%
strMult = request.getParameter("MULTIPLIER");
socsec = request.getParameter("SOCSEC");
integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
bonus = 100.00;
%>
Expresiones
<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>
j2ee -verbose
deploytool
cloudscape -start
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
Como 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:
Menú File:
Introduction:
Nota:
Parece que hay un bug en la herramienta Deploy. Debemos asegurarnos de
añadir primero Bonus.jsp seguido de bonus.html. Si añadimos primero
bonus.html, la herramienta Deploy pone bonus.html donde debería ir
Bonus.jsp y Bonus.jsp donde debería ir bonus.html. Si esto sucede, podemos
corregirlo manualmente copiándolos en las localizaciones correctas. Así es
como deben estar después del despliegue:
~/j2sdkee1.2/public_html/JSPRoot/bonus.html
~/j2sdkee1.2/public_html/JSPRoot/WEB-INF/classes/Bonus.jsp
• Pulsamos Next.
Ventana Inspecting:
Verificar:
Nota:
En la versión 1.2.1 del software podríamos obtener un error tests
app.WebURI. Esto significa que la herramienta DeployTool no puso la
extensión .war al fichero WAR durante su creacción. Es un error menor y la
aplicación J2EE se despliega sin problemas.
Desplegar:
Nota:
No marcamos la caja "Return Client Jar". El único momento en que debemos
chequear esta caja es cuando usamos persistencia controlada por el bean o
desplegamos una aplicación solitaria para el programa 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 toda la información de despliegue necesaria para una
aplicación solitaria.
• Pulsamos Next .
• Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean
y bonus para BonusBean. Si no es así, tecleamos los nombres JNDI
nosotros mismos, y pulsamos la tecla Return.
• Pulsamos Next. Nos aseguramos de que el nombre Context Root
muestra JSPRoot. Si no es así, lo tecleamos nosotros mismos y
pulsamos la tecla Return.
• Pulsamos Next .
66 Introducción a J2EE
El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página
bonus.html apuntamos nuestro navegador a
http://localhost:8000/JSPRoot/bonus.html, que es dónde la herramienta de
despliegue 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 sigue
public_html/JSPRoot/bonus.html y public_html/JSPRoot/WEB-INF/classes/Bonus.jsp.
Bonus Calculation
Bonus Calculation
5. Tecnología JavaBeans
Podemos usar la tecnología JavaBeans™ para poner un JavaBean entre una
página JSP y el 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 Modelo proporciona la lógica de negocio de la
aplicacón, la Vista es la presentación en pantalla, y el 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
la solució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 JSP
proporcionaran la presentación en pantalla (Vista) y manejar lo que sucedia
cuando el usuario 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
JavaBean para manejar lo que sucede cuando el usuario interactúa con la
vista (Controlador), y los beans de entidad y de sesión para los objetos de
aplicación (Modelo). Separando el Controlador 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 que usa patrones de diseño es
mucho más sencilla de actualizar, mantener y manejar.
Otra forma de crear el interface de usuario es con una página JSP que incluya
el formulario HTML, scriptlets JSP, y etiquetas específicas JSP para
interactúar con el JavaBean. Cuando se carga la página JSP, se muestra el
formulario HTML y se ejecutan los escriptlets y las etiquetas especificas JSP
para interactuar con el JavaBean. Como todavía no se han suministrado datos,
la pantalla se parecerá a la de la siguiente figura:
68 Introducción a J2EE
<BLOCKQUOTE>
<H3>Bonus Calculation</H3>
<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>
value="<%=ssec%>"/>
<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
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, y el número de la seguridad social en la variable ssec
String.
<%! String sMult, ssec; %>
<%
sMult = request.getParameter("MULTIPLIER");
ssec = request.getParameter("SOCSEC");
%>
Las siguientes etiquetas HTML configuran dos propiedades del JavaBean. Una
propiedad es un campo privado de la clase JavaBean. La primera línea usa la
etiqueta jsp: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 una operación similar para el campo socsec de la
clase JBonusBean.
<jsp:setProperty name = "jbonus" property="strMult" value="<%=sMult%>"/>
<jsp:setProperty name = "jbonus" property="socsec" value="<%=ssec%>"/>
<P>
Error messages:
<jsp:getProperty name = "jbonus" property="message"/>
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();
72 Introducción a J2EE
}
}
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;
}
}
Constructor
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 dos métodos set son setSocsec y setStrMult para seleccionar
los campos privados socsec y strMult (propiedades JavaBean) .
En este ejemplo, los valores usados para las propiedades socsec y strMult
vienen de las etiquetas setProperty name de la página JSP. El servidor J2EE
usa la información suministrada en la siguiente etiqueta setProperty name
para localizar el correspondiente método set en JBonusBean (con el alias
jbonus id ):
Métodos Get
JBonusBean tiene cuatro métodos get (métodos precedidos por la palabra get
). Los métodos Get obtienen y devuelven un valor de propiedad (valores de
campos privados). Los cuatro métodos get son getBonusAmt, getMessage,
getSocsec, y getStrMult para devolver datos desde los campos privados
bonusAmt, message , socsec , y strMult (propiedades JavaBean).
En este ejemplo, los valores usados para seleccionar los campos bonusAmt y
message vienen desde el método getBonusAmt. La página JSP recupera los
datos de las propiedades de JBonusBean usando las siguientes etiquetas
getProperty name. La pá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 por eso la página JSP puede recuperar los datos del JBonusBean. Los
métodos Get siempre tienen un valor de retorno y no tienen argumentos.
Podríamos observar que aunque el método getBonusAmt seleccciona valores
de propiedades, realmente no necesita devolver ningún valor en este
ejemplo, devuelve this.bonusAmt para evitar un error en tiempo de ejecución
del servidor J2EE.
El método getBonusAmt usa una sentencia if-else para manejar el caso cuando
no se suministra ningún valor strMult. Cuando la página JSP se carga por
primera vez, el usuario final no ha suministrado ningún dato, pero todas las
etiquetas y scriptlets de la página son ejecutados de cualquier forma. En este
caso, el valor de la propiedad strMult pasada a JBonusBean es null, lo que
resulta en un multiplicador nulo y un valor nulo de bonusAmt. Ocurre un error
de servidor cuando la página JSP obtiene e intenta mostrar el valor null de
bonusAmt. Para evitar este error, bonusAmt se selecciona a cero 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);
Bonus record = theCalculation.getRecord(
Capítulo 5.Tecnología JavaBeans 75
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;
}
j2ee -verbose
deploytool
cloudscape -start
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
76 Introducción a J2EE
Como 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:
Menú File:
Introduction:
• Pulsamos Next.
Ventana Inspecting:
Verificar:
Nota:
En la versión 1.2.1 del software podríamos obtener un error tests
app.WebURI. Esto significa que la herramienta DeployTool no puso la
extensión .war al fichero WAR durante su creacción. Es un error menor y la
aplicación J2EE se despliega sin problemas.
Desplegar:
Nota:
No marcamos la caja "Return Client Jar". El único momento en que debemos
chequear esta caja es cuando usamos persistencia controlada por el bean o
desplegamos una aplicación solitaria para el programa 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 toda la información de despliegue necesaria para una
aplicación solitaria.
• Pulsamos Next .
• Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean
y bonus para BonusBean. Si no es así, tecleamos los nombres JNDI
nosotros mismos, y pulsamos la tecla Return.
• Pulsamos Next. Nos aseguramos de que el nombre Context Root
muestra JSPRoot. Si no es así, lo tecleamos nosotros mismos y pulsamos
la tecla Return.
• Pulsamos Next .
78 Introducción a J2EE
El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página
bonus.html apuntamos nuestro navegador a
http://localhost:8000/JSPRoot/bonus.html, que es dónde la herramienta de
despliegue puso el fichero HTML.
Bonus Calculation
Bonus Calculation
Por ejemplo, una compañía puede usar XML para producir informes para que
las diferentes partes que reciban los informes puedan manejar los datos de
una forma apropiada a sus necesidades. Una parte podría pasar los datos XML
a través de un programa para traducirlos a HTML y poder ponerlos en la Web,
otra parte podría pasar los datos por una herramienta para producir un inform
de stocks, y otra tercera parte podría pasar los datos XML a través de una
herramienta para crear una presentación de marketing. Mismos datos,
diferentes necesidades, y un grupo de programas y herramientas
independientes de la plataforma para usar los mismos datos en varis formas
distintas. Estas capaciades tan flexibles y baratas están disponibles a través
de etiquetas XML, Definiciones de Tipos de Documentos (DTDs) también
conocidos com esquemas XML, y los APIs XML.
• Los estilos XSL nos pemiten hacer cosas como el mapeo de XML a HTML.
Por ejemplo, podemos definir una etiqueta de título XML para que
represente el título de un artículo, y crear un fichero XSL que mapee la
etiqueta de título CML a una etiqueta H1 de HTML para mostrarselo al
usuario final.
• Un DTD (también conocido como esquema XML) contiene
especificaciones que permiten a otros programa validad la estructura
de un fichero XML para asegurarse que los datos están etiquetados de
la forma correcta. Por ejemplo, un DTD para un artículo podría
permitir una etiqueta de título, pero cero o más primeros y segundos
niveles de cabeceras.
80 Introducción a J2EE
Lo más bonito sobre XML es que el etiquetado está separado de las hojas de
estilos y DTD. Esto significa que podemos tener un documento XML y desde a
muchas hojas de estilo o DTDs. Diferentes hojas de estilo nos permiten tener
diferentes presentaciones dependiendo de cómo se utilice el documento. Por
ejemplo, un artículo en XML puede tener una hoja de estilo para diferentes
web sites donde se va a publicar para que corresponda con el aspecto y
comportamietno de cada site.
Prólogo XML
Documento Raíz
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 el DTD porque es donde asignamos
especificaciones para las etiquetas por sus nombres.
Nodos Hijos
Hay varias formas de etiquetar datos XML. Este ejemplo usa etiquetas vacías,
que son etiquetas que no encierran datos, usan atributos para especificar
datos, y se cierran con una barra inclinada. La siguiente etiqueta vacía de
este ejemplo, podría crearse para que los datos se encerraran entre etiquetas
XML. El analizador XML chequea todos los datos encerrados por datos que
llamados etiquetas bien-formadas. Las etiquetas bien-formadas consisten en
una etiqueta de apertura y una de cierre como es muestra en 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>
La clase JBonusBean para esta lección tiene sentencias import para crear el
documento 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én podría escribirse en un fichero, pero necesitaríamos
configutrar nuestro navegador para usar el Java Plug-In e incluir un fichero de
policía de seguridad que concediera permiso para escribir un fichero.
Para generar el fichero XML para esta lección, necesitamos importar las clases
ElementNode y XmlDocument. También necesitamos las clases StringWriter e
IOException 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;
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 el nú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);
//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();
}
El fichero j2ee.jar que viene con nuestra instalación J2EE proporciona APIs
para analizar y manipular datos XML. El fichero JAR realmente prporciona APIs
XML para SAX, DOM y J2EE. Podemos usar cuaquier API que necesitamos como
se muestra en la siguiente figura, el texto XML es independiente de la
plataforma y el lenguaje de creacción...
SAX y DOM
El API SAX es un mecanismo de acceso serial dirigido por eventos que hace un
proceso elemento 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. El API DOM es ideal para aplicaciones interactivas porque el
modelo completo del objeto está presente en la memoria, donde el usuario
puede acceder a él y modificarlo.
J2EE
Como todo lo que hemos hecho en esta lección ha sido modificar la clase
JBonusBean, simplementen podemos actualizar y redesplegar la aplicación.
Nota:
La aplicación BonusApp de la lección anterior se desinstala automáticamente.
El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página
bonus.jsp apuntamos el navegador a
http://localhost:8000/JSPRoot/bonus.jsp, que es donde la herramietna
Deploy puso la página JSP.
7. Añadir JDBC
Hasta ahora, la aplicación de ejemplo J2EE ha escrito y leído los datos desde
una base de datos Cloudscape subyancente sin que hayamos escrito código
SQL. Esto es porque el contenedor ha estado manejando el almacenamiento y
recuperación de los datos a través del bean de entidad. La persistencia
controlada por el contenedor es el termino usado 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 por el
contenedor por defecto e implementar la persistencia controlada por el bean.
Esta sección nos lleva a través del código de BonusBean con persistencia
controlada por el bean. Lo primero que observaremos es que hay mucho más
código que en la versión con persistencia controlada por el contenedor.
Capítulo 7.Añadir JDBC 89
Sentencias Import
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
Métodos de Negocio
Los métodos de negocio no han cambiado para esta lección excepto en las
llamadas a System.out.println, que nos permiten ver el orden en que se
llaman los métodos de negocio 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;
}
90 Introducción a J2EE
ejbCreate
Una cosa a observar de esta clase es que devuelve un valor String que es la
clave primaria, pero la declaración para este método en el interface home
espera recibir un ejemplar de la clase Bonus. El contenedor usa la clave
primaria devuelta por este método para crear un ejemplar de Bonus.
System.out.println("Create Method");
try {
//Establish database connection
ic = 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 {
//Close database connection
ps.close();
con.close();
}
//Return primary key
return socsec;
}
Capítulo 7.Añadir JDBC 91
ejbPostCreate
ejbFindByPrimaryKey
Una cosa a observar sobre esta clase es que devuelve un valor String que es la
clave primaria, pero la declaración para este método en el interface home
espera recibir un ejemplar de la clase Bonus. El contenedor usa la clave
primaria devuelta por este método para crear un ejemplar de Bonus.
ejbLoad
ejbStore
ejbRemove
ejbActivate
ejbPassivate
setEntityContext
unsetEntityContext
try {
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("bonus");
homebonus = (BonusHome)
PortableRemoteObject.narrow(
objref, BonusHome.class);
} catch (Exception NamingException) {
NamingException.printStackTrace();
}
} else {
this.bonusAmt = 0;
this.message = "None.";
return this.bonusAmt;
}
}
Como este ejemplo usa persistencia controlada por el bean, tenemos que
crear la tabla BONUS en la base de datos CloudscapeDB. Con persistencia
controladda por el contenedor, 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 este ejemplo, el escript createTable.sql va en nuestro
directorio ~/J2EE/Beans, y el script cloudTable.sh (Unix) o cloudTable.bat
(Windows/NT) va en nuestro directorio ~/J2EE.
Unix:
../cloudTable.sh
Windows/NT:
..\cloudTable.bat
createTable.sql
exit;
cloudTable.bat
cloudTable.sh
Tenemos que actualizar el fichero JAR con el nuevo código del Bean. Si
tenemos los dos beans en un sólo fichero JAR, tenemos que borrar 2BeansJar y
crear uno nuevo. Los pasos para añadir CalcBean son los mismos que los de la
lección Comunicaciones entre Beans. Los pasos para añadir BonusBean son
ligeramente diferentes como se describe aquí.
Si tenemos los beans en ficheros JAR separados, tenemos que borrar el fichero
JAR con BonusBean y crear uno nuevo como se describe aquí.
EJB JAR :
EJB JAR :
• Pulsamos Next .
General :
Selecciones de Entidad:
Entradas de Entornio:
• Pulsamos Next .
Referencias a Recursos:
• Pulsamos Add
• Tecleamos jdbc/BonusDB en la primera columna, debajo de Coded
Name. Nos aseguramos de que Type es javax.sql.DataSource, y
Authentication es Container .
• Pulsamos Next.
Seguridad:
Control de Transación :
Revisión de Selecciones:
• Pulsamos Finish .
Ventana Inspecting:
Verificar:
Nota:
En la versión 1.2.1 del software podríamos obtener un error tests
app.WebURI. Esto significa que la herramienta DeployTool no puso la
extensión .war al fichero WAR durante su creacción. Es un error menor y la
aplicación J2EE se despliega sin problemas.
Desplegar:
El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página
bonus.html apuntamos nuestro navegador a
http://localhost:8000/JSPRoot/bonus.html, que es dónde la herramienta de
despliegue puso el fichero HTML.
La salida del servidor J2EE podría mostrar los siguientes mensajes cada vez
que se intente un acceso a la base de datos. Estos mensajes significan que no
se suministraron nombres de usuarios ni passwords para acceder a la base de
datos. Podemos ignorar estos mensajes porque los nombres de usuario y las
passwords no son necesarios para acceder a la base de datos Cloudscape, y
este ejemplo funciona bien sin importarle estos mensajes
Cannot find principal mapping information for data source with JNDI name
jdbc/Cloudscape
Aquí tenemos una versión más limpia de la salida del servidor J2EE (el
mensaje de arriba fue editado)
setEntityContext method
Create Method
Post Create
setEntityContext method
Find by primary key
Load method
getBonus
Store method
Load method
getSocSec
Store method
Find by primary key
Load method
getSocSec
Store method
Load method
Capítulo 7.Añadir JDBC 101
getBonus
Store method
<?xml version="1.0"?>
<report>
<bonusCalc ssnum="777777777" bonusAmt="300.0" />
</report>