Beans de Entidad y de Sesión

El ejemplo usa dos Beans de entidad y dos de sesión. Los Beans de entidad, AuctionItemBean y RegistrationBean, representan ítems persistentes que podrían estar almacenados en un base de datos, y los Beans de sesión, SellerBean y BidderBean, representan operaciones de vida corta con el cliente y los datos.

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:


AuctionServlet

El AuctionServlet es esencialmente la segunda fila en la aplicación y el punto focal para las actividades de la subasta. Acepta entradas finales del usuario desde el navegador mediante el protocolo de transferencia de hypertexto (HTTP), pasa la entrada al Bean Enterprise apropiado para su proceso, y muestra el resultado del proceso al usuario final en el navegador.

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();
}

Beans de Entidad

AuctionItemBean y RegistrationBean son Beans de entidad. AuctionItemBean añade nuevos ítems de subasta a la base de datos y actualiza la cantidad pujada por los usuarios cuando éstos pujan por el ítem. RegistrationBean añade información a la base de datos sobre usuarios registrados. Ambos Beans consisten en las clases descritas aquí.

AuctionItem Entity Bean

Aquí están las clase de AuctionItemBean. Recuerda que estos Beans de Enterprise son objetos distribuidos que usan el API RMI (Invocación Remota de Métodos), por eso, cuando ocurre un error se lanza una excepción RMI remota. AuctionItem es un interface remoto. Describe qué hace el Bean declarando los métodos definidos por el usuario que proporcionan la lógica de negocio para este Bean. Estos métodos son usados por el cliente para interactuar con el Bean sobre la conexión remota. Su nombre se mapea a la tabla AUCTIONITEMS que puedes ver abajo.

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.

Tabla Auction Items

Aquí está la tabla AUCTIONITEMS.
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) )

Registration Entity Bean

RegistrationBean consta de las mismas clases y tablas de base de datos que el Bean AuctionItem, excepto que la lógica de negocio real, los campos de la tabla de la base de datos, y la clave primaria son de alguna forma diferentes. En vez de describir las clases, podemos navegar por ellas y luego volver a la descripción de las clases de AuctionItem si tenemos alguna pregunta.

Tabla Registration

Aquí está la tabla REGISTRATION.
create table REGISTRATION (THEUSER VARCHAR(40) ,
PASSWORD VARCHAR(40) ,
EMAILADDRESS VARCHAR(80) ,
CREDITCARD VARCHAR(40) ,
BALANCE DOUBLE PRECISION )

Beans de Sesión

BidderBean y SellerBean son los Beans de sesión. BidderBean recupera una lista de los ítems de la subasta, busca ítems, chuequea el ID y la password del usuario cuando alguien hace una puja, y almacena las nuevas pujas en la base de datos. SellerBean chequea el ID y la password del usuario cuando alguien postea un ítem para su subasta, y añade nuevos ítems para subasta a la base de datos.

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.

Bean de sesión Bidder

Aquí están las clase de BidderBean. Recuerda que estos Beans de Enterprise son objetos distribuidos que usan el API RMI (Invocación Remota de Métodos), por eso, cuando ocurre un error se lanza una excepción RMI remota.

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.

Bean de sesion Seller

SellerBean consta de los mismos tipos de clase que un BidderBean, excepto que la lógica de negocio es diferente. En vez de describir las clases, puedes navegar por ellas y luego volver a la explicación de BidderBean si tienes alguna duda.

Clases Contenedor

Las clases que necesita el contenedor para desarrollar un Bean Enterprise dentro de un servidor de JavaBeans Enterprise particular se generan con una herramienta de desarrollo. Las clases incluyen _Stub.class y _Skel.class que proporcionan el RMI en el cliente y el servidor respectivamente.

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.


Ozito