En esta p�gina:
A�adir JDBC
Hasta ahora, la aplica��o de exemplo J2EE ha escrito y le�do los dados desde una base de dados Cloudscape subyancente sin que tenhamos escrito c�digo SQL. Esto es porque container ha estado manejando el almacenamiento y recupera��o de los dados a trav�s de um Bean de entidade. La persistencia controlada por container es el termino usado para descrever la situa��o donde container maneja el almacenamiento y la recupera��o. Esta li��o nos muestra como sobreescribir la persistencia controlada por container por defecto e implementar la persistencia controlada por el bean.
La persistencia controlada por el bean es quando nosotros escribimos m�todos de los beans de entidade o de sess�o para usar los comandos SQL que le proporcionamos. La peristencia controlada por el bean puede ser util si necesitamos melhorar el rendimiento o mapear dados de varios beans en un fila de una tabla de base de dados.
Esta li��o modifica el bean de entidade de la aplica��o de exemplo J2EE para usar persistencia controlada por el bean.
Ciclo de Vida de um Bean
Modificar el c�digo de BonusBean
Modificar el C�digo de CalcBean y JBonusBean
Crear uma Tabla de a base de dados
Eliminar el Fichero JAR
Verificar y Desplegar la aplica��o
Ejecutar la aplica��o
M�s Informaci�n
C�digo fuente de los exemplos de la li��o
Ciclo de Vida de um Bean
La li��o 3 mostraba a classe BonusBean manejada por container. Los �nicos m�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 un bean de entidade y pasarle los valores bonus y socsec. container ten�a en cuenta cosas como la cria��o de la fila en uma Tabla de a base de dados, y asegurarse de que los dados en memoria era consistentes con los dados de la fila de uma Tabla. Con la persistencia controlada por el bean nosotros tenemos que implementar todos estos comportamientos, lo que significa a�adir codigo JDBC� y SQL, e implementar os m�todos vac�os del exemplo controlado por container.
Un bean de sess�o o de entidade consiste en m�todos de negocio y m�todos de ciclo de vida. en el exemplo, CalcBean tem dos m�todos de negocio, calcBean y getRecord , y BonusBean tem dos m�todos de negocio getBonus y getSocsec. Tanto CalcBean como BonusBean tem los siguientes m�todos de ciclo de vida. A os m�todos de negocio chama el cliente y a os m�todos del ciclo de vida chama container de um Bean.
setEntityContext: container chama primero a este m�todo para pasar un objeto contexto al bean de entidade. El contexto de entidade lo actualiza dinamicamente container incluso si muchos clientes chaman al bean de entidade a la vez, el contexto contem dados actuales para cada chamada. Un bean de sess�o tem un m�todo setSessionContext correspondiente que realiza una funci�n similar a la del m�todo setEntityContext.
ejbCreate: container chama a este m�todo quando un cliente chama o m�todo create interface home de um Bean. Por cada m�todo create en el interface home, el bean tem un m�todo ejbCreate correspondiente con a mesma assinatura (par�metros y valor de retorno).
ejbPostCreate: container chama a este m�todo depois de que se complete el m�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 tem valor de retorno. Usamos ejbPostCreate para implementar qualquer procesamiento especial que necesitemos hacer depois de crear el bean y antes de que est� disponible para el cliente. Lo podemos dejar en blanco si no necesitamos procesamiento especial.
ejbRemove: container chama a este m�todo quando un cliente chama o m�todo remove interface home de um Bean. La aplica��o de exemplo J2EE para este tutorial no inclui nemhum m�todo remove en el interface home.
unsetEntityContext: container chama a este m�todo depois de que se tenha chamado a ejbRemove para eliminar el bean de entidade. S�lo los beans de entidade tem un m�todo unsetEntityContext. Un bean de sess�o no tem el correspondiente m�todo unsetSessionContext.
ejbFindByPrimaryKey: container chama a este m�todo quando un cliente chama o m�todo findByPrimaryKey interface home de um Bean. Por cada m�todo find interface home de um Bean, tem su correspondiente m�todo ejbFind< type > con a mesma assinatura (par�metros y valor de retorno).
ejbLoad y ejbStore : container chama a estos m�todos para sincronizar el estado de um Bean con a base de dados subyacente. quando un cliente selecciona u obtem los dados de un bean como en el caso de un m�todo get, container chama o m�todo ejbStore para env�ar el objeto a a base de dados y chama a ejbLoad para leerlo de nuevo. quando un cliente chama a un m�todo find, container chama a ejbLoad para inicializar el bean con los dados desde a base de dados subyacente.
ejbActivate y ejbPassivate: container chama a estos m�todos para activar o desactivar el estado de um Bean. La activaci�n o desactivaci�n se refieren al intercambio de um Bean dentro y fuera del almacenamiento temporal para liberar memoria, que podr�a ocurrir si un bean dado no ha sido chamado por un cliente desde hace mucho tiempo. Las implementaciones de ejbPassivate podr�an incluir cosas como el cierre de conexiones o ficheros usados por el bean, y para ejbActivate podr�a incluir cosas como la reapertura de las mismas conexiones o ficheros.
Modificar el c�digo de BonusBean
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 container.
Sentencias Import
Los interfaces InitialContext, DataSource, y Connection se importan para establecer conexiones con a base de dados. El interface PreparedStatement se importa para usarlo como plantilla para crear una petici�n SQL. El interface ResultSet se importa para manejar accesos a filas de dados devueltas por una consulta. Las clases FinderException y SQLException se importan para manejar excepciones de b�squeda y accesos a bases de dados.
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 li��o nos permiten establecer y cerrar conexiones con bases de dados. El string java:comp/env/jdbc/BonusDB indica el nombre de referencia para el recurso, que tambi�n deber�amos especificar quando a�adamos el bean de entidade a la aplica��o J2EE usando la herramienta Deploy. En este exemplo, la referencia de recursos es un alias a a base de dados Cloudscape (CloudscapeDB) donde est� almacenada uma Tabla de dados.
depois crearemos uma Tabla BONUS en CloudscapeDB, y durante el despliegue mapearemos 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;
M�todos de Negocio
os m�todos de negocio no han cambiado para esta li��o excepto en las chamadas a System.out.println, que nos permiten ver el orden en que se chaman os 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;
}
M�todos de Ciclo de Vida
Estos m�todos incluin chamadas a System.out.println para que podamos ver en que orden se chaman durante la ejecuci�n.
ejbCreate
La assinatura del m�todo ejbCreate para esta li��o lanza RemoteException y SQLException adem�s de CreateException. SQLException es necesaria porque el m�todo ejbCreate proporciona su propio c�digo SQL, y RemoteException es necesaria porque ese m�todo realiza acceso remoto
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 a classe Bonus. container 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 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;
}
ejbPostCreate
Este m�todo tem a mesma assinatura que ejbCreate, pero no tem implementaci�n porque nuestro exemplo no realiza procesamientos o inicializaciones posteriores a la cria��o.
public void ejbPostCreate(double bonus,
String socsec)
throws RemoteException,
CreateException,
SQLException {
System.out.println("Post Create");
}
ejbFindByPrimaryKey
La versi�n controlada por container de BonusBean no incluia una implementaci�n de ejbFindByPrimaryKey porque container podr�a localizar los registros de a base de dados por su clave primaria si especificamos persistencia controlada por container y proporcionamos un campo de clave primaria durante el despliegue. En esta li��o, BonusBean se despliega con persistencia controlada por el bean por eso debemos proporcionar una implementaci�n para este m�todo y lanzar una SQLException. La versi�n controlada por contenedor s�lo lanzaba RemoteException y FinderException.
Si la operaci�n find localiza un registro con la clave primaria pasada a ejbFindByPrimaryKey, se devuelve el valor de la clave primaria para que container pueda chamar o m�todo ejbLoad para inicializar BonusBean con los dados bonus y socsec recuperados.
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 a classe Bonus. container usa la clave primaria devuelta por este m�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();
//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 chama depois de una chamada exitosa a ejbFindByPrimaryKey para cargar y recuperar dados y sincronizar los dados de um Bean con los de a base de dados.
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 table
ps = 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
Se chama a este m�todo quando un cliente selecciona u obtem dados en el bean para env�ar el objeto a a base de dados y mantener el bean y a base de dados 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 chama a este m�todo quando un cliente chama o m�todo remove interface home de um Bean. El cliente JavaBean de este exemplo no proporciona un m�todo remove que el cliente pueda chamar para eliminar BonusBean desde su contenedor. De todas formas, aqu� podemos ver la implementaci�n de un m�todo ejbRemove. quando container chama a ejbRemove, �ste obtem la clave primaria (socsec) de la variable de ejemplar socsec, elimina el bean de su contenedor, y borra la correspondiente fila de a base de dados.
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 {
ps.close();
con.close();
} catch (java.sql.SQLException ex) {
ex.printStackTrace();
}
}
ejbActivate
quando un bean no se ha utilizado durante mucho tiempo, container lo desactiva o lo mueve a un almacenamiento temporal donde container puede r�pidamente reactivar el bean en el caso de que alg�n cliente llame a un m�todo de negocio de um Bean. Este m�todo chama o m�todo getPrimaryKey en el contexto de entidade para que la clave primaria est� disponible para los clientes de um Bean. quando se hace una petici�n, container usa la clave primaria para cargar los dados de um Bean.
public void ejbActivate() {
System.out.println("Activate method");
socsec = (String)context.getPrimaryKey();
}
ejbPassivate
quando un bean no se ha utilizado durante mucho tiempo, container lo desactiva o lo mueve a un almacenamiento temporal donde container puede r�pidamente reactivar el bean en el caso de que alg�n cliente llame a un m�todo de negocio de um Bean. Este m�todo selecciona la clave primaria a null para liberar memoria mientras el bean est� desactivado.
public void ejbPassivate() {
System.out.println("Passivate method");
socsec = null;
}
setEntityContext
container chama a este m�todo para inicializar la variable de ejemplar context de um Bean. Es necesario porque el m�todo ejbActivate chama o m�todo getPrimarykey sobre la variable de ejemplar context para pasar el bean del estado desactivado al de activado.
public void setEntityContext(
javax.ejb.EntityContext ctx){
System.out.println("setEntityContext method");
this.context = ctx;
}
unsetEntityContext
container chama a este m�todo para poner a null la variable de ejemplar context depois de que se tenha chamado o m�todo ejbRemove para eliminar el bean. S�lo los beans de entidade tem un m�todo unsetEntityContext.
public void unsetEntityContext(){
System.out.println("unsetEntityContext method");
ctx = null;
}
}
Modificar el C�digo de CalcBean y JBonusBean
Como BonusBean proporciona su propio c�digo SQL, el m�todo CalcBean.calcbonus, que crea ejemplares de BonusBean, tem que modificarse para lanzar la excepci�n java.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;
}
a classe JBonusBean tem que modificarse para capturar la SQLException lanzada por CalcBean. DuplicateKeyExcpetion es una subclase de CreateException , por eso ser� 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";
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 uma Tabla de a base de dados
Como este exemplo usa persistencia controlada por el bean, tenemos que crear uma Tabla BONUS en a base de dados CloudscapeDB. Con persistencia controladda por container, uma Tabla se creaba autom�ticamente.
Para mantener las cosas sencillas, uma Tabla de a base de dados se crea con dos scripts: createTable.sql y cloudTable.sh (Unix) o cloudTable.bat (Windows/NT). Para este exemplo, 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.
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.bat
Este fichero se proporciona con los ficheros fuentes de esta leccci�n.
rem cloudTable.bat
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
rem
rem 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 JAR
Tenemos que actualizar el fichero JAR con el nuevo c�digo de um 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 li��o 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�.
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).
Cambiamos de directorio para que el directorio Beans muestre su contenido.
Seleccionamos Bonus.class
Pulsamos Add .
Seleccionamos BonusBean.class
Pulsamos Add .
Seleccionamos BonusHome.class
Pulsamos Add .
Clases Enterprise Bean JAR :
Nos aseguramos de ver Beans/Bonus.class, Beans/BonusHome.class, y Beans/BonusBean.class en el display.
Pulsamos OK.
EJB JAR :
Pulsamos Next .
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.
Introducimos BonusBean como nombre de display.
Pulsamos Entity .
Pulsamos Next .
Selecciones de entidade:
Seleccionamos Bean-managed persistence .
a classe de clave primaria es java.lang.String, Observa que la clave primaria tem que ser un tipo de clase, los tipos primitivos no son v�lidos como claves primarias.
Pulsamos Next .
Entradas de Entornio:
Pulsamos Next. Este sencillo bean no usa propiedades (entradas de entorno).
Referencias a Beans Enterprise:
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:
Pulsamos Next. Este sencillo bean no usa roles de seguridad.
Control de Transaci�n :
Seleccionamos Container-managed transactions (si no lo est� ya).
En la lista de abajo , marcamos como necesarios create , findByPrimaryKey, getBonus y getSocSec. Esto significa que container arranca una nueva transaci�n antes de ejecutar estos m�todos. La transaci�n se env�a justo antes de que os m�todos terminen.
Pulsamos Next .
Revisi�n de Selecciones:
Pulsamos Finish .
Ventana Inspecting:
Con 2BeansApp seleccionado pulsamos JNDI names.
Asignamos calcs a CalcBean , bonus a BonusBean , y jdbc/Cloudscape a jdbc/BonusDB.
Verificar y Desplegar la aplica��o
Antes de desplegar la aplica��o, es una buena idea ejecutar el verificador. El verificador mostrar� los errores en los componentes de la aplica��o como m�todos inexistentes que el compilador no captura.
Verificar:
Con 2BeansApp seleccionado, elegimos Verifier desde el men� Tools.
En el di�logo que aparece, pulsamos OK. La ventana deber�a decir que no hay nemhum fallo.
Cerramos la ventana del verificador porque ahora estamos listos para desplegar la aplica��o.
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 cria��o. Es un error menor y la aplica��o J2EE se despliega sin problemas.
Desplegar:
Desde el men� Tools, elegimos Deploy Application. Se mostrar� una caja de di�logo Deploy BonusApp.
Verificar que la seli��o de Target Server es un host local o el nombre de un host donde se est� ejecutando el servidor J2EE.
Marcar la caja Return Client Jar. Al marcar esta caja se crea un ficher JAR con la informaci�n de despliegue necesaria por el bean de entidade.
Pulsamos Next .
Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean, bonus para BonusBean y jdbc/Cloudscape para BonusDB. 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 .
Pulsamos Finish para empezar el despliegue. Se mostrar� una caja de di�logo que mostrar� el estado de la operaci�n de despliegue.
quando se tenha completado,pulsamos OK.
Ejecutar la aplica��o
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.
Rellenamos un n�mero de la seguridad social y un multiplicador.
Pulsamos el bot�n Submit. Bonus.jsp procesa nuestros dados y devuelve una p�gina HTML con el bono calculado.
La salida del servidor J2EE podr�a mostrar los siguientes mensajes cada vez que se intente un acceso a a base de dados. Estos mensajes significan que no se suministraron nombres de usuarios ni passwords para acceder a a base de dados. Podemos ignorar estos mensajes porque los nombres de usuario y las passwords no son necesarios para acceder a a base de dados Cloudscape, y este exemplo 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
getBonus
Store method
M�s Informaci�n
Podemos obtener m�s informaci�n sobre los Beans de entidade y la persistencia controlada 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 dados en:
http://java.sun.com/j2ee/j2sdkee/techdocs/guides/ejb/html/Database.fm.html
C�digo Fuente de los exemplos
Aqu� tems un fichero Zip con los ficheros fuente de los exemplos de esta p�gina:
fuentes_L7.zip
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usu�rios Java da Sucesu-SP
d�vidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------