04 Curso JavaBeans - Sp.pdf

Embed Size (px)

Citation preview

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    1/72

    JavaBeans Enterpris

    Construir Nuestro Primer Bean de Sesisin Estado

    Sobre este Tutorialq

    Sobre el Ejemploq

    Introduccin a los JavaBeans Enterpriseq

    Construir Nuestro Pimer Bean de Sesin sin Estado Paso 1: Instalar un Servidor de JavaBeans Enterprise

    Paso 2: Especificar el Interface Remoto de JavaBeans Enterprise

    Paso 3: Especificar el Interface Home

    Paso 4: Escribir la Clase JavaBean Enterprise Paso 5: Crear el Fichero ejb-jar

    Paso 6: Desarrollar los JavaBeans del Ejemplo Paso 7: Escribir el Cliente JavaBean Interface

    Paso 8: Ejecutar el Cliente

    q

    Sumarioq

    obre este Tutorial

    a intencin de este turorial es demostrar lo fcil que es escribir componentes Jel lado el servidor usando el modelo de componentes JavaBeans Enterprise. Deecho, fcil de usar y fcil de programar son las claves. Est diseado paraejorar nuestros conocimientos sobre la Especificacin de JavaBeans Enterprise

    u modelo, porporcionado ejemplos concretos y guas paso a paso para construtilizar aplicaciones JavaBeans Enterprise.

    ste tutorial nos enser como programar JavaBeans Enterprise, y cmo instalaro desarrollarlos en un contenedor de JavaBeans Enterprise. Nota: en larminologa de JavaBeans Enterprise el proceso de instalacin es llamado

    desarrollo". El Contenedor de JavaBeans Enterprise lo proporcionan servidoe JavaBeans de terceras partes, por eso los programadores no tenemos querocuparnos demasiado de ellos.

    guiendo los ocho pasos, y trabajando sobre el ejemplo, nos familiarizaremos cs piezas fundamentales del modelo JavaBeans Enterprise, y crearemos un ver

    avaBeans Enterprise del programa "Hello World".

    ara sacar el mayor partido de este tutorial sera conveniente estar familiarizadomenos con los conceptos bsicos del modelo de programacin de JavaBeans

    http://-/?-http://-/?-http://java.sun.com/products/ejb/docs.htmlhttp://java.sun.com/products/ejb/docs.htmlhttp://-/?-http://-/?-
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    2/72

    nterprise. Los programadores que no estn familiarizados con los JavaBeanseberan leer el libro blanco sobre Tecnologa de JavaBeans Enterprise.

    obre el Ejemplo

    ejemplo presente un JavaBean Enterprise de sesin sin estado completo con digo fuente para todos los componentes. Es funcionalmente equivalente alerenne programa "Hello World".

    ejemplo est construido asumiendo el acceso al servidor de JavaBeansnterprise de BEA Weblogic, que se considera por conveniencia como una versie evaluacin de este servidor, y que est disponible en la Web, (ver El Paso 1ara las instrucciones de descarga e instalacin del BEA Weblogic) El cdigo delemplo debera funcionar en cualquier servidor que soporte contenedores

    avaBeans Enterprise. Los nicos cambios que se deberan necesitar estaran enroceso de desarrollo y quizs en el cdigo del cliente. El siguiente diagramaescribe la arquitectura del ejemplo DemoBean y su programa cliente.

    zito

    http://java.sun.com/products/ejb/white_paper.htmlmailto:[email protected]:[email protected]://java.sun.com/products/ejb/white_paper.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    3/72

    JavaBeans Enterpris

    Fundamentos de la Tecnologa JavaBeansEnterpriseTM

    dice de la PaginaIntroduccinq

    Tecnologa JavaBeans Enterprise

    El Contenedor EJBr

    Beans Enterprise

    Interfaces Remoto y Homes

    Mtodos de Negocios

    Beans de Entidads

    Beans de Sesins

    Mtodos de Ciclo de Vidas

    Vuelta a los Interfaces Home y Remotos

    r

    Beans Enterprise Como Objetos Distribuidosr

    q

    Beans Enterprise del Tipo Entidad

    Persistencia Menejada por el Contenedor

    La Clase Beans

    Interface Homes

    Interface Remotos

    Mtodos de Retrollamadas

    r

    Persistencia Manejada por el Beanr

    q

    Beans Enterprise del Tipo Sesin

    Beans de Sesin sin Estador

    Beans de Sesin con Estador

    q

    Soluciones de Despliegue de la Tecnologa de JavaBeans Enterpriseq

    Clientes de JavaBeans Enterpriseq

    http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    4/72

    ntroduccin

    a especificacin 1.1 de JavaBeans Enterprise TM (EJB) define una arquitectura pdesarrollo y despliegue de aplicaciones basadas en objetos distribuidos

    ansacionales, software de componentes del lado del servidor. Las organizacionueden construir sus propios componentes o comprarlos a vendedores de tercerartes. Estos componentes del lado del servidor, llamados beans enterprise, sbjetos distribuidos que estn localizados en contenedores de JavaBean Enterprproporcionan servicios remotos para clientes distribuidos a lo largo de la red.

    ecnologa de JavaBeans Enterprise

    a especificacin de JavaBeans Enterprise define una arquitectura para un sistemansacional de objetos distribuidos basado en componentes. La especificacinanda un modelo de programacin; es decir, convenciones o protocolos y un

    onjunto de clases e interfaces que crean el API EJB. Este modelo de programacroporciona a los desarrolladores de Beans y a los vendedores de servidores EJB

    n conjunto de contratos que definen una plataforma de desarrollo comn. Elbjetivo de estos contratos es asegurar la portabilidad a travs de los vendedorel soporte de un rico conjunto de funcionalidades.

    Contenedor EJB

    os Beans Enterprise son componentes de software que se ejecutan en un entorspecial llamado un contenedor EJB. El contenedor contiene y maneja un Beannterprise de igual forma que el Servidor Web Java contiene un servelt o unervidor Web contiene un applet Java. Un Bean Enterprise no puede funcionar

    era de un contenedor EJB. El contenedor EJB controla cada aspecto del beannterprise en tiempo de ejecucin incluyendo accesos remotos al bean, seguridaersistencia, transaciones, concurrencia, y accesos a un almacen de recursos.

    contenedor aisla al bean enterprise de accesos directos por parte de aplicacioiente. Cuando una aplicacin cliente invoca un mtodo remoto de un beannterprise, el contenedor primero intercepta la llamada para asegurar que laersistencia, las transaciones, y la seguridad son aplicadas apropiadamente a caperacin que el cliente realiza en el Bean. El contenedor maneja estos aspectorma automtica, por eso el desarrollador no tiene que escribir este tipo de lg

    entro del propio cdigo del bean. El desarrollador de beans enterprise puedenfocarse en encapsular la reglas del negocio, mientras el contenedor se ocupa do lo dems.

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    5/72

    os contenedores manejan muchos Beans simultneamente de igual forma que ava WebServer maneja muchos servlets. Para reducir el consumo de memoria e proceso, los contenedores almacenan los recursos y manejan los ciclos de vide todos los beans de forma muy cuidadosa. Cuando un Bean no est siendo

    tilizado, un contenedor lo situar en un almacn para ser reutilizado por otrosientes, o posiblemente lo sacar de la memoria y slo lo traer de vuelta cuanea necesario. Como las aplicaciones cliente no tienen acceso directo a los beanel contenedor trata con el cliente y el bean-- la aplicacin cliente se despreocu

    ompletamente de las actividades de control de recursos del contenedor. Poremplo, un bean que no est en uso, podra ser eliminado de la memoria del

    ervidor, mientras que su referencia remota en el cliente permanece intacta.uando un cliente invoca a un mtodo de la referencia remota, el contenedormplemente re-activa el bean para servir la peticin. La aplicacin cliente seespreocupa de todo el proceso.

    n bean enterprise depende del contenedor para todo lo que necesite. Si un beanterprise necesita acceder a un conexin JDBC o a otro bean enterprise, lo hacavs del contenedor; si un bean enterprise necesita acceder a la identidad de amador, obtiene una referencia a s mismo, o accede a las propiedades a travu contenedor. El bean enterprise interacta con su contenedor a travs de unostos tres mecanismos:

    Mtodos de RetrollamadaTodo bean implementa un subtipo del interface EnterpriseBean que defin

    q

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    6/72

    muchos mtodos, llamados mtodos de retrollamada. Cada uno de estosmtodos alerta al bean sobre un evento diferente en su ciclo de vida y elcontenedor llamar a estos mtodos para notificar al bean cuando lo va aactivar, persistir su estado a la base de datos, finalizar la transacin, eliminel bean de la memoria, etc. Los mtodos de retrollamada le dan al bean laoportunidad de hacer algn trabajo domstico inmediatamente antes odespus de algn evento. Estos mtodos se describen con ms detalle es useccin posterior.

    EJBContextTodo bean obtiene un objeto EJBContext, que es una referencia directa a contenedor. El interface EJBContext proporciona mtodos para interactuacon el contenedor para que el bean pueda solicitar informacin sobre suentorno como la identidad de sus clientes, el estado de una transacin, o pobtener referencias remotas a s mismo.

    q

    Java Naming and Directory Interface (JNDI)El Inteface Java de Nombres y Directorios (JNDI) es una extensin estndade la plataforma Java para acceder a sistemas de nombrado como LDAP,NetWare, sistemas de ficheros, etc. Todo bean tiene automticamente accea un sistema de nombrado especial llamado Environment Naming Conte(ENC). El ENC est controlado por el contenedor y los bean acceden a lusando JNDI. El JNDI ENC permite al bean acceder a recursos comoconexiones JDBC, otros beans enterprise, y a propiedades especficas paraese bean.

    q

    a especificacin EJB define un contrato bean-contenedor, que incluye losecanismos (retrollamadas, EJBContext, JNDI ENC) descritos arriba as como

    stricto conjunto de reglas que describe cmo se comportarn los beans enterpsus contenedores en tiempo de ejecucin, como se comprobarn los accesos d

    eguridad, cmo se manejarn las transaciones, cmo se aplicar la persistenciatc. El contrato bean-contenedor est diseado para hacer portables los beansnterprise entre contenedores EJB para que los beans enterprise puedan seresarrollados una sla vez y puedan ejecutarse en cualquier contenedor EJB. Loendedores como BEA, IBM, y GemStone venden aplicaciones servidores quecluyen contenedores EJB. Idealmente, cualquier bean enterprise que cumpla laspecificacin debera poder ejecutarse en cualquier contenedor compatible EJB

    a portabilidad es el principal valor que EJB pone encima de la mesa. Laortabilidad asegura que un bean desarrollado para un contenedor puede migraotro si ese otro ofrece mejor rendimiento, caractersticas, o ahorros. Portabilidmbin significa que la destreza del desarrollador de beans puede influenciarseavs de varios contenedores EJB, proporcionando mejores oporturnidades pars organizaciones y los desarrolladores.

    dems de la portabilidad, la simplicidad del modelo de programacin EJB haceue este sea muy valioso. Como el contenedor tiene cuidado de manejar lasomplejas tareas como la seguridad, las transaciones, la persistencia, la

    http://-/?-http://-/?-
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    7/72

    oncurrencia y el control de recursos, el desarrollador de beans es libre paranfocar su atencin en las reglas del negocio y en un modelo de programacin mencillo. Esto quiere decir que los beans pueden desarrollarse rpidamente sinecesidad de profundos conocimientos en objetos distribuidos, transaciones y ostemas enterprise.

    eans Enterprise

    ara crear un componente EJB del lado del servidor, un desarrollador de beannterprise proporciona dos interfaces que definen los mtodos de negocio del bedems de la implementacin real de la clase bean. Entonces el cliente usa unterface pblico del bean para crear, manipular, y eliminar beans del servidor Ea clase de implementacin, ser llamada clase del bean, es ejemplarizada enempo de ejecucin y se convierte en un objeto distribuido.

    os beans enterprise viven en un contenedor EJB y son accedidos por aplicacionientes a travs de la red usando sus interfaces remoto y home. Estos interfacexponen las capacidades del bean y proporcionan todos los mtodos necesarios

    ara crear, actualizar, borrar e interactuar con el bean. Un bean es un componeel lado del servidor que representa un concepto de negocio como un Cliente o ependiente de Hotel.

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    8/72

    terfaces Remoto y Home

    os interfaces remoto y home representan al bean, pero el contenedor aisla a loeans de accesos directos desde aplicaciones cliente. Cada vez que un bean esolicitado, creado, o borrado, el contenedor maneja todo el proceso.

    interface home representa los mtodos del ciclo-de-vida del componente (creestruir, encontrar) mientras que el interface remoto representa los mtodos deegocio del bean. Los interfaces remoto y home extienden los interfacesavax.ejb.EJBObject yjavax.ejb.EJBHome respectivamente. Estos tipos deterfaces EJB definen un conjunto estndard de mtodos de utilidad yroporcionan tipos base comunes para todos los interfaces remotos y home.

    os clientes usan el interface home del bean para obtener referencias al interfacemoto del bean. El interface remoto define los mtodos del negocio como mto

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBObject.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBHome.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBHome.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBObject.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    9/72

    ccesores o modificadores para cambiar el nombre del cliente, o mtodos deegocio que realizan tareas como usar el bean HotelClerk para reservar unaabitacin del hotel. Abajo tenemos un ejemplo de como un bean Customerodra ser accedido por una aplicacin cliente. En este caso el interface home espo CustomerHome y el interface remoto es el tipo Customer:

    ustomerHome home = // ... obtain a reference that

    // implements the home interface.

    / Use the home interface to create a

    / new instance of the Customer bean.

    ustomer customer = home.create(customerID);

    / using a business method on the Customer.

    ustomer.setName(someName);

    interface remoto define los mtodos de negocio del bean; los mtodos que sospecficos para el concepto de negocio que representa. Los interfaces remotos

    ubclases del interfacejavax.ejb.EJBObject que es una subclase del interfaceava.rmi.Remote. La importancia del rbol de herencias de los interfaces remo

    e explica ms adelante. Por ahora, nos enfocaremos en los mtodos del negociu significado. Abajo tenemos la definicin de un interface remoto para un beanustomer:

    mport javax.ejb.EJBObject;

    mport java.rmi.RemoteException;

    ublic interface Customer extends EJBObject {

    public Name getName()

    throws RemoteException;

    public void setName(Name name)

    throws RemoteException;

    public Address getAddress()throws RemoteException;

    public void setAddress(Address address)

    throws RemoteException;

    interface remoto define mtodos accesores y modificadores para leer y actuaformacin sobre un concepto de negocio. Esto es tpico de un tipo de beans

    amado bean de entidad, que representan un objeto de negocio persistente;bjetos de negocio cuyos datos se almacenan en una base de datos. Los beans ntidad representan datos del negocio en una base de datos y aadenomportamiento especfico para esos datos.

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBObject.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/rmi/Remote.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/rmi/Remote.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBObject.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    10/72

    todos de Negocio

    os mtodos de negocio tambin pueden representar tareas que un bean realizunque los beans de entidad frecuentemente tienen mtodos orientados a tareas tareas son ms tpicas en un tipo de beans llamados beans de sesin. Loseans de sesin no representan datos como los beans de entidad. Representanrocesos del negocio o agentes que realizan un servicio, como hacer una reservn el hotel. Abajo tenemos una definicin del interface remoto para un bean

    otelClerk, que es un tipo de bean de sesin:

    mport javax.ejb.EJBObject;

    mport java.rmi.RemoteException;

    ublic interface HotelClerk

    extends EJBObject {

    public void reserveRoom(Customer cust,

    RoomInfo ri,ate from, Date to)

    throws RemoteException;

    public RoomInfo availableRooms(

    Location loc, Date from, Date to)

    throws RemoteException;

    os mtodos de negocio definidos en el interface remoto HotelClerk representa

    rocesos en vez de simples accesores. El Bean HotelClerk acta como un agenn el sentido en que realiza tareas en beneficio del usuario, pero no persiste lismo en la base de datos. Nosotros no necesitamos informacin sobre elotelClerk, necesitamos que el dependiente del hotel realice tareas por nosotrste es un comportamiento tpico de un bean de sesin.

    ay dos tipos bsicos de beans enterprise: beans de entidad, que representanatos en una base de datos, y beans de sesin, que representan procesos o actomo agentes que realizan tareas. Cuando construyamos aplicaciones EJBearemos muchos beans enterprise, cada uno representando un concepto

    ferente del negocio. Cada concepto del negocio ser manifestado como un beae entidad o de sesin. Elegiremos el tipo de bean basndonos en lo que se espue haga el bean.

    eans de Entidad

    or cada interface remoto hay una clase de implementacin; un objeto de negocue realmente implementa los mtodos de negocio definidos en el interfaceemoto. Esta es la clase bean; el elemento clave del bean. Abajo tenemos unaefinicin parcial de la clase bean Customer:

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    11/72

    mport javax.ejb.EntityBean;

    ublic class CustomerBean

    implements EntityBean {

    Address myAddress;

    Name myName;

    CreditCard myCreditCard;

    public Name getName() {

    return myName;

    }

    public void setName(Name name) {

    myName = name;

    }

    public Address getAddress() {

    return myAddress;

    }

    public void setAddress(Address address) {

    myAddress = address;

    }

    ...

    ustomerBean es la implementacin de la clase. Contiene los datos y proporcitodos accesores y otros mtodos del negocio. Como bean de entidad, elustomerBean proporciona un objeto view de los datos del cliente. En lugar dscribir la lgica de acceso a la base de datos en una aplicacin, la aplicacinmplemente puede usar el interface remoto hacia el bean Customer para accelos datos del cliente. Los beans de entidad implementan el tipo

    avax.ejb.EntityBean que define un conjunto de mtodos de notificacin que eean usa para interactar con su contenedor.

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EntityBean.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EntityBean.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    12/72

    eans de Sesin

    Bean HotelClerk es un bean se sesin, que son muy similiares a los beans dntidad. Los beans de sesin representan un proceso o tarea, que se realizan eneneficio de la aplicacin cliente. Los beans de sesin podran usar otros beansara realizar tareas o acceder directamente a bases de datos. Un poco ms dedigo muestra a un bean de sesin haciendo ambas cosas. El mtodoeserveRoom() mostrado abajo usa otros beans para realizar una tarea, mientue el mtodo availableRooms() usa JDBC para acceder directamente a una be datos:

    mport javax.ejb.SessionBean;

    ublic class HotelClerkBean

    implements SessionBean {

    public void reserveRoom(

    Customer cust, RoomInfo ri,

    Date from, Date to) {

    CreditCard card = cust.getCreditCard();

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    13/72

    RoomHome roomHome =

    // ... get home reference

    Room room =

    roomHome.findByPrimaryKey(ri.getID());

    double amount = room.getPrice(from,to);

    CreditServiceHome creditHome =

    // ... get home reference

    CreditService creditAgent =

    creditHome.create();creditAgent.verify(card, amount);

    ReservationHome resHome =

    // ... get home reference

    Reservation reservation =

    resHome.create(cust,room,from,to);

    }

    public RoomInfo[] availableRooms(

    Location loc,Date from,

    Date to) {

    // Make an SQL call to find

    //available rooms

    Connection con = // ... get database

    //connection

    Statement stmt = con.createStatement();

    ResultSet results =

    stmt.executeQuery("SELECT ...");

    ...return roomInfoArray;

    }

    odras haber observado que las clases bean definidas arriba no implementan loterfaces remoto o home. EJB no requiere que la clase bean implemente estosterfaces; de hecho est desaconsejado que lo haga porque los tipos bases de terfaces remoto y home (EJBObject y EJBHome) definen muchos otrostodos que son implementados automticamente por el contenedor. Sin

    mbargo, la clase bean no proporciona implementaciones para todos los mtodoe negocio definidos en el interface remoto.

    todos de Ciclo de Vida

    dems de un interface remoto, todos los beans tienen un interface home. Elterface home proporciona mtodos de ciclo de vida para crear, destruir o localeans. Estos comportamientos de ciclo de vida estn separados del interfaceemoto porque los comportamientos que representa no son especficos para unlo ejemplar bean. Abajo tenemos la definicin de un interface home para el be

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    14/72

    ustomer. Observa que extiende el interfacejavax.ejb.EJBHome que a su vextiende el interfacejava.rmi.Remote:

    mport javax.ejb.EJBHome;

    mport javax.ejb.CreateException;

    mport javax.ejb.FinderException;

    mport java.rmi.RemoteException;

    ublic interface CustomerHome

    extends EJBHome {

    public Customer create(Integer

    customerNumber)

    throws RemoteException,

    CreateException;

    public Customer findByPrimaryKey(Integer

    customerNumber)throws RemoteException,

    FinderException;

    public Enumeration findByZipCode(int zipCode)

    throws RemoteException,

    FinderException;

    mtodo create() se utiliza para crear una nueva entidad. Esto resultar en u

    uevo registro de la base de datos. Un interface home podra tener muchostodos create(). El nmero y tipo de los argumentos de cada create() se de

    ara el desarrollador del bean, pero el tipo de retorno debe ser el mismo tipo deterface remoto. En este caso, llamar a create() sobre el interfaceustomerHome devolver un ejemplar de Customer. Los mtodosndByPrimaryKey() y findByZipCode() se usan para localizar ejemplaresspecficos del bean Customer. De nuevo, podremos definir tantos mtodos destos tipos como necesitemos.

    uelta a los Interfaces Remoto y Home

    os interfaces remoto y home son usados por las aplicaciones para acceder a loseans enterprise en tiempo de ejecucin. El interface home permite a la aplicacear o localizar un bean, mientras que el interface remoto permite a la aplicacivocar mtodos de negocio del bean.

    ustomerHome home =

    / Get a reference to the

    /CustomerHome object

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBHome.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/rmi/Remote.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/rmi/Remote.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBHome.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    15/72

    ustomer customer =

    home.create(new Integer(33));

    ame name = new Name("Richard",

    "Wayne", "Monson-Haefel");

    ustomer.setName(name);

    numeration enumOfCustomers =home.findByZip(55410);

    ustomer customer2 =

    home.findByPrimaryKey(

    new Integer(33));

    ame name2 = customer2.getName();

    / output is "Richard Wayne/Monson-Haefel"

    ystem.out.println(name);

    interfacejavax.ejb.EJBHome tambin define otros mtodos que

    ustomerBean hereda automticamente, incluyendo un conjunto de mtodosemove() que permite a la aplicacin destruir ejemplares del bean.

    eans Enterprise como Objetos Distribuidos

    os interfaces remoto y home son tipos de interface "Java RMI Remote" . Elterfacejava.rmi.Remote se usa con objetos distribuidos para representar el

    ean en un espacio de direccionamiento diferente (proceso o mquina). Un beannterprise es un objeto distribuido, esto significa que la clase bean esemplarizada y vive en un contenedor pero puede ser accedida por aplicacionesue viven en otros espacios de direccionamiento.

    ara hacer que un ejemplar de un objeto en un espacio de direccionamiento estsponible para otros requiere un pequeo truco que involucra sockets de red. Pacer que el truco funcione, envolvemos el ejemplar en un objeto especial llamasqueleto (skeleton) que tiene una conexin de red con otro objeto especialamado taln (stub). El stub implementa el interface remoto por eso se parecen objeto de negocio. Pero el stub no contiene la lgica del negocio; contiene unonexin socket con el skeleton. Cada vez que se invoca un mtodo de negocioobre el interface remoto del stub, ste enva un mensaje de red al skeletoncindole qu mtodo ha sido invocado. Cuando el skeleton recibe un mensaje

    ed desde el stub, identifica el mtodo invocado y los argumentos, y luego invocmtodo correspondiente del ejemplar actual. El ejemplar ejecuta el mtodo d

    egocio y devuelve el resultado al skeleton, que lo enva de vuelta al stub. Este

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBHome.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/rmi/Remote.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/rmi/Remote.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EJBHome.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    16/72

    agrama lo ilustra un poco:

    stub devuelve el resultado a la aplicacin que invoc este mtodo del interfacemoto. Desde la perspectiva de la aplicacin que usa el stub, es como si el stubabajara localmente. Realmente, el stub es slo un objeto de red mudo que enveticiones a travs de la red al skeleton, que en invoca al mtodo del ejemplareal. El ejemplar hace todo el trabajo, el stub y el skeleton slo pasan la identidel mtodo y los argumentos de vuelta a travs de la red.

    n EJB, el skeleton para los interfaces remoto y home estn implementados porontenedor, no por la clase bean. Esto es para asegurar que cada mtodo invoc

    obre estos tipos de referencia por una aplicacion cliente son manejados primeror el contenedor y luego delegados al ejemplar del bean. El contenedor debeterceptar aquellas peticiones que vayan al bean para poder aplicar la persisten

    beans de entidad), las transaciones, y controlar los accesos automticamente.

    os protocolos de objetos distribuidos definen el formado de mensajes de rednviados entre espacios de direccionamiento. Estos protocolos son bastantesomplicados, pero afortunadamente no tenemos que preocuparnos de ellos, ya on manejados automticamente. La mayora de los servidores EJB soportan "Jaemote Method Protocol" (JRMP) o el "Internet Inter-ORB Protocol" (IIOP) de

    ORBA. El programador de beans y aplicaciones slo ve la clase del bean y suterface remoto, los detales de la comunicacin de red estn ocultos.

    on respecto al API EJB, al programador no le importa si el servidor EJB usa JRMIIOP -- el API es el mismo. La especificacin EJB requiere que usemos una

    ersin especializada del API Java RMI, cuando trabajos con un bean de formaemota. Java RMI es un API para acceder a objetos distribuidos y de alguna forms un protocolo agnstico -- de la misma forma que JDBC es una base de datosgnstica. Por eso, un servidor EJB puede soportar JRMP o IIOP, pero el

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    17/72

    esarrollador de beans y aplicaciones siempre usa el mismo API Java RMI. Paraue el servidor EJB pueda tener la opcin de soportar IIOP, una versinspecializada de Java RMI, llamada Java RMI-IIOP. Java RMI-IIOP usa IIOP comrotocolo y el API Java RMI. Los servidores EJB no tienen que usar IIOP, peroenen que respetar las restricciones Java RMI-IIOP, por eso EJB 1.1 usa lasonvenciones Java RMI-IIOP y los tipos especializados, pero el protocolo ocultouede no ser ninguno de ellos.

    eans Enterprise del Tipo Entidadbean de entidad es uno de los dos tipos de beans primarios: entidad y sesin

    ean de entidad es usado para representar datos en un base de datos. Proporcin interface orientado a objeto a los datos que normalmente seran accedidosediante el JDBC u otro API. Ms que eso, los beans de entidad proporcionan uodelo de componentes que permite a los desarrolladores de beans enfocar su

    tencin en la lgica de negocio del bean, mientras el contenedor tiene cuidado anejar la persistencia, las transaciones, y el control de accesos.

    ay dos tipos de beans de entidad: Persistencia Manejada por el Contenedor (CPersistencia Manejada por el Bean (BMP). Con CMP, el contenedor maneja laersistencia del bean de entidad. Las herramientas de los vendedores se usan papear los campos de entidad a la base de datos y no se escribe ningn cdigo

    cceso a las bases de datos en la clase del bean. Con BMP, el bean de entidadontiene cdigo de acceso a la base de datos (normalmente JDBC) y esesponsable de leer y escribir en la base de datos su propio estado. Las entidadMP tienen mucha ayuda ya que el contenedor alertar al bean siempre que seaecesario hacer una actualizacin o leer su estado desde la base de datos. El

    ontenedor tambin puede manejar cualquier bloqueo o transacin, para que laase de datos se mantenga ntegra.

    ersistencia Manejada por Contenedor

    os beans con persistencia manejada por contenedor son los ms simples para esarrollador y los ms complicados para que los soporte el servidor EJB. Esto eorque toda la lgica de sincronizacin del estado del bean con la base de datosanejada automticamente por el contenedor. Esto significa que el desarrollado

    el bean no necesita escribir ninguna lgica de acceso a datos, mientras que se

    upone que el servidor EJB tiene cuidado de toda la persistencia que necesitautomticamente -- un gran pedido de cualquier vendedor. La mayora de losendedores EJB soportan la persistencia automtica a un base de datos relacionero el nivel de soporte vara. Algunos proporcionan un mapeo Objeto-a-Relaciouy sofisticado, mientras que otros estn muy limitados.

    n esta seccin, ampliaremos el CustomerBean desarrollado anteriormente pana completa definicin de un bean de persistencia manejada por contenedor. Esiguiente seccin de bean con persistencia manejada por el bean modificarem

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    18/72

    CustomerBean para que maneje su propia persistencia.

    a Clase Bean

    n bean enterprise es un componente completo que est compuesto de al menoos interfaces y una clase de implementacin del bean. Primero veamos la claseel bean:

    mport javax.ejb.EntityBean;

    ublic class CustomerBean

    implements EntityBean {

    int customerID;

    Address myAddress;

    Name myName;

    CreditCard myCreditCard;

    // CREATION METHODS

    public Integer ejbCreate(Integer id) {

    customerID = id.intValue();

    return null;

    }

    public void ejbPostCreate(Integer id) {

    }

    public Customer ejbCreate(Integer id, Name name) {myName = name;

    return ejbCreate(id);

    }

    public void ejbPostCreate(Integer id, Name name) {

    }

    // BUSINESS METHODS

    public Name getName() {

    return myName;

    }

    public void setName(Name name) {

    myName = name;

    }

    public Address getAddress() {return myAddress;

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    19/72

    }

    public void setAddress(Address address) {

    myAddress = address;

    }

    public CreditCard getCreditCard() {

    return myCreditCard;

    }

    public void setCreditCard(CreditCard card) {

    myCreditCard = card;

    }

    // CALLBACK METHODS

    public void setEntityContext(EntityContext cntx) {

    }

    public void unsetEntityContext() {

    }

    public void ejbLoad() {

    }

    public void ejbStore() {

    }

    public void ejbActivate() {}

    public void ejbPassivate() {}

    public void ejbRemove() {

    }

    ste es un buen ejemplo de un bean de entidad CMP bastante simple. Observa qo hay lgica de acceso a base de datos en el bean. Esto es porque el vendedorJB proporciona herramientas para mapear los campos del CustomerBean a laase de datos. La clase CustomerBean, por ejemplo, podra ser mapeada aualquier base de datos proporcionando los datos que contienen y que son muymilares a los campos del bean. En este caso lo campos de ejemplar del beanstn comprendidos por un int y unos sencillos objetos dependientes (Name,ddress, y CreditCard) con sus propios atributos. Abajo tenemos las definicione estos objetos dependientes:

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    20/72

    / The Name class

    ublic class Name

    implements Serializable {

    public String lastName,

    firstName, middleName;

    public Name(String lastName, String firstName,String middleName) {

    this.lastName = lastName;

    this.firstName = firstName;

    this.middleName = middleName;

    }

    public Name() {}

    / The Address class

    ublic class Address

    implements Serializable {

    public String street,

    city, state, zip;

    public Address(String street,

    String city,

    tring state,String zip) {

    this.street = street;

    this.city = city;

    this.state = state;

    this.zip = zip;

    }

    public Address() {}

    / The CreditCard class

    ublic class CreditCard

    implements Serializable {

    public String number,

    type, name;

    public Date expDate;

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    21/72

    public CreditCard(String

    number, String type,

    tring name,

    Date expDate) {

    this.number = number;

    this.type = type;

    this.name = name;

    this.expDate = expDate;

    }

    public CreditCard() {}

    stos campos se llaman campos manejados por contenedorporque el contenedos el responsable de sincronizar su estado con la base de datos; el contenedoraneja los campos. Estos campos pueden ser cualquier tipo de dato primitivo opo serializable. Este caso usa tanto un tipo primitivo int (customerID) y objeerializables (Address, Name, CreditCard). Para mapear los objetos dependiente

    base de datos necesitaramos usar una herramienta de mapeado muyofisticada. No todos los campos del bean son automticamente camposanejados por el contenedor; algunos de ellos son slo campos de ejemplar pauso temporal del bean. Un desarrollador de beans distingue un campo maneja

    or conetenedor de un campo de ejemplar normal indicando los campos manejaor el contenedor en el descriptor de desarrollo.

    os campos manejados por contenedor deben tener sus tipos correspondientesolumnas en RDBMS) en la base de datos bien directamente o a travs de mapbjeto-Relacional. El CustomerBean podra, por ejemplo, mapear una tabla

    USTOMERen la base de datos que tenga la siguiente definicin:

    REATE TABLE CUSTOMER

    id INTEGER PRIMARY KEY,

    last_name CHAR(30),

    first_name CHAR(20),

    middle_name CHAR(20),

    street CHAR(50),

    city CHAR(20),state CHAR(2),

    zip CHAR(9),

    credit_number CHAR(20),

    credit_date DATE,

    credit_name CHAR(20),

    credit_type CHAR(10)

    on la persistencia controlada por contenedor, el vendedor debe tener alguna cl

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    22/72

    e herramienta propietaria que pueda mapear los datos manejados por elontenedor del bean a sus correspondientes columnas en la tabla especfica,USTOMERen este caso.

    na vez que los campos del bean se han mapeado a la base de datos, y se haesarrollado el bean CustomerBean, el contenedor manejar la creaccin deegistros, el borrado, la carga y la actualizacin de registros en la tablaUSTOMERen respuesta a los mtodos invocados en los interfaces home y

    emoto del bean Customer.n subconjunto (uno o ms) de los campos manejados por el contenedor serentificado como la clave primaria del bean. Esta clave primaria es el ndice ountero a un nico registro(s) en la base de datos que crea el estado del bean. caso de CustomerBean, el campo id es el campo clave primario y ser usad

    ara localizar los datos de los beans en la base de datos. Los campos clave de uampo sencillo primitivo se representa como su correspondiente objeto envoltura clave primaria del bean CustomerBean por ejemplo es un int primitivo en lase bean pero los clientes del bean la manifestarn como del tipo

    ava.lang.Integer. Las claves primarias que se componen de varios campos,amadas claves primarias compuestas, sern representadas por un clase especiefinida por el desarrollador del Bean.

    terface Home

    ara crear un nuevo ejemplar de un bean de entidad CMP, y por lo tanto insertas datos en la base de datos, se debe llamar al mtodo create() del interfaceome del bean. Abajo tenemos la definicin del interface CustomerHome:

    ublic interface CustomerHome

    extends javax.ejb.EJBHome {

    public Customer create(

    Integer customerNumber)

    throws RemoteException,CreateException;

    public Customer create(Integer customerNumber,

    Name name)

    throws RemoteException,CreateException;

    public Customer findByPrimaryKey(Integer

    customerNumber)

    throws RemoteException, FinderException;

    public Enumeration findByZipCode(int zipCode)

    throws RemoteException, FinderException;

    http://java.sun.com/products/jdk/1.2/docs/api/java/lang/Integer.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/lang/Integer.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    23/72

    bajo tenemos un ejemplo de cmo se usara el interface home en una aplicaciiente para crear un nuevo cliente:

    ustomerHome home =

    / Get a reference to the

    /CustomerHome object

    ame name =

    new Name("John", "W", "Smith");

    ustomer customer =

    home.create(

    new Integer(33), name);

    n interface home de un bean podra declarar cero o ms mtodos create(), cano de los cuales debe tener sus correspondientes mtodos ejbCreate() yjbPostCreate() en la clase del bean. Estos mtodos de creaccin son enlazadn tiempo de ejecucin, para que cuando se llame a un mtodo create() del

    terface home, el contenedor delegue la invocacin a los correspondientestodos ejbCreate() y ejbPostCreate() de la clase Bean.

    uando se invoca al mtodo create() de un interface home, el contenedor delesta llamada al correspondiente mtodo ejbCreate() en el bean. Estos mtodosan para inicializar el estado del ejemplar antes de que el registro sea insertadn la base de datos. En este caso, inicializa los campos customerID y Name.uando el mtodo ejbCreate() ha finalizado (devuelven null en CMP) elontenedor lee los campos manejados por el contenedor e inserta un nuevoegistro en la tabla CUSTOMERindexado por la clave primaria, en este caso

    ustomerID que se mapea a la columna CUSOTMER.ID.

    n EJB un bean de entidad no existe tcnicamente hasta despus de que sus daayan sido insertados en la base de datos, lo que ocurre durante el mtodojbCreate(). Una vez que los datos han sido insertados, el bean de entidad exipuede acceder a su propia clave primaria y a referencias remotas, lo que no eosible hasta que se complete el mtodo ejbCreate() y que los datos estn en ase de datos. Si el bean necesita acceder a su propia clave primaria o a unaeferencia remota despus de haber sido creado, pero antes de servir a cualquietodo de negocio, puede hacerlo en el mtodo ejbPostCreate(). Este mtodo

    ermite al bean realizar cualquier proceso post-creaccin antes de empezar aervir peticiones de clientes. Por cada ejbCreate() debe haber un mtodojbPostCreate() correspondiente (con los mismos argumentos).

    os mtodos del interface home que empiezan con "find" son llamados mtodossqueda. Se usan para consultar al servidor EJB sobre beans de entidadspecficos, basndose en el nombre del mtodo y los argumentos pasados.esafortunadamente, no hay un lenguaje de consultas estndard definido para todos de bsqueda, por eso cada vendedor implementar estos mtodos de

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    24/72

    rma diferente. En los beans de entidad CMP, los mtodos de bsqueda no estmplementados con los mtodos correspondientes en la clase del bean; losontenedores los implementan cuando el bean se desarrolla de una formaspecfica del vendedor. El desarrollador usar las herramientas especficas delendedor para decirle al contenedor cmo se debera comportar un mtodo desqueda particular. Algunos vendedores usaran herramientas de mapeobjeto-Relacional para definir el comportamiento de un mtodo de bsquedaientras que otros slo requeriran que el desarrollador introduzca el comando S

    propiado.

    ay dos clases bsicas de mtodos de bsqueda: mtodos de bsquedani-entidad y multi-entidad. Los mtodos de bsqueda uni-entidad devuelven ueferencia remota a un bean de entidad especfico que corresponda con lasqueda solicitada. Si no se encuentra un bean de entidad, el mtodo lanza unxcepcin ObjectNotFoundException. Todo bean de entidad debe definir el

    todo de bsqueda uni-entidad con el nombre del mtodo findByPrimaryKeyue toma el tipo de la clave primaria del bean como argumento.

    os mtodos de bsqueda multi-entidad devuelven una coleccin (tiponumeration o Collection) de entidades que corresponden con la bsqueda

    olicitada. Si no se encuentran entidades, estos mtodos devuelven una colecciaca. (Observa que una coleccin vaca no es lo mismo que una referencia nula

    terface Remoto

    ada bean de entidad debe definir una interface remoto en adicin del interfaceome. El interface remoto define los mtodos de negocio del bean de entidad.bajo tenemos la definicin del interface remoto del bean CustomerBean:

    mport javax.ejb.EJBObject;

    mport java.rmi.RemoteException;

    ublic interface Customer

    extends EJBObject {

    public Name getName()

    throws RemoteException;

    public void setName(Name name)

    throws RemoteException;

    public Address getAddress()

    throws RemoteException;

    public void setAddress(Address address)

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/ObjectNotFoundException.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Enumeration.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Collection.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Collection.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Enumeration.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/ObjectNotFoundException.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    25/72

    throws RemoteException;

    public CreditCard getCreditCard()

    throws RemoteException;

    public void setCreditCard(CreditCard card)

    throws RemoteException;

    bajo tenemos un ejemplo de cmo una aplicacin cliente podra usar el interfacemoto para interactuar con un bean:

    ustomer customer =

    / ... obtain a remote

    /reference to the bean

    / get the customer's address

    ddress addr = customer.getAddress();

    / change the zip code

    ddr.zip = "56777";

    / update the customer's address

    ustomer.setAddress(addr);

    os mtodos de negocio en el interface remoto se delegan a los correspondientetodos de negocio en el ejemplar del bean. En el bean Customer, los mtodo

    e negocios son todos simples accesores y modificadores, pero podran ser ms

    omplicados. En otras palabras, los mtodos de negicio de una entidad no estnmitados a leer y escribir datos, tambin pueden realizar tareas de clculo.

    , por ejemplo, los clientes tuvieran un programa de fidelidad que premiara el ecuente, podra haber un mtodo para mejorar los premios en el programa,asado en una acumulacin de estancias superiores a una noche:

    mport javax.ejb.EJBObject;

    mport java.rmi.RemoteException;

    ublic interface Customer extends EJBObject {

    public MembershipLevel addNights(int nights_stayed)

    throws RemoteException;

    public MembershipLevel upgradeMembership()

    throws RemoteException;

    public MembershipLevel getMembershipLevel()

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    26/72

    throws RemoteException;

    ... Simple accessor business methods go here

    os mtodos addNights() y upgradeMembership() son ms sofisticados queencillos mtodos accesores. Aplican reglas de negocio para cambiar el nivel deremio y van ms all de leer y escribir datos.

    todos de RetroLlamada

    a clase bean define mtodos create que corresponden con mtodos del interfaome y mtodos de negocio que corresponden con mtodos del interface remota clase bean tambin implementa un conjunto de mtodos callbackque permitcontenedor notificar al bean los eventos de su ciclo de vida. Los mtodos de

    etrollamada estn definidos en el interfacejavax.ejb.EntityBean que esmplementado por todos los beans de entidad, incluyendo la clase CustomerBe

    interface EntityBean tiene la siguiente definicin. Observa que la clase del b

    mplementa estos mtodos:

    ublic interface javax.ejb.EntityBean {

    public void setEntityContext();

    public void unsetEntityContext();

    public void ejbLoad();

    public void ejbStore();

    public void ejbActivate();

    public void ejbPassivate();

    public void ejbRemove();

    mtodo setEntityContext() proporciona al bean un interface con el contene

    amado el EntityContext. Este interface contiene mtodos para obtenerformacin sobre el contexto bajo el que opera el bean en un momento particuinterface EntityContext se usa para acceder a informacin de seguridad sob

    u llamador; para determinar el estado de la transacin actual o para forzar aeshacer una transacin; o para obtener una referencia al propio bean, suterface home o su clave primaria. Este interface slo se configura una vez en da de un ejemplar de bean de entidad, por eso su referencia debera ponerse no de los campos de ejemplar del bean si la vamos a necesitar ms tarde.

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EntityBean.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/EntityBean.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    27/72

    bean Customer de arriba no usa EntityContext, pero podra hacerlo. Poremplo, podra usarlo para validad al llamador en un rol de seguridad particulabajo tenemos un ejemplo, donde se usa el EntityContext para validad que elamador es un Manager, el nico rol (indentidad de seguridad) que puedeeleccionar el tipo de la tarjeta de crdito de un cliente para que sea una tarjeta

    mundial, no una tarjeta limitada. (A los clientes con esta tarjeta se le ofrecenervicios especiales).

    mport javax.ejb.EntityBean;

    ublic class CustomerBean

    implements EntityBean {

    int customerID;

    Address myAddress;

    Name myName;

    CreditCard myCreditCard;

    EntityContext ejbContext;

    // CALLBACK METHODS

    public void setEntityContext(

    EntityContext cntx) {

    ejbContext = cntx

    }

    public void unsetEntityContext() {

    ejbContext = null;

    }

    // BUSINESS METHODS

    public void

    setCreditCard(CreditCard card) {

    if (card.type.equals("WorldWide"))

    if (ejbContext.isCallerInRole(

    "Manager"))

    myCreditCard = card;

    elsethrow new SecurityException();

    else

    myCreditCard = card;

    }

    public CreditCard getCreditCard() {

    return myCreditCard;

    }

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    28/72

    ...

    mtodo unsetEntityContext() se usa al final del ciclo de vida del bean -- ane que el ejemplar sea sacado de la memoria -- para desrefenciar elntityContext y realizar cualquier pequea tarea de limpieza.

    os mtodos ejbLoad() y ejbStore() en entidades CMP se invocan cuando elstado del bean de entidad est siendo sincronizado con la base de datos. El

    jbLoad() se invoca justo despus de que el contenedor haya refrescado losampos del bean manejados por contenedor con su estado desde la base de dat

    mtodo ejbStore() se invoca justo antes de que el contenedor escriba losampos del bean manejados por contenedor en la base de datos. Estos mtodossan para modificar datos que estn siendo sincronizados. Los mtodos podransarse, por ejemplo, para comprimir los datos antes de almacenarlos yescomprimirlos cuando son recuperados de la base de datos.

    n el bean Customer los mtodos ejbLoad() y ejbStore() podran usarse paronveritir objetos dependientes (Name, Address, CreditCard) a sencillos obje

    tring y tipos primitivos, si el contenedor EJB no es lo suficientemente sofisticaara mapear los objetos dependientes a la tabla CUSTOMER. Abajo tenemos unemplo de como se podra modificar el Bean:

    mport javax.ejb.EntityBean;

    ublic class CustomerBean

    implements EntityBean {

    //container-managed fieldsint customerID;

    String lastName;

    String firstName;

    String middleName;

    ...

    // not-container-managed fields

    Name myName;

    Address myAddress;

    CreditCard myCreditCard;

    // BUSINESS METHODS

    public Name getName() {

    return myName;

    }

    public void setName(Name name) {

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    29/72

    myName = name;

    }

    ...

    public void ejbLoad() {

    if (myName == null)

    myName = new Name();

    myName.lastName = lastName;

    myName.firstName = firstName;

    myName.middleName = middleName;

    ...

    }

    public void ejbStore() {

    lastName = myName.lastName;firstName = myName.firstName;

    middleName = myName.middleName;

    ...

    }

    os mtodos ejbPassivate() y ejbActivate() se invocan sobre el bean justontes de que el bean sea "pasivizado" o justo despus de que se activado,espectivamente. "Pasivizado" en un bean de entidad significa que el ejemplarel bean ha sido des-asociado con su referencia remota para que el contenedorueda eliminarlo de la memoria o reutilizarlo. Es una medida de conservacin deecursos que emplea el contenedor para reducir el nmero de ejemplares enemoria. Un bean podra ser "pasivizado" si no ha sido utilizado durante un tiemcomo una operacin normal realizada por el contenedor para maximizar la

    eutilizacin del los recursos. Algunos contenedores eliminarn los beans de laemoria, mientras que otros reutilizarn ejemplares para otros interfaces remos activos. Los mtodos ejbPassivate() y ejbActivate() proporcionan al beana notificacin cuando est apunto de ser "pasivizado" (des-asociado con laeferencia remota) o activado (asociado con un referencia remota).

    ersistencia Controlada por el Bean

    n un bean enterprise con la persistencia manejada por el Bean (BMP) maneja lncronizacin de su estado con la base de datos directamente . El Bean usa el Ae bases de datos (normalmente JDBC) para leer y escribir sus campos en la bae datos, pero el contenedor le dice cuando hacer cada operacin de sincronizacmaneja las transaciones por el bean automticamente. La persistencia manejaor el bean le da al desarrollador de bean la flexibilidad de realizar operaciones

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    30/72

    ersistencia que son demasiado complicadas para el contenedor o para usar unaente de datos que no est soportada por el contenedor -- por ejemplo bases d

    atos legales y personalizadas.

    n esta seccin, modificaremos la clase CustomerBean para crear un bean conersistencia manejada por el Bean (BMP). Esta modificacin no impactar enbsoluto en los interfaces home o remoto. De hecho, no modificaremosrectamente el CustomerBean original. En su lugar, lo cambiaremos a

    ersistencia manejada por el bean extendiendo el bean y sobreescribiendo la claara crear una entidad BMP. En la mayora de los casos, no extenderemos el beara hacerlo BMP, slo implementaremos el bean como BMP directamente. Estastrategia (extender el bean CMP) se hace por dos razones: permite al bean serean CMP o BMP; y acorta significativamente la cantidad de cdigo a mostrar.bajo tenemos la definicin de la clase BMP:

    ublic class CustomerBean_BMP

    extends CustomerBean {

    public void ejbLoad() {

    // override implementation

    }

    public void ejbStore() {

    // override implementation

    }

    public void ejbCreate() {

    // override implementation

    }

    public void ejbRemove() {

    // override implementation}

    private Connection getConnection() {

    // new helper method

    }

    on beans BMP, los mtodos ejbLoad() y ejbStore() los usa el contenedor derma diferente a como lo haca con un bean CMP. En BMP, estos mtodos

    ontienen cdigo para leer los datos de la base de datos y para escribir los cam

    n la base de datos, respectivamente. Estos mtodos se llaman sobre el beanuando el servidor EJB decide que es un buen momento para leer o escribir losatos.

    bean CustomerBean_BMP maneja su propia persistencia. En otras palabrass mtodos ejbLoad() y ejbStore() deben incluir lgica de acceso a base deatos para que el bean pueda cargar y almacenar sus datos cuando el contenedJB se lo diga. El contenedor ejecutar automtiamente los mtodos ejbLoad()jbStore() cuando crea apropiado.

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    31/72

    mtodo ejbLoad() se invoca normalmente al principio de una transacin, jusntes de que el contenedor delege un mtodo de negocio del bean. El cdigoostrado abajo muestra cmo implementar el mtodo ejbLoad() usando JDBC

    mport java.sql.Connection;

    ublic class CustomerBean_BMP

    extends CustomerBean {

    public void ejbLoad() {

    Connection con;

    try {

    Integer primaryKey =

    (Integer)ejbContext.getPrimaryKey();

    con = this.getConnection();

    Statement sqlStmt =

    con.createStatement("SELECT *

    FROM Customer " +" WHERE customerID = " +

    primaryKey.intValue());

    ResultSet results = sqlStmt.executeQuery();

    if (results.next()) {

    // get the name information

    //from the customer table

    myName = new Name();

    myName.first = results.getString("

    FIRST_NAME");

    myName.last = results.getString("

    LAST_NAME");

    myName.middle = results.getString("

    MIDDLE_NAME");

    // get the address information from

    //the customer table

    myAddress = new Address();

    myAddress.street =

    results.getString("STREET");

    myAddress.city =results.getString("CITY");

    myAddress.state =

    results.getString("STATE");

    myAddress.zip = results.getInt("ZIP");

    // get the credit card information

    //from the customer table

    myCreditCard = new CreditCard();

    myCreditCard.number =

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    32/72

    results.getString("CREDIT_NUMBER");

    myCreditCard.expDate =

    results.getString("CREDIT_DATE");

    myCreditCard.type =

    results.getString("CREDIT_TYPE");

    myAddress.name =

    results.getInt("CREDIT_NAME");

    }

    }catch (SQLException sqle) {

    throw new EJBException(sqle);

    }

    finally {

    if (con!=null)

    con.close();

    }

    }

    mtodo ejbLoad(), usa la referencia ejbContext() hacia el EntityContextean para obtener la clave primaria del ejemplar. Esto asegura que usamos eldice correcto en la base de datos. Obviamente, el CustomerBean_BMPecesitar usar los mtodos heredados setEntityContext() ynsetEntityContext().

    mtodo ejbStore() es invocado sobre el bean, al final de la transacin, justontes de que el contenedor intente enviar todos los cambios a la base de datos:

    mport java.sql.Connection;

    ublic class CustomerBean_BMP

    extends CustomerBean {

    public void ejbLoad() {

    ... read data from database

    }

    public void ejbStore() {Connection con;

    try {

    Integer primaryKey =

    (Integer)ejbContext.getPrimaryKey();

    con = this.getConnection();

    PreparedStatement sqlPrep =

    con.prepareStatement(

    "UPDATE customer set " +

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    33/72

    "last_name = ?, first_name = ?,

    middle_name = ?, " +

    "street = ?, city = ?, state = ?,

    zip = ?, " +

    "card_number = ?, card_date = ?, " +

    "card_name = ?, card_name = ?, " +

    "WHERE id = ?"

    );

    sqlPrep.setString(1,myName.last);sqlPrep.setString(2,myName.first);

    sqlPrep.setString(3,myName.middle);

    sqlPrep.setString(4,myAddress.street);

    sqlPrep.setString(5,myAddress.city);

    sqlPrep.setString(6,myAddress.state);

    sqlPrep.setString(7,myAddress.zip);

    sqlPrep.setInt(8, myCreditCard.number);

    sqlPrep.setString(9, myCreditCard.expDate);

    sqlPrep.setString(10, myCreditCard.type);sqlPrep.setString(11, myCreditCard.name);

    sqlPrep.setInt(12,primaryKey.intValue());

    sqlPrep.executeUpdate();

    }

    catch (SQLException sqle) {

    throw new EJBException(sqle);

    }

    finally {

    if (con!=null)

    con.close();}

    }

    n ambos mtodos ejbLoad() y ejbStore() el bean sincroniza su propio estadon la base de datos usando JDBC. Si estudiamos el cdigo cuidadosamenteodramos haber observado que el bean otiene sus conexiones a la base de datoesde una invocacin misteriosa al mtodo this.getConnection(). Un mtododava no implementado. El mtodo getConnection() no es un mtodo

    stndard EJB, slo una ayuda privada implementada para ocultar los mecanisme obtencin de conexiones a bases de datos. Abajo tenemos la definicn deltodo getConnection():

    mport java.sql.Connection;

    ublic class CustomerBean_BMP

    extends CustomerBean {

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    34/72

    public void ejbLoad() {

    ... read data from database

    }

    public void ejbStore() {

    ... write data to database

    }

    private Connection getConnection()throws SQLException {

    InitialContext jndiContext =

    new InitialContext();

    DataSource source = (DataSource)

    jndiContext.lookup("

    java:comp/env/jdbc/myDatabase");

    return source.getConnection();

    }

    as conexiones a bases de datos se obtienen desde el contenedor usando unontexto JNDI por defecto llamado "JNDI Environment Naming Context" (ENC). NC proporciona acceso a almacenes de conexiones JDBC transacionales a trave la factora de conexiones estndard, del tipojavax.sql.DataSource.

    n BMP, los mtodos ejbLoad() y ejbStore() los invoca el contenedor parancronizar el ejemplar del bean con los datos en la base de datos. Para insertariminar entidades en la base de datos, se implementan los mtodos ejbCreate

    ejbRemove() con una lgica de acceso a bases de datos muy similar. Lostodos ejbCreate() se implementan para insertar un nuevo registro en la bas

    e datos y los mtodos ejbRemove() para eliminar los datos de una entidad dease de datos. Estos mtodos de una entidad son invocados por el contenedor eespuesta a invocaciones a sus correspondientes mtodos en los interface homeemoto. Abajo podemos ver las implementaciones de estos mtodos:

    public void ejbCreate(Integer id) {

    this.customerID = id.intValue();

    Connection con;try {

    con = this.getConnection();

    Statement sqlStmt =

    con.createStatement("INSERT INTO

    customer id VALUES (" +

    customerID + ")");

    sqlStmt.executeUpdate();

    return id;

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/sql/DataSource.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/sql/DataSource.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    35/72

    }

    catch(SQLException sqle) {

    throw new EJBException(sqle);

    }

    finally {

    if (con!=null)

    con.close();

    }

    }

    public void ejbRemove() {

    Integer primaryKey =

    (Integer)ejbContext.getPrimaryKey();

    Connection con;

    try {

    con = this.getConnection();

    Statement sqlStmt =

    con.createStatement("DELETE FROMcustomer WHERE id = "

    primaryKey.intValue());

    sqlStmt.executeUpdate();

    }

    catch(SQLException sqle) {

    throw new EJBException(sqle);

    }

    finally {

    if (con!=null)

    con.close();}

    }

    n BMP, la clase bean es responsable de implementar los mtodos de bsquedaefinidos en el interface home. Por cada mtodo de bsqueda definido en elterface home debe haber el correspondiente mtodo ejbFind() en la clase bestos mtodos localizan los registros del bean apropiado en la base de datos yevuelve sus claves primarias al contenedor. El contenedor convierte la claverimara en referencias a beans y los devuelve al cliente. Abajo tenemos un

    emplo de implementacin del mtodo ejbFindByPrimaryKey() en la claseustomerBean_BMP, que corresponde al findByPrimaryKey() definido en elterface CustomerHome:

    ublic Integer ejbFindByPrimaryKey(

    Integer primaryKey)

    throws ObjectNotFoundException {

    Connection con;

    try {

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    36/72

    con = this.getConnection();

    Statement sqlStmt =

    con.createStatement("SELECT *

    FROM Customer " +

    " WHERE customerID = " +

    primaryKey.intValue());

    ResultSet results = sqlStmt.executeQuery();

    if (results.next())return primaryKey;

    else

    throw ObjectNotFoundException();

    }

    catch (SQLException sqle) {

    throw new EJBException(sqle);

    }

    finally {

    if (con!=null)con.close();

    }

    os mtodos de bsqueda de entidades simples como el de arriba devuelven unla clave primara y lanza una ObjectNotFoundException si no se localiza un

    egistro correspondiente. Los mtodos de bsqueda multi-entidad devuelven unoleccin (java.util.Enumeration ojava.util.Collection) de claves primarias.

    ontenedor convierte la coleccin de claves primarias en una coleccin de

    eferencias remotas, que son devueltas al cliente. Abajo tenemos un ejemplo demo el mtodo ejbFindByZipCode() multi-entidad, que corresponde al mtodndByZipCode() definido en el interface CustomerHome, sera implementadon la clase CustomerBean_BMP:

    ublic Enumeration ejbFindByZipCode(

    int zipCode) {

    Connection con;

    try {

    con = this.getConnection();Statement sqlStmt =

    con.createStatement("SELECT id

    FROM Customer " +

    " WHERE zip = " +zipCode);

    ResultSet results =

    sqlStmt.executeQuery();

    Vector keys = new Vector();

    http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/ObjectNotFoundException.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Enumeration.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Collection.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Collection.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Enumeration.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/ObjectNotFoundException.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    37/72

    while(results.next()){

    int id = results.getInt("id");

    keys.addElement(new Integer(id));

    }

    return keys.elements();

    }

    catch (SQLException sqle) {

    throw new EJBException(sqle);

    }finally {

    if (con!=null)

    con.close();

    }

    no se encuentran registros correspondientes, se devuelve una coleccin vacaontenedor, que devuelve una coleccin vaca al cliente.

    on la implementacin de todos estos mtodos y unos pocos cambios menores descriptor de desarrollo del bean, el CustomerBean_BMP esta listo para seresplegado como una entidad BMP.

    eans Enterprise del Tipo Sesin

    os beans de sesin son usados para manejar las interacciones de entidades ytros beans de sesin, accesos a recursos, y generalmente realizan tareas eneneficio del cliente. Los bean de sesin no son objetos del negocio persistentesomo lo son los beans de entidad. No representan datos en la base de datos. Lo

    eans de sesin corresponden al controlador en una arquitecturaodelo-vista-controlador porque estn encapsulando la lgica de negocio de un

    rquitectura de tres hilos.

    ay dos clases bsicas de beans de sesin: sin estado y con estado. Los beans esin sin estado configuran mtodos de negocio que se comportan comorocedimientos; operan slo sobre los argumentos que se les pasan. Los bean sstado son temporales; no mantienen el estado del negocio entre llamadas. Loseans de sesin con estado encapsulan la lgica del negocio y el estado especfie un cliente. Los beans con estado si que mantienen es estado de negocio entr

    amadas al mtodo, las mentienen en memoria y no es persistente.

    eans de Sesin sin Estado

    os bean de sesin sin estado, como todos los beans de sesin, no son objetos egocio persistentes. No representan datos en la base de datos. En su lugar,epresentan procesos de negocio o tareas que son realizadas en beneficio deliente que la usa. Los mtodos del negocio en un bean de sesin sin estado actomo los procedimientos tradicionales en un monitor de procesamiento de

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    38/72

    ansaciones legales. Cada llamada a un mtodo de negocio es independiente des llamadas anteriores. Los beans de sesin sin estado son muy sencillos deanejar por parte el contenedor EJB, por eso tienden a procesar las peticionesuy rpido y usan menos recursos. Pero esta ventaja de rendimiento tiene un

    recio; los beans de sesin sin estado no recuerdadn nada entre una llamada atodo y la siguiente.

    n ejemplo de bean de sesin sin estado es un bean CreditService, que

    epresenta un servicio de crdito que puede validar y procesar cargos en tarjetae crdito. Una cadena de Hoteles podra desarrollar un bean CreditService pancapsular el proceso de verificacin del nmero de una tarjeta de crdito, hacen cargo, y grabar el cargo en la base de datos para propsitos de contabilidad.bajo tenemos el interface home y remoto para el bean CreditService:

    / remote interface

    ublic interface CreditService

    extends javax.ejb.EJBObject {

    public void verify(CreditCard

    card, double amount)

    throws RemoteException,

    CreditServiceException;

    public void charge(CreditCard

    card, double amount)

    throws RemoteException,

    CreditServiceException;

    / home interfaceublic interface CreditServiceHome

    extends java.ejb.EJBHome {

    public CreditService create()

    throws RemoteException,

    CreateException;

    interface remoto, CreditService, define dos mtodos, verify() y charge() qe usan para verificar y realizar cargos en tarjetas de crdito. El Hotel podra us

    mtodo verify() para hacer una reserva, pero no cargar al cliente. El mtodoharge() se usara para cargar al cliente una habitacin. El interface home,reditServiceHome proporciona un mtodo create() sin argumentos. Todos lterfaces home de los beans de sesin sin estado definirn slo un mtodo, untodo create() sin argumento, porque los beans de sesin no tienen mtodos

    squeda y no puden ser inicializados con ningn argumento cuando son creadoos beans de sesin sin estado no tienen mtodos de bsqueda porque son todoquivalentes y no son persistentes. En otras palabras, no hay beans de sesin sstado nicos que puedan ser localizados en la base de datos. Como los beans d

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    39/72

    esin sin estado no son persistentes, son servicios temporales. Cada cliente qusa el mismo tipo de bean de sesin sin estado obtiene el mismo servicio.

    bajo tenemos la definicin de la clase del bean para CreditService. Este beanncapsula el acceso a los servicios de procesamiento de las Tarjetas de Crditocme. Especficamente, este bean accede a servidor web seguro de Acme y posna solicitud para validar o realizar un cargo en la tarjeta de crdito del cliente:

    mport javax.ejb.SessionBean;

    ublic class CreditServiceBean

    implements SessionBean {

    URL acmeURL;

    HttpURLConnection acmeCon;

    public void ejbCreate() {

    try {

    InitialContext jndiContext =

    new InitialContext();

    URL acmeURL = (URL)

    jndiContext.lookup("

    java:comp/ejb/env/url/acme");

    acmeCon =

    acmeURL.openConnection();

    }

    catch (Exception e) {

    throws new EJBException(e);

    }}

    public void verify(CreditCard card,

    double amount) {

    String response = post("verify:" +

    card.postString() +

    ":" + amount);

    if (response.substring("

    approved")== -1)

    throw new

    CreditServiceException("denied");

    }

    public void charge(CreditCard card,

    double amount)

    throws CreditCardException {

    String response = post("charge:" +

    card.postString() +

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    40/72

    ":" + amount);

    if (response.substring("approved")== -1)

    throw new CreditServiceException("

    denied");

    }

    private String post(String request) {

    try {

    acmeCon.connect();acmeCon.setRequestMethod("

    POST "+request);

    String response =

    acmeCon.getResponseMessage();

    }

    catch (IOException ioe) {

    throw new EJBException(ioe);

    }

    }

    public void ejbRemove() {

    acmeCon.disconnect();

    }

    public void setSessionContext(

    SessionContext cntx) {}

    public void ejbActivate() {}

    public void ejbPassivate() {}

    bean sin estado CreditService demuestra que un bean sin estado puedeepresentar una coleccin de servicios independientes pero relacionados. En estaso la validacin y los cargos de una tarjeta de crdido estn relacionados peroon necesariamente interdependientes. Los beans sin estado podran usarse parcceder a recursos poco usuales -- como es el caso de CreditService -- a basee datos o para realizar clculos complejos. El bean CreditService se usa para

    emostrar el servicio natural de los beans sin estado y para proporcionar unontexto para explicar el comportamiento de los mtodos de retrollamada. El use beans de sesin sin estado no est limitado al comportamiento ilustrado en eemplo; se pueden utilizar para realizar cualquier tipo de servicio.

    a clase CreditServiceBean usa una factora de recursos URL (acmeURL()) pbtener y mantener una referencia al servidor web de Acme que existe en otrordenador muy lejano. El CreditServiceBean usa el acmeURL() para obtenerna conexin al servidor web y postear solicitudes para la validacin o el cargo rjetas de crdito. El bean CreditService lo usan los clientes en lugar de una

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    41/72

    onexin directa para que el servicio pueda ser mejor manejado por el contenedJB, que almacenar conexiones y manejar las transaciones y la seguirdadutomtiamente por el cliente.

    mtodo ejbCreate() es invocado al principio de su vida y es invocado slo unez. Este mtodo es un mtodo conveniente para inicializar recursos de conexiariables que sern usadas por el bean sin estado durante su vida. En el ejemplnterior, el CreditServiceBean usa ejbCreate() para obtener una referencia a

    ctora HttpURLConnection, que ser usada para obtener conexiones al servieb de Acme.

    CreditServiceBean usa el JNDI ENC para obtener una factora de conexioneRL de la misma forma que el CustomerBean usaba el JNDI ENC para obtenena factora de recursos DataSource para conexiones JDCB. El JNDI ENC es unontexto JNDI por defecto por que cual todos los beans tienen acceso automtic

    JNDI ENC se usa para acceder a propiedades estticas, otros beans, y factorae recursos comojava.net.URL y JDBCjavax.sql.DataSource. Adems, el JNNC tambin proporciona acceso a factorias de recursos como JavaMail y Java

    essaging Service.

    os mtodos ejbCreate() y ejbRemove() son invocados slo una vez en susdas por el contenedor; cuando el bean se crea por primera vez y cuando esestruido. Las invocaciones de los mtodos create() y remove() en sus interfaome y remoto por el cliente no resultan en invocaciones de los mtodosjbCreate() y ejbRemove() en el ejemplar del bean. En su lugar, una invocacmtodo create() le proporciona al cliente una referencia la tipo de bean sin

    stado y los mtodos remove() invalidan la referencia. El contenedor decidiruando los ejemplares del bean son realmente creados y destruidos e invocar a

    s mtodos ejbCreate() y ejbRemove() en esos momentos. Esto permite a loemplares sin estado ser compartidos entre muchos clientes sin impactar en la

    eferencias de esos propios clientes.

    n el CreditServiceBean, los mtodos ejbCreate() y ejbRemove() son usadara obtener una conexin URL al principio de la vida del ejemplar del bean y paesconectarlo al final del ciclo de vida del ejemplar del bean. Durante el tiempontre que la conexin URL es obtenida y es desconectada es usada por los mtoe negocio. Esta aproximacin se usa para reducir el nmero de veces que seecesita obtener y desconectar una conexin, conservando los recursos. Podra

    arecer costoso mantener la conexin URL entre llamadas a mtodos, pero loseans de sesin sin estado estn diseados para ser compartidos entre muchosientes, por lo que estn en uso constantemente. Tan pronto como una ejemplan estado completa una llamada de mtodo para un cliente, automticamenteuede servir a otro cliente. Idealmente, hay poco tiempo sin utilizacin, por lo qene sentido mantener la conexin URL.

    os mtodos verify() y charge() delegan sus peticiones al mtodo post(), untodo privado de ayuda. El mtodo post() usa un HttpURLConnection para

    http://java.sun.com/products/jdk/1.2/docs/api/java/net/URL.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/sql/DataSource.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/sql/DataSource.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/net/URL.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    42/72

    nviar informacin sobre la tarjeta de crdito al servidor web de Acme y devuelvrespuesta al mtodo verify() o charge(). El HttpURLConnection podra ha

    do desconectado automticamente por el contenedor -- esto podra ocurrir si, emplo, ha pasado mucho tiempo desde su ltimo uso -- por eso el mtodoost() siempre invoca al mtodo connect(), que no hace nada si la conexin yst establecida. Los mtodos verify() y charge() analizan el valor de retornouscando la sub-cadena "approved" que indica que la tarjeta de crdito no eraenegada. Si no se encuentra "approved", se asume que la tarjeta de crdito fu

    enegada y se lanza una excepcin de negocio.

    mtodo setSessionContext() porporciona al ejemplar del bean una referencSessionContext que sirve para el mismo propsito que EntityContext lo eraara CustomerBean en la seccin Beans de Entidad. El SessionContext no sesa en este ejemplo.

    os mtodos ejbActivate() y ejbPassivate() no estn implementados en el bereditService porque la "pasivacin" no se utiliza en los beans de sesin sinstado. Estos mtodos estn definidos en el interfacejavax.ejb.SessionBean

    ara los beans de sesin con estado, y por eso se debe proporcionar unamplementacin vaca para los beans de sesin sin estado. Los beans de sesin stado nunca proporcionarn nada distinto que una implementacin vaca parastos mtodos.

    os beans de sesin sin estado tambin pueden usarse para acceder a la base datos as como para coordinar la interacion de otros beans para realizar una tarbajo tenemos la definicin del HotelClerkBean mostrado anteriormente en estorial:

    mport javax.ejb.SessionBean;

    mport javax.naming.InitialContext;

    ublic interface HotelClerkBean

    implements SessionBean {

    InitialContext jndiContext;

    public void ejbCreate() {}

    public void reserveRoom(Customer

    cust, RoomInfo ri,

    Date from, Date to) {

    CreditCard card =

    cust.getCreditCard();

    RoomHome roomHome = (RoomHome)

    getHome("java:comp/env/ejb/RoomEJB",

    http://-/?-http://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/SessionBean.htmlhttp://java.sun.com/j2ee/j2sdkee/techdocs/api/javax/ejb/SessionBean.htmlhttp://-/?-
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    43/72

    RoomHome.class);

    Room room =

    roomHome.findByPrimaryKey(

    ri.getID());

    double amount =

    room.getPrice(from,to);

    CreditServiceHome creditHome =

    (CreditServiceHome) getHome("java:comp/env/ejb/CreditServiceEJB",

    CreditServiceHome.class);

    CreditService creditAgent =

    creditHome.create();

    creditAgent.verify(card, amount);

    ReservationHome resHome =

    (ReservationHome) getHome(

    "java:comp/env/ejb/ReservationEJB",ReservationHome.class);

    Reservation reservation = resHome.create(cust.getName(),

    room,from,to);

    }

    public RoomInfo[] availableRooms(Location loc,

    Date from, Date to) {

    // do a SQL call to find available rooms

    Connection con = db.getConnection();

    Statement stmt = con.createStatement();ResultSet results =

    stmt.executeQuery("SELECT ...");

    ...

    return roomInfoArray;

    }

    private Object

    getHome(String path, Class type) {

    Object ref =jndiContext.lookup(path);

    return

    PortableRemoteObject.narrow(ref,type);

    }

    HotelClerkBean es un bean sin estado. Toda la informacin necesaria pararecesar una reserva o para consultar una lista de habitaciones disponibles sebtiene desde los argumentos al mtodo. En el mtodo reserveRoom(), las

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    44/72

    peraciones sobre otros beans (Room, CreditService, y Reservation) estnoordinadas para ralizar una larga tarea, reservar una habitacin para un clienteste es un ejemplo de un bean de sesin que maneja la interaccin con otroseans en beneficio del cliente. El mtodo availableRooms() se usa para consubase de datos y obtener una lista de habitaciones -- la informacin devuelta a

    iente es una coleccin de envolturas de datos definida por la clase RoomInfoso de esta clase, mostrado abajo, es un patrn de diseo que proporciona aliente una envoltura de peso ligero con slo la informacin necesaria.

    ublic class RoomInfo {

    public int id;

    public int bedCount;

    public boolean smoking;

    ara obtener una referencia a otro bean, como se hace tres veces en el mtodoeserveRoom(), se usa el mtodo de ayuda privado getHome(). Este mtodosa el JNDI ENC para obtener referencias a otros beans:

    rivate Object getHome(String path,

    Class type) {

    Object ref =

    jndiContext.lookup(path);

    return

    PortableRemoteObject.narrow(

    ref,type);

    n la especificacin EJB 1.1, RMI sobre IIOP es el modelo de programacinspecficado, por eso los tipos de referencia CORBA deben ser soportados. Laseferencias CORBA no pueden ser forzadas usando Java nativo. En su lugar se dsar el mtodo PortableRemoteObject.narrow() para apuntar explcitamentena referencia desde un tipo a su subtipo. Como JNDI siempre devuelve un tipobject, todas las referencias deben apuntar explcitamente para soportar laortabilidad entre contenedores.

    eans de Sesin con Estado

    os beans de sesin con estado estn dedicados a un cliente y mantienen unstado-conversacinal entre llamadas de mtodos. Al contrario que los beans esin sin estado, los clientes no comparten los beans de sesin con estado.uando un cliente crea un bean con estado, el ejemplar del bean est dedicado ervir nicamente a ese cliente. Esto hace posible mantener estado-conversacioue es un estado de negocio que puede ser compartido por mtodos del mismoean con estado.

    omo ejemplo, el bean HotelClerk puede ser modificado para que sea un bean

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    45/72

    on estado que pueda mantener estado-conversacional entre llamadas a mtodsto sera til, por ejemplo, si queremos que el bean HotelClerk pueda realizaruchas reservas, pero pueda procesarlas todas juntas bajo una tarjeta de crdisto ocurre frecuentemente, cuando las familias necesitan reservar dos o msabitaciones o cuando las corporaciones reservan un bloque de habitaciones pargn evento. Abajo tenemos el HotelClerkBean modificado para ser un bean cstado:

    mport javax.ejb.SessionBean;

    mport javax.naming.InitialContext;

    ublic class HotelClerkBean

    implements SessionBean {

    InitialContext jndiContext;

    //conversational-state

    Customer cust;Vector resVector = new Vector();

    public void ejbCreate(Customer

    customer) {}

    cust = customer;

    }

    public void addReservation(Name

    name, RoomInfo ri,

    Date

    from, Date to) {

    ReservationInfo resInfo =

    new ReservationInfo(name,

    ri,from,to);

    resVector.addElement(resInfo);

    }

    public void reserveRooms() {

    CreditCard card =cust.getCreditCard();

    Enumeration resEnum =

    resVector.elements();

    while

    (resEnum.hasMoreElements()) {

    ReservationInfo resInfo =

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    46/72

    (ReservationInfo)

    resEnum.nextElement();

    RoomHome roomHome = (RoomHome)

    getHome("java:comp/env/ejb/RoomEJB",

    RoomHome.class);

    Room room =

    roomHome.findByPrimaryKey(

    resInfo.roomInfo.getID());double amount = room.getPrice(

    resInfo.from,restInfo.to);

    CreditServiceHome creditHome =

    (CreditServiceHome)

    getHome("java:comp/env/ejb/CreditServiceEJB",

    CreditServiceHome.class);

    CreditService creditAgent = creditHome.create();

    creditAgent.verify(card, amount);

    ReservationHome resHome = (ReservationHome)

    getHome("java:comp/env/ejb/ReservationEJB",

    ReservationHome.class);

    Reservation reservation =

    resHome.create(resInfo.getName(),

    resInfo.roomInfo,resInfo.from,resInfo.to);

    }

    public RoomInfo[] availableRooms(Location loc,Date from, Date to) {

    // Make an SQL call to find available rooms

    }

    private Object getHome(String path, Class type) {

    Object ref = jndiContext.lookup(path);

    return PortableRemoteObject.narrow(ref,type);

    }

    n esta versin con estado de la clase HotelClerkBean, el estado conversacions la referencia Customer que es obtenerida cuando se crea el bean y el Vectoe objetos ReservationInfo. Manteniendo el estado-conversacional en el beaniente est absuelto de responsabilidades de seguir la pista del estado de laesin. El bean mantiene la pista de las reservas y de procesarlas en un procesoatch cuando se llama el mtodo serverRooms().

    ara conservar recursos, los beans de sesin con estado podran ser "pasivizado

    http://java.sun.com/products/jdk/1.2/docs/api/java/util/Vector.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/util/Vector.html
  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    47/72

    uando no estn en uso por el cliente. La "pasivizacin" en beans de sesin constado es diferente de los beans de entidad. En los beans con estado, lapasivizacin" significa que el estado-conversacional del bean es escrito en unmacenamiento secundario (en disco, normalmente) y el ejemplar es eliminadomemoria. La referencia del cliente al bean no se ve afectada por la

    pasivizacin", permanece viva y utilizable mientras el bean es "pasivizado".uando el cliente invoca a un mtodo de un bean que est "pasivizado", elontenedor activar el bean ejemplarizando un nuevo ejemplar y rellenandolo c

    estado-convsersacional escrito en el almacenamiento secundario.

    os beans de sesin con estado, usan los mtodos ejbActivate() yjbPassivate(). El contenedor invocar estos mtodos para notificar al beanuando est a punto de ser "pasivizado" (ejbPassivate()) e inmediatamenteespues de la activacin (ejbActivate()). Los desarrolladores de bean deberansar estos mtodos para cerrar recursos abiertos y para hacer otras operacionee limpieza antes de que el estado del ejemplar sea escrito en el almacenamienecundario y eliminarlo de la memoria.

    mtodo ejbRemove() es invocado sobre el ejemplar con estado cuando eliente invoca al mtodo remove() del interface home o remoto. El bean debersar el mtodo ejbRemove() para hacer el mismo tipo de limpieza realizada entodo ejbPassivate().

    oluciones a la Tecnologa de Despliegue de JavaBeans Enterpris

    omo se mencion anteriormente, el contenedor maneja la persistencia, lasansaciones, la concurrencia y el control de acceso automticamente para loseans enterprise. La especificacin EJB describe un mecanismo declarativo pardicar cmo se manejaran esas cosas, a travs del uso de un descriptor deesarrollo XML. Cuando un bean es desplegado dentro de un contenedor, elontenedor lee el descriptor de desarrollo para encontrar cmo sern manejadas transaciones, la persistencia (beans de entidad), y el control de acceso. Laersona que despliega el bean usa est informacin y especificar informacindicional para proporcionarle al bean estas facilidades en tiempo de ejecucin.

    n descriptor de desarrollo tiene un formato predefinido que deben usar todos leans compatibles EJB y que todos los servidores EJB deben saber como leer. Ermato se especifica como un "Document Type Definition", o DTD de XML. Elescriptor de desarrollo describe el tipo de bean (sesin o entidad) y las clasessadas para el interface remoto, home y la clase del bean. Tambin especifica lotributos transacionales de cada mtodo del bean, qu roles de seguridad puedecceder a cada mtodo (control de acceso), y si la persistencia de un bean dentidad es manejada automticamente o sea manejada por el bean. Abajonemos un ejemplo de descriptor de desarrollo usado para describir el beanustomer:

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    48/72

    ?xml version="1.0"?>

    !DOCTYPE ejb-jar PUBLIC "-

    /Sun Microsystems, Inc.

    /DTD Enterprise

    avaBeans 1.1//EN"

    "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd">

    ejb-jar>

    This bean represents a customer

    CustomerBean

    CustomerHome

    Customer

    CustomerBeanContainer

    Integer

    False

    myAddress

    myName

    myCreditCard

    This role represents everyone who is allowed full access

    to the Customer bean.

    everyone

    everyone

    CustomerBean

    *

  • 7/30/2019 04 Curso JavaBeans - Sp.pdf

    49/72

    All methods require a transaction

    CustomerBean

    *

    Required

    /ejb-jar>

    os servidores de aplicaciones EJB normalmente proporcionan herramientas queueden ser usadas para construir descriptores de desarrollo; esto simplifica mucproceso.

    uando un bean va ser desplegado, sus ficheros class de los interfaces home yemoto y de la clase del bean y del descriptor de desarrollo deben empaquetars

    ntos en un fichero JAR. El descriptor de desarrollo debe almacenarse en el fichAR con un nombre especial META-INF/ejb-jar.xml. Este fichero JAR, llamadojb-jar, puede ser deplegado en cualquier contenedor EJB que soporte laspecificacin EJB. Cuando un bean es desplegado en cualquier contenedor EJB escriptor de desarrollo XML es ledo desde el fichero JAR para determinar cmoanejar el bean en tiempo de ejecucin. La persona que despliega el beanapear los atributos del descriptor de desarrollo al entorno del contenedor. Escluir el mapeo de la seguirdad de accesos al sistema de seguridad del entornadir el bean al sistema de nombrado del contenedor EJB, etc. Una vez que elesarrollador del bean han finalizado su despligue el bean estar disponible para

    ue lo utilicen las aplicaciones cliente y otros beans.

    lientes de JavaBeans Enterprise

    os clientes de JavaBeans Enterprise podran ser aplicaciones solitarias, servletspplets, o incluso otros beans enterprise. Por ejemplo, el bean de sesinotelClerk mostrado arriba era cliente del bean de entidad Room. Todos losientes usan el interface home del bean para obtener referencias al servidor deean. Esta referencia tiene el tipo de dato del interface remoto el bean, por lonto el cliente intercta con el bean del servidor slamente a travs de lostodos definidos en el interface remoto.

    interface remoto define los mtodos