Ola, Jorge,
 
   Até onde eu sei, existe pouca documentação em português, este site tem uma introdução    http://www.dmu.com/linux/jvlx0.html
 
e este documento anexo made in paraguai.
 
 
 
um abraço


 
 
 
 
 
 
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]
-------------------------------------------------------------------------


Reply via email to