Los Beans de sesión son el interface del cliente hacia los beans de entidad. El SellerBean procesa peticiones para añadir nuevos ítems para la subasta. El BidderBean procesa peticiones para recuperar ítems de la subasta y situar las pujas por esos ítems. El cambio o adición de datos a la base de datos en un Bean controlado por contenedor se le deja a los Beans de entidad:
Aquí hay un diagrama del tipo Unified Modeling Language (UML) para la clase AuctionServlet.
Los métodos de AuctionServlet mostrados arriba invocan a la lógica del negocio que se ejecuta en el servidor buscando un Bean Enterprise y llamando a uno o más de sus métodos. Cuando el servelt añade código HTML a una página para mostrarsela al usuario, la lógica se ejecuta en el cliente.
Por ejemplo, el método listAllItems(out) ejecuta código en el cliente para generar dinámicamente una página HTML para que la vea el cliente en un navegador. La página HTML se rellena con los resultados de una llamada a BidderBean que ejecuta la lógica en el servidor para generar una lista de todos los ítems de la subasta.
private void listAllItems(ServletOutputStream out)
throws IOException{
//Put text on HTML page
setTitle(out, "Auction results");
String text = "Click Item number for description
and to place bid.";
try{
addLine("<BR>"+text, out);
//Look up Bidder bean home interface.
BidderHome bhome=(BidderHome) ctx.lookup("bidder");
//Create Bidder bean remote interface.
Bidder bid=bhome.create();
//Call Bidder bean method through remote interface.
Enumeration enum=(Enumeration)bid.getItemList();
if(enum != null) {
//Put retrieved items on servlet page.
displayitems(enum, out);
addLine("", out);
}
} catch (Exception e) {
//Pring error on servlet page.
addLine("AuctionServlet List All Items error",out);
System.out.println("AuctionServlet <list>:"+e);
}
out.flush();
}
AuctionItemHome es el interface home. Describe cómo se crea el Bean, como encontrarlo, y eliminarlo de su contenedor. Las herramientas de desarrollo del servidor de Beans de Enterprise proporcionarán la implementación para este interface.
AuctionItemBean es el Bean de Enterprise. Implementa EntityBean, proporciona la lógica de negocio para los métodos definidos por el desarrollador, e implementa los métodos de EntityBean para crear el Bean y seleccionar el contexto de sesión. Esta es una clase que necesita implementar el desarrollador del Bean. Sus campos variables mapean a los campos de la tabla AUCTIONITEMS que puedes ver abajo.
AuctionItemPK es la clase clave primaria. El servidor de Beans Enterprise requiere que un Bean de Entidad Manejado por Contenedor tenga una clase clave primaria con un campo público primario (o campos, si se usan claves primarias compuestas). El desarrollador del Bean implementa esta clase. El campo ID es la clave primaria en la tabla AUCTIONITEMS que puedes ver más abajo, por eso el campo id es un campo público de esta clase. Al campo id se le asigna un valor cuando se construye la clase de la clave primaria.
Podemos pedirle al contenedor que maneje la persistencia de la base de datos de un Bean Enterprise o escribir el código para manejar la persistencia por nosotros mismos. En este capítulo, todos los beans son manejados por el contenedor. Con esto nosotros sólo decimos qué campos son manejados por el contenedor y le dejamos al servidor de JavaBeans de Enterprise que haga el resto. Esto es fenomenal para las aplicaciones sencillas, pero si tuvieramos que codificar algo más complejo, necesitaríamos más control.
Cómo escribir los servicios ocultos de los JavaBeans Enterprise para ganar más control o proporcionar servicios similares para las aplicaciones que no usen JavaBeans de Enterprise se cubre en el capítulo 3.
create table AUCTIONITEMS (SUMMARY VARCHAR(80) , ID INT , COUNTER INT , DESCRIPTION VARCHAR(1000) , STARTDATE DATE , ENDDATE DATE , STARTPRICE DOUBLE PRECISION , INCREMENT DOUBLE PRECISION , SELLER VARCHAR(30) , MAXBID DOUBLE PRECISION, BIDCOUNT INT, HIGHBIDDER VARCHAR(30) )
create table REGISTRATION (THEUSER VARCHAR(40) , PASSWORD VARCHAR(40) , EMAILADDRESS VARCHAR(80) , CREDITCARD VARCHAR(40) , BALANCE DOUBLE PRECISION )
Ambos Beans de sesión están desarrollados inicialmente como Beans sin estado. Un Bean sin estado no mantiene un registro de lo que hizo el cliente en una llamada anterior; mientras que un Bean con estado completo si lo hace. Los Beans con estado completo son muy útiles si la operación es algo más que una simple búsqueda y la operación del cliente depende de algo que ha sucedido en una llamada anterior.
No exiten claves primarias porque estos Beans son temporales y no hay accesos a la base de datos. Para recuperar ítems de la base de datos, BidderBean crea un ejemplar de AuctionItemBean, y para procesar las pujas, crea un ejemplar de RegistrationBean.
Bidder es un interface remoto. Describe lo que hace el Bean declarando los métodos definidos por el desarrollador que proporcionan la lógica de negocio para este Bean. Esto son los que que el cliente llama de forma remota.BidderHome es el interface home. Descibe cómo se crear el Bean, como se busca y como se elimina de su contenedor.
BidderBean es el Bean de Enterprise. Implementa SessionBean, proporciona la lógica de negocio para los métodos definidos por el desarrollador, e implementa los métodos de SessionBean para crear el Bean y seleccionar el contexto de sesión.
Estas clases se utilizan para mover datos entre el programa cliente y el servidor de JavaBeans de Enterprise. Además, la implementación de las clases se crea para los interfaces y las reglas de desarrollo definidas para nuestro Bean.
El objeto Stub se instala o se descarga en el sistema cliente y proporciona un objeto proxy local para el cliente. Implementa los interfaces remotos y delega de forma transparente todas las llamadas a métodos a través de la red al objeto remoto.
El objeto Skel se instala o se descarga en el sistema servidor y proporciona un objeto proxy local para el servidor. Despempaqueta los datos recibidos a través de la red desde el objeto Stub para procesarlos en el servidor.