programacion avanzada en java.pdf

Upload: tonito-cristobal-mendez

Post on 11-Oct-2015

105 views

Category:

Documents


4 download

TRANSCRIPT

  • Escribir Aplicaciones Avanzadas para la PlataformaJavaTMComo desarrollador experimentado sobre la plataforma Java TM, indudablementesabes lo rpido que evoluciona esta plataforma. Sus muchos Interfaces deProgramacin de Aplicaciones (APIs) proporcionan una gran cantidad defuncionalidades para todos los aspectos de la programacin de aplicaciones y nivelde sistema. Los desarrolladores del mundo real nunca usan uno o dos APIs pararesolver un problema, sino que juntan la funcionalidad clave de la expansin devarios APIs. Conocer los APIs que necesitas, qu parte de esos APIs necesitas, ycomo los APIs funcionan juntos para crear la mejor solucin puede ser una tareaintimidatoria.

    Para ayudarte a navegar por los APIs de Java y acortar el tiempo de desarrollo detus proyectos, esta seccin incluye las fases de diseo, desarrollo, prueba ydespliegue para una aplicacin de subastas. Durante esta aplicacin de ejemplo, nocubriremos cada posible escenario de programacin, explora muchas situacionescomunes y la discusin te dejar con una metodologa slida para disear yconstruir tus propias soluciones.

    Esta seccin es para desarrolladores con un nivel un poco alto de entendimiento dela escritura de programas Java. El ejemplo est escrito con los APIs de laplataforma Java 2 y explica en trminos de funcionalidad el cmo y el por qu,por eso, si necesitas ayuda para instalar la plataforma Java, configurar tu entorno,o conseguir que tu primera aplicacin funcione, primero deberas leer las seccionesanteriores de este tutor...

    ndice de ContenidosConcordar los Requerimientos del Proyecto con la Tecnologa

    Requerimientos del Proyectom

    Elegir el Softwarem

    l

    La Aplicacin Casa de Subastas

    Una Aplicacin Multi-Fila con JavaBeansm

    Beans de Entidad y Sesinm

    Examinar un Bean de Manejo de Contenedorm

    Mtodos de Bsqueda de Manejo de Contenedorm

    l

    Manejo de Datos y Transaciones

    Persistencia del Beanm

    Manejar Transacionesm

    l

  • Mtodos de Bsqueda de Manejo del Beanm

    Clculo Distribuido

    Servicios de Bsquedam

    RMIm

    CORBAm

    Tecnologa JDBCm

    Serveltsm

    l

    Tecnologa JNI

    Ejemplos JNIm

    Strings y Arraysm

    Otros Problemas de Programacinm

    l

    Proyecto Swing: Construir un Interface de Usuario

    Componentes y Modelos de Datosm

    El API de Impresinm

    Impresin Avanzadam

    l

    Depuracin de Applets, Aplicaciones y Servlets

    Recoleccin de Evidenciasm

    Ejecutar Tests y Analizarm

    Depurar Servletsm

    Depurar Eventos AWTm

    Analizar la Pilam

    Problemas de Versionesm

    l

    Tcnicas de Rendimiento

    Aumentar el Rendimiento por Diseom

    Trucos de Conexinm

    Caractersticas de Rendimiento y Herramientasm

    Anlisis de Rendimientom

    Enlazar Aplicaciones Cliente/Servidorm

    l

    Desarrollar la Aplicacin Subasta

    Archivos JARm

    Plataforma Solarism

    Plataforma Win32m

    l

    Ms Tpicos de Seguridadl

  • Appelts Firmadosm

    Escribir un Controlador de Seguridadm

    Apndice A: Seguridad y Permisosl

    Apndice B: Clases, Mtodos y Permisosl

    Apndice C: Mtodos de SecurityManagerl

    Eplogol

    Ozito

  • Concordar los Requerimientos del Proyecto con laTecnologaEl desafo de escribir un libro sobre el desarrollo de una aplicacin avanzada para laplataforma JavaTM es encontrar un proyecto lo suficientemente pequeo, pero almismo tiempo, los suficientemente completo para garantizar las tecnicas deprogramacin avanzadas.

    El proyecto presentado en este libro es una casa de subastas basada en web. Laaplicacin est inicialmente escrita para la plataforma Enterprise JavaBeansTM. Enlos captulos posteriores expandieremos el corazn del ejemplo descrito aquaadiendo funcionalidades avanzadas, mejoras y soluciones alternativas a algunasde las cosas que obtendrs gratis cuando use la plataforma Enterprise JavaBeans.

    Para mantener la explicacin sencilla, la aplicacin de ejemplo slo tiene unconjunto bsico de transaciones para poner y pujar tems a subasta. Sin embargo,la aplicacin escala para manejar mltiples usuarios, proporciona un entorno detres filas basado en transaciones, controla la seguirad, e integra sistemas basadosen la legalidad. Este captulo cubre cmo determinar los requerimientos delproyecto y el modelo de aplicacin -- pasos importantes que siempre deberanrealizarse antes de empezar a codificar.

    Requerimientos de Proyecto y Modeladol

    Elegir el Softwarel

    Tienes Prisa?Esta tabla te enlaza directamente con los tpicos especficos.

    Tpico SeccinDemostracin de Subasta La Subasta de DukeRequerimientos del Proyecto Entrevista Base

    Modelar el ProyectoModelado La Casa Identifica Compradores y Vendedores

    La Casa Determina la Mayor PujaLa Casa Notifica a Compradores y VendedoresAlguien Busca un temAlguien Ve un tem en VentaAlguien Ve los Detalles de un temEl Vendedor Pone un tem en VentaEl Compador Puja por temsDiagrama de Actividad

  • Elegir el Software Los APIs de JavaTM

    Ozito

  • Requerimientos del Proyecto y ModeladoEl primer paso para determinar los requerimientos del proyecto es la entrevista con el usuario base para saber que se espera de una subasta on-line. Este es un paso importante, yno puede pasarse por alto porque es una base slida de informacin que nos ayudar a definir las capacidades clave de nuestra aplicacion.

    El captulo 2 pasea a travs del cdigo de la aplicacin, explica como trabaja la plataforma Enterprise JavaBeans, y nos cuenta cmo ejecutar una demostracin en vivo. Si nuncahas visto o usado una subasta on-line, aqu hay una maqueta de las pginas HTML de la aplicacin de ejemplo.

    Entrevista al usuario Basel

    Modelo de Proyectol

    Entrevista al usuario BasePor la dicusin y por mantener las cosas sencillas, esta explicacin asume que en las entrevistas con los usuarios base se encontraron los siguientes requerimientos para la casa desubastas:

    Requerimientos de la Casa de SubastasInformacin Necesaria del Comprador y Vendedorl Notas de Vendedores para postear temsl Grabar e Informar de las transaciones diariasl

    Requerimientos del usuarioPujar por o Vender un teml Buscar o ver tems en vental Notificar las ventas al vendedor y al compradorl

    Modelo de ProyectoDespus de analizar los requerimientos, podemos construir un diagrama de flujo de la aplicacin para obtener un mejor entendimiento de los elementos necesarios en la aplicaciny cmo interactua.

    Un diagrama de flujo muestra la relacin entre los actores y procesos dentro del sistema. Un proceso es una funcin nica en un sistema, y un actor es la persona o software querealiza la accin o proceso. Por ejemplo, un comprador es el actor que realiza la funcin (proceso) de pujar por un tem de la subasta, y el vendedor es el actor que realiza elproceso de postear un tem para su subasta.

    Aunque, no todos los actores son personas. Por ejemplo, el software es el actor que determina cuando un tem se ha cerrado, encuentra la puja ms alta, y notifica la venta alcomprador y al vendedor.

    El Unified Modeling Language (UML) es la herramienta que se usa para los diagramas de procesos. El siguiente diagrama usa UML para describir los procesos del comprador y delvendedor para una aplicacin de subasta on-line.

    En UML, los sistemas se agrupan en cuadrados, los actores se representas por figuras humanas, los procesos se denotan mediante valos, y las lneas muestran como los actoresusan el sistema.

  • La siguiente descripcin define el proyecto. Estas descripciones no son parte del UML, pero son una herramienta til para la definicin de proyectos.

    La Casa Identifica a Compradores y Vendedores

    Una aplicacin de subastas es usada por compradores y vendedores. Un comprador necesita saber quen es el vendedor a quien tiene que pagarle, y el vendedor necesita conocer alos compradores para responder a sus preguntas sobre el producto y para finalizar la venta. Por eso, para postear o pujar por un tem de la subasta, los compradores y vendedoresnecesitan estar registrados. El registro necesita obtener la siguiente informacin sobre los compradores y vendedores:

    User ID y password para comprar y vender.l Direccin de E-mail para que pueda comunicarsele la puja ms alta cuando se cierre la subasta.l Informacin de la tarjeta de crdito para que la casa de subastas pueda cobrar al vendedor por listar sus tems.l

    Una vez registrado, el usuario puede postear o pujar por un tem en venta.

    La Casa Determina la Puja ms altaLa aplicacin de subastas hace consultas a la base de datos y graba e informa de las transaciones diarias. La aplicacin busca tems que se han cerrado y determina la puja msalta.

    La Casa Notitica a los Compradores y Vendedores

    La aplicacin subasta usa el e-mail para notificar al que ha pujado ms alto y al vendedor, y cobrarle al vendedor por los servicios.

    Alguien Busca un temLos compradores y vendedores introducen un string de bsqueda para localizar todos los tems en subasta de la base de datos.

    Alguien Ve los tems en VentaPara popularizar la subasta y conseguir nuevos vendedores y compradores, la aplicacin pemite que cualquiera vea los tems de la subasta sin requerir que est registrado. Parahacer esto sencillo, la subasta permite que cualquiera vea una lista de los tems de alguna de estas tres formas:

    Todos los tems en subasta.l Nuevos tems listados hoy.l tems que se cierran hoy.l

    Alguien Ve los Detalles de un temLa lista sumarizada enlaza con la siguiente informacin detallada de cada tem. Esta informacin est disponible para cualquiera sin necesidad de identificacin.

    Sumario del tem.l Nmero del tem en la subasta.l Precio Actuall Nmero de pujasl Fecha de puesta en subastal Fecha de cierre del teml ID del vendedorl Puja ms altal Descripcin del teml

    El Vendedor Postea tems para su VentaPara postear un tem para su venta, un vendedor necesita identificarse a s mismo y describir el tem, de esta forma:

    User ID y password para la identificacin del vendedorl Descripcin sumaria de teml Precio de puja iniciall Descripcin detallada del teml Nmero de das que el tem estar en la subastal

    El Comprador Puja por ItemsUna pgina de sumario detallado por cada tem permite a los usuarios registrados identificarse a s mismos y pujar por el tem proporcionando la siguiente informacin:

  • User IDl Passwordl Cantidad de la Pujal

    Diagrama de Actividad

    El diagrama de actividad muestra el flujo de tareas dentro de la casa de subastas como una totalidad. Este diagrama muestra la aplicacin subasta. El crculo negro de la izquierdamuestra el principio de las actividades, y el crculo blanco punteado en el centro denota donde terminan las actividades.

  • Ozito

  • Elegir el SoftwareCon la aplicacin modelada y los requerimientos del proyecto definidos, es hora depensar en los APIs de JavaTM que vamos a usar. La aplicacin est claramentebasada en cliente y servidor porque queremos acomodar desde 1 hasta ncompradores, vendedores y mirones al mismo tiempo. Como el registro de losdatos de los tems en subasta deben almacenarse y recuperarse de algunamanejar, necesitares el API para acceder a bases de datos.

    Los APIs de JavaTM

    El corazn de la aplicacin se puede crear de muchas formas usando uno de lossiguientes aPIs:

    APIs de Sockets, multithreads y JDBCTM.1. APIs de Remote Method Invocation (RMI) y JDBC.2. Plataforma Enterprise JavaBeansTM.3.

    Enterprise JavaBeans proporciona una forma sencilla de crear aplicaciones declientes multi hilos porque maneja transaciones y control de estado, multithreads,recursos y otros complejos detalles de bajo nivel. La forma ms sencilla paracodificar la aplicacin de subastas es con la plataforma Enterprise JavaBeans.

    El captulo 2 explica el cdigo del corazn de la aplicacin y como configurar yejecutar el ejemplo.

    Ozito

  • Cdigo de la Aplicacin de la Casa de SubastasLa aplicacin de ejemplo es una casa de subastas basada en el Web y escrita para la plataforma Enterprise JavaBeansTM. El interface de usuario es un conjunto de pginas HTMLque obtienen la entrada del usuario y le muestran la informacin. Detrs de las pginas HTML hay un servelt que pasa datos entre el navegador y el servidor Enterprise JavaBeans.Este servidor maneja la lectura y escritura de la base de datos.

  • Este captulo describe el cdigo de la aplicacin, cmo funciona con el servidor Enterprise JavaBeans, y dnde obtener este servidor para ejcutar el ejemplo. O, si lo prefieres, aquhay una maqueta de la aplicacin subasta.

    Una Aplicacin Multi.Hilo con Enterprise Beansl

    Beans de Entidad y de Sesinl

    Examinar un Bean de Contenedor Controladorl

    Mtodos Buscadores del Contendor Controladorl

    Tienes Prisa?Esta tabla contiene enlaces directos a los tpicos especficos.

    Tpico SeccinUna Aplicacin Multi-Hilo con Enterprise Beans El Enterprise Beans Definido

    Beans de Entidad y de SesinLa Casa de Subastas FuncionaDesarrollar y Ejecutar AplicacionesCmo funcionan las aplicaciones Multi-Hilo?

    Beans de Entidad y de Sesin El servelt AuctionBeans EntityBeans SessionClases Contenedor

    Examinar un Bean de Contenedor Controlador Variables MiembroMtodo CreateMtodos de Contexto de EntidadMtodo LoadMtodo StoreGuardar la ConexinDescriptor de Desarrollo

    Mtodos del Buscador de Contenedo Controlador AuctionServlet.searchItemsBidderBean.getMatchingItemsListAuctionItemHome.findAllMatchingItemsAuctionItemBean Deployment Descriptor

    Ozito

  • Un Aplicacin Multi-Fila con Beans de EnterpriseLa proliferacin de aplicaciones basadas en internet - e intranet - ha creado una gran necesidad de aplicaciones transacionales distribuidas que aumente la velocidad, seguridad yrendimiento de la tecnologa del lado del servidor. Una forma de conseguir estas necesidades es usar un modelo multi-fila donde una pequea aplicacin cliente invoca lgica denegocio que se ejecuta en el servidor.

    Normalmente, las pequeas aplicaciones clientes multi-hilo son dificiles de escribir porque se involucran muchas lneas de cdigo intrincado para manejar la transacin, el control deestados, multithreads, solape de recursos y otros detalles complejos de bajo nivel. Y para rematar estas dificultades, tenemos que retrabajar este cdigo cada vez que escribamosuna aplicacin porque es tan de bajo nivel que no es reutilizable.

    Si pudieramos usar un cdigo de manejo de transaciones preconstruido por alguien o incluso si puedieramos reutilizar algo de nuestro propio cdigo, ahorrariamos mucho tiempo yenerga que podramos utilizar para resolver otros problemas. Bien, la tecnologa Enterprise JavaBeansTM puede darnos la ayuda necesaria. Esta tecnologa hace sencillas de escribirlas aplicaciones transacionales distribuidas porque separa los detalles de bajo nivel de la lgica del negocio. Nos concentramos en crear la mejor solucin para nuestro negocio ydejamos el resto a la arquitectura oculta.

    Este captulo describe cmo crear la aplicacin de subastas del ejemplo usando los servicios proporcionados por la plataforma Enterprise JavaBeans. En los siguientes captulosveremos como podemos personalizar estos servicios e integrar estas caractersticas en aplicaciones existentes no EJB.

    Enterprise Beans Definidosl

    Pequeos Programas Clientesl

    Arquitectur Multi-Hilol

    Beans de entidad y de sesinl

    La Casa de Subastas Funcional

    Desarrollar y Ejecutar Aplicacionesl

    Cmo funcionan las Aplicaciones multi-hilo?l

    Enterprise Beans DefinidosUn Bean Enterprise es una clase que proporciona dos tipos de mtodos: lgica de negocio y ciclo de vida. Un programa cliente llama a los mtodos de la lgica de negocio parainteractuar con los datos contenidos en el servidor. El contenedor llama a los mtodos de ciclo de vida para manejar el Bean en el servidor. Adems de estos dos tipos de mtodos,un Bean Enterprise tiene un fichero de configuracin asociado, llamado un descriptor de desarrollo, se usa para configurar el Bean en el momento del desarrollo.

    As como es el responsable de la creaccin y borrado de Beans, el servidor de JavaBeans de Enterprise tambin maneja las transaciones, la concurrencia, la seguridad y lapersistencia de datos. Incluso las conexiones entre el cliente y el servidor se proporcionan usando los APIs de RMI y JNDI y opcionalmente los servidores pueden proporcionarescalabilidad a travs del manejo de threads.

    El ejemplo de la casa de subastas implementa una completa solucin de JavaBeans de Enterprise que slo proporcionan la lgica de negocio y usa los servicios ocultosproporcionados por la arquitectura. Sin embargo, podramos encontrar que el servicio de contenedores controladores, aunque proporcionando una mxima portabilidad, no consiguetodos los requerimientos de nuestra aplicacin. En los prximos captulos veremos cmo proporcionar estos servicios a nuestro Bean y tambin como usar estos servicios enaplicaciones que no usen Beans de Enterprise.

    Pequeo Programas ClienteUn pequeo cliente es un programa cliente que invoca a la lgica de negocio que se ejecuta en el servidor. Se llama "pequeo" porque la mayora del proceso sucede en el servidor.En la siguiente figura, el servlet es el cliente. Invoca a los Beans Enterprise que se ejecutan sobre un servidor de JavaBeans Enterprise. Tambin ejecuta la lgica que crea laspginas web que aparecen en el navegador.

  • Arquitectura Multi-FilaLa

  • arquitectura multi-fila o arquitectura de tres filas desciende del modelo estndard de dos filas de cliente y servidor situando una aplicacin multi-fila entre el cliente y la base dedatos.

    Los programas clientes se comunican con la base de datos a travs de la aplicacin del servidor usando llamadas de alto nivel e independientes de la plataforma. La aplicacinservidor responde a las peticiones del cliente, hace las llamadas necesarias a la base de datos dentro de la base de datos oculta, y responde al programa cliente de la formaapropiada.

    El ejemplo de casa de subastas basado en web de tres filas consiste en el servlet cliente, el servidor Enterprise JavaBeans (la aplicacin servidor), y el servidor de la base de datoscomo se ve en la figura.

    Beans de Entidad y de SesinExisten dos tipos de Beans Enterprise: Beans de entidad y de sesin. Un Bean Enterprise que implementa una entidad de negocio es un Bean de Entidad, y un Bean Enterpriseque implementa una tarea de negocio es un Bean de Sesin.

    Tpicamente, un Bean de entidad representa una fila de datos persistentes almacenados en una tabla de la base de datos. En el ejemplo de la casa de subastas, RegistrationBeanes un Bean de entidad que representa los datos de un usuario registrado, y AuctionItemBean es un Bean de entidad que represena los datos de un tem de la subasta. Los Beansde entidad son transacionales y de larga vida. Mientras que los datos permanezcan, el Bean de entidad puede acceder y actualizarlos. Esto no significa que tengamos un Beanejecutndose por cada fila de la tabla. Si no que los Beans Enterprise se cargan y graban cuando es necesario.

    Un Bean de sesin podra ejecutar una lectura o escritura en la base de datos, pero no es necesario. Un Bean de sesin podra invocar llamadas al JDBC por s mismo o podra usarun Bean de entidad para hacer la llamada, en cuyo caso el Bean de sesin es un cliente del Bean de entidad. Un campo de Bean contiene el estado de la conversacin y sontemporales. Si el servidor o el cliente se bloquean, el Bean de sesin se v. Frecuentemente se usan los Beans de sesin con uno o ms Beans de entidad y para operacionescomplejas con datos.

    Beans de Sesin Beans de EntidadCampos que contienen el estado de la conversacin Representan datos de la base de datosManejan accesos a la base de datos por parte del cliente Comparten accesos entre mltiples usuariosLa vida del cliente es la vida del Bean Pesiste mientras existan los datosPueden perderse con la transacin TransacionalNo sobrevive a las cadas del servidor Sobrevive a las cadas del servidorNo maneja los datos de forma fina Manejo de datos de forma delicada

    La Casa de Subastas FuncionaEl diagrama muestra los Beans de Enterprise para la aplicacin de la casa de subastas y su relacin con el servidor de JavaBeans de Enterprise. El cliente invoca la lgica de negocioen cuatro Beans de Enterprise a travs de sus interfaces home y remoto. El servidor JavaBeans de este ejemplo maneja los detalles de bajo nivel incluyendo las operaciones delectura y escritura en la base de datos.

    Los cuatro Beans del ejemplo son:AuctionItemBean un Bean de entidad que mantiene informacin sobre el tem de la subasta.l RegistrationBean un Bean de entidad que almacena informacin de registro de los usuarios.l BidderBean un Bean de sesin que usa AuctionItemBean para recuperar una listra de los tems de la subastas, slo los nuevos tems, tems cerca del cierre, e tems cuyosumario corresponde con una cadena de busqueda en la base de datos. Tambin comprueba la identidad del usuario y la password cuando alguien hace una puja, y almacenalas nuevas pujas en la base de datos.

    l

    SellerBean es un Bean de sesin que usa RegistrationBean para comprobar la identidad del usuario y la password cuando alguien postea un tem para su subasta, yAuctionItemBean para aadir nuevos tems a la base de datos de la subasta.

    l

  • Como se ve en la figura superior, un Bean de entidad o de sesin realmente es una coleccin de clases e interfaces. Todos los Beans de entidad y de sesin consisten en un interfaeremoto, un interface home, y la clase del Bean. El servidor busca el interface home del Bean que est ejecutndose en el servidor JavaBeans de Enterprise, lo usa para crear elinterface remoto, e invoca a los mtodos del Bean a travs del interface remoto.

    Un Interface remoto de un Bean Enterprise decribe los mtodos del Bean, o qu hace el Bean. Un programa cliente u otro Bean Enterprise llama a los mtodos definidos en elinterface remoto para invocar la lgica de negocios implementada por el Bean.

    l

    Un interface home de un Bean de Enterprise describe cmo un programa cliente u otro Bean Enterprise crea, encuentra (slo los Beans de entidad), y elimina ese Bean deEnterpise de su contenedor.

    l

    El contenedor, mostrado en cyan en el grfico, proporciona el interface entre el Bean Interface y las funcionalidades de bajo nivel especficas de la plataforma que soporta elBean.

    l

    Desarrollar y Ejecutar AplicacionesLas herramientas de desarrollo y un servidor de JavaBeans Enterprise es esencial para ejecutar aplicaciones con JavaBeans Enterprise. Las herramientas de desarrollo generancontenedores, que son clases que proporcionan un interface de implementaciones de bajo nivel en un servidor JavaBeans Enterprise dado. El servidor proporcionado puede incluircontenedores y herramientas de desarrollo para sus servidores y normalmente publicar los interfaces de bajo nivel para que otros vendedores pueden desarrollar contenedores yherramientas de desarrollo para sus servidores.

    El ejemplo de casa de subastas usa el servidor JavaBeans y las herramientas de desarrollo creadas por BEA Weblogic. Visita su site para obtener una demo de 30 das.

    Como todo est sujeto a las especificaciones, todos los Beans Enterprise son intercambiables con contenedores, herramientas de desarrollo, y servidores creados por otrosvendedores. De hecho, podriamos escribir nuestro propio Bean Enterprise porque es posible, y algunas veces deseable, usar Beans Enterprise escritos por uno o ms proveedoresque ensamblaremos dentro de una aplicacin de JavaBeans Enterprise.

    Cmo Funcionan las Aplicaciones Multi-FilaEl objetivo de una aplicacin multi-fila es que el cliente pueda trabajar con los datos de una aplicacin sin conocer en el momento de la construccin dnde se encuentran los datos.Para hacer posible este nivel de transparencia, los servicios ocultos en una arquitectura multi-fila usan servicios de bsqueda para localizar los objetos del servidor remoto (elobjeto interface del Bean remoto), y los servicios de comunicacin de datos para mover los datos desde el cliente, a travs del objeto servidor remoto, hasta su destino final en elmedio de almacenaje.

    Servicio de Bsqueda

    Para encontrar los objetos del servidor remoto en el momento de la ejecucin, el programa cliente necesita una forma de buscarlos. Una de estas formas es usar el API JavaNaming y Directory InterfaceTM (JNDI). JNDI es un interface comn para interfaces existentes de nombres y directorios. Los contenedores de los JavaBeans de Enterprise usan JNDIcomo interface para el servicio de nombres del Remote Method Invocation (RMI).

    Durante el desarrollo, el servicio JNDI registra el interface remoto con un nombre. Siempre que el programa cliente use el mismo servicio de nombres y pregunte por el interfaceremoto con su nombre registrado, podr encontrarlo. El programa cliente llama al mtodo lookup sobre un objeto javax.naming.Context para preguntar por el interface remotocon su nombre registrado. El objeto javax.naming.Context es donde se almacenan las uniones y es un objeto diferente del contexto del JavaBean de Enterprise, que se cubrems adelante..

    Comunicacin de Datos

    Una vez que el programa cliente obtiene una referencia al objeto servidor remoto, hace llamadas a los mtodos de este objeto. Como el programa cliente tiene una referencia alobjeto servidor remoto, se usa una tcnica llamada "envolver datos" para hacer que parezca que el objeto servidor remoto es local para el programa cliente.

    La "ordenacin de datos" es donde las llamadas a mtodos del objeto servidor remoto se empaquetan con sus datos y se envan al objeto servidor remoto. El objeto servidorremoto desempaqueta (desordena) los mtodos y los datos, y llama al Bean Enterprise. El resultado de la llamda al Bean es empaquetado de nuevo y pasado de vuelta al cliente atravs del objeto servidor remoto, y son desempaquetados.

    Los contenedores de JavaBeans Enterprise usan servicios RMI para ordenar los datos. Cuando se compila un Bean, se crean unos ficheros stub (taln) y skeleton (esqueleto). Elfichero taln proporciona la configuracin del empaquetado y desempaquetado de datos en el cliente, y el esqueleto proporciona la misma informacin para el servidor.

    Los datos se pasan entre el programa cliente y el servidor usando serializacin. La serializacin es una forma de representar objetos JavaTM como bytes que pueden ser enviados atravs de la red como un stream y pueden ser reconstuidos en el mismo estado en el que fueron enviados originalmente.

    Ozito

  • Beans de Entidad y de SesinEl ejemplo usa dos Beans de entidad y dos de sesin. Los Beans de entidad, AuctionItemBean y RegistrationBean, representan tems persistentes que podran estaralmacenados en un base de datos, y los Beans de sesin, SellerBean y BidderBean, representan operaciones de vida corta con el cliente y los datos.

    Los Beans de sesin son el interface del cliente hacia los beans de entidad. El SellerBean procesa peticiones para aadir nuevos tems para la subasta. El BidderBean procesapeticiones para recuperar tems de la subasta y situar las pujas por esos tems. El cambio o adicin de datos a la base de datos en un Bean controlado por contenedor se le deja alos Beans de entidad:

    Auction Servletl

    Beans de Entidadl

    Beans de Sesinl

    Clases Contenedorl

    AuctionServletEl AuctionServlet es esencialmente la segunda fila en la aplicacin y el punto focal para las actividades de la subasta. Acepta entradas finales del usuario desde el navegadormediante 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 enel navegador.

    Aqu hay un diagrama del tipo Unified Modeling Language (UML) para la clase AuctionServlet.

  • Los mtodos de AuctionServlet mostrados arriba invocan a la lgica del negocio que se ejecuta en el servidor buscando un Bean Enterprise y llamando a uno o ms de susmtodos. Cuando el servelt aade cdigo HTML a una pgina para mostrarsela al usuario, la lgica se ejecuta en el cliente.

    Por ejemplo, el mtodo listAllItems(out) ejecuta cdigo en el cliente para generar dinmicamente una pgina HTML para que la vea el cliente en un navegador. La pgina HTMLse rellena con los resultados de una llamada a BidderBean que ejecuta la lgica 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(""+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 :"+e); } out.flush();}

  • Beans de EntidadAuctionItemBean y RegistrationBean son Beans de entidad. AuctionItemBean aade nuevos tems de subasta a la base de datos y actualiza la cantidad pujada por losusuarios cuando stos pujan por el tem. RegistrationBean aade informacin a la base de datos sobre usuarios registrados. Ambos Beans consisten en las clases descritas aqu.

    AuctionItem Entity Bean

    Aqu estn las clase de AuctionItemBean. Recuerda que estos Beans de Enterprise son objetos distribuidos que usan el API RMI (Invocacin Remota de Mtodos), por eso, cuandoocurre un error se lanza una excepcin RMI remota.

    AuctionItem.javal

    AuctionItemHome.javal

    AuctionItemBean.javal

    AuctionItemPk.javal

    AuctionItem es un interface remoto. Describe qu hace el Bean declarando los mtodos definidos por el usuario que proporcionan la lgica de negocio para este Bean. Estosmtodos son usados por el cliente para interactuar con el Bean sobre la conexin remota. Su nombre se mapea a la tabla AUCTIONITEMS que puedes ver abajo.

    AuctionItemHome es el interface home. Describe cmo se crea el Bean, como encontrarlo, y eliminarlo de su contenedor. Las herramientas de desarrollo del servidor de Beans deEnterprise proporcionarn la implementacin para este interface.

    AuctionItemBean es el Bean de Enterprise. Implementa EntityBean, proporciona la lgica de negocio para los mtodos definidos por el desarrollador, e implementa los mtodosde EntityBean para crear el Bean y seleccionar el contexto de sesin. Esta es una clase que necesita implementar el desarrollador del Bean. Sus campos variables mapean a loscampos 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 uncampo pblico 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 tablaAUCTIONITEMS que puedes ver ms abajo, por eso el campo id es un campo pblico de esta clase. Al campo id se le asigna un valor cuando se construye la clase de la claveprimaria.

    Podemos pedirle al contenedor que maneje la persistencia de la base de datos de un Bean Enterprise o escribir el cdigo para manejar la persistencia por nosotros mismos. En estecaptulo, todos los beans son manejados por el contenedor. Con esto nosotros slo decimos qu campos son manejados por el contenedor y le dejamos al servidor de JavaBeans deEnterprise que haga el resto. Esto es fenomenal para las aplicaciones sencillas, pero si tuvieramos que codificar algo ms complejo, necesitaramos ms control.

    Cmo escribir los servicios ocultos de los JavaBeans Enterprise para ganar ms control o proporcionar servicios similares para las aplicaciones que no usen JavaBeans de Enterprisese cubre en el captulo 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 lgica de negocio real, los campos de la tabla de la base dedatos, y la clave primaria son de alguna forma diferentes. En vez de describir las clases, podemos navegar por ellas y luego volver a la descripcin de las clases de AuctionItem sitenemos alguna pregunta.

    Registration.javal

    RegistrationHome.javal

    RegistrationBean.javal

    RegistrationPK.javal

  • 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 SesinBidderBean y SellerBean son los Beans de sesin. BidderBean recupera una lista de los tems de la subasta, busca tems, chuequea el ID y la password del usuario cuandoalguien 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, yaade nuevos tems para subasta a la base de datos.

    Ambos Beans de sesin estn 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 operacin es algo ms que una simple bsqueda y la operacin del clientedepende de algo que ha sucedido en una llamada anterior.

    Bean de sesin Bidder

    Aqu estn las clase de BidderBean. Recuerda que estos Beans de Enterprise son objetos distribuidos que usan el API RMI (Invocacin Remota de Mtodos), por eso, cuandoocurre un error se lanza una excepcin 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 deAuctionItemBean, y para procesar las pujas, crea un ejemplar de RegistrationBean.

    Bidder.javal

    BidderHome.javal

    BidderBean.javal

    Bidder es un interface remoto. Describe lo que hace el Bean declarando los mtodos definidos por el desarrollador que proporcionan la lgica de negocio para este Bean. Esto sonlos que que el cliente llama de forma remota.

    BidderHome es el interface home. Descibe cmo se crear el Bean, como se busca y como se elimina de su contenedor.

    BidderBean es el Bean de Enterprise. Implementa SessionBean, proporciona la lgica de negocio para los mtodos definidos por el desarrollador, e implementa los mtodos deSessionBean para crear el Bean y seleccionar el contexto de sesin.

    Bean de sesion Seller

    SellerBean consta de los mismos tipos de clase que un BidderBean, excepto que la lgica de negocio es diferente. En vez de describir las clases, puedes navegar por ellas y luegovolver a la explicacin de BidderBean si tienes alguna duda.

    Seller.javal

    SellerHome.javal

    SellerBean.javal

    Clases ContenedorLas 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. Adems, la implementacin de las clases se crea para los interfaces ylas 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 transparentetodas las llamadas a mtodos a travs 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 travs de la red desde elobjeto Stub para procesarlos en el servidor.

    Ozito

  • Examinar un Bean Controlado por ContenedorEsta seccin pasea a travs del cdigo de RegistrationBean.java para ver lo fcilque es hacer que el contenedor maneje la persistencia del almacenamiento dedatos en un medio oculto como una base de datos (por defecto).

    Variables Miembrol

    Mtodo Createl

    Mtodos de Contexto de Entidadl

    Mtodo Loadl

    Mtodo Storel

    Connection Poolingl

    Descriptor de Desarrollol

    Variables MiembroUn entorno de contenedor controlador necesita saber qu variables son paraalmacenamiento persistente y cuales no. En el lenguaje JavaTM, la palabra clavetransient indica variables que no son incluidas cuando los datos de un objeto seserializan y escriben en un almacenamiento permanente. En la claseRegistrationBean.java, la variable EntityContext est marcada como transientpara indicar que su dato no ser escrito en ningn medio de almacenamiento.

    El dato de EntityContext no se escribe en el almacenamiento permanente porquesu propsito es proporcionar informacin sobre el contexto en el momento deejecucin del contenedor. Por lo tanto, no contiene datos sobre el usuarioregistrado y no debera grabarse en un medio de almacenamiento. Las otrasvariables estn declaradas como public, por lo que el contenedor de este ejemplopuede descubrirlas usando el API Reflection.

    protected transient EntityContext ctx; public String theuser, password, creditcard, emailaddress; public double balance;

    Mtodo CreateEl mtodo ejbCreate del Bean es llamado por el contenedor despus de que elprograma cliente llame al mtodo create sobre el interface remoto y pase losdatos de registro. Este mtodo asigna los valores de entrada a las variablesmiembro que representan los datos del usuario. El contenedor maneja elalmacenamiento y carga de los datos, y crea nuevas entradas en el medio de

  • almacenamiento oculto.

    public RegistrationPK ejbCreate(String theuser, String password, String emailaddress, String creditcard) throws CreateException, RemoteException {

    this.theuser=theuser; this.password=password; this.emailaddress=emailaddress; this.creditcard=creditcard; this.balance=0;

    Mtodos de Contexto de EntidadUn Bean de entidad tiene un ejemplar de EntityContext asociado que ofrece alBean acceso a la informacin del contenedor controlador en el momento de laejecucin, como el contexto de la transacin.

    public void setEntityContext( javax.ejb.EntityContext ctx) throws RemoteException { this.ctx = ctx; }

    public void unsetEntityContext() throws RemoteException{ ctx = null; }

    Mtodo LoadEl mtodo ejbLoad del Bean es llamado por el contenedor para cargar los datosdesde el medio de almacenamiento oculto. Esto sera necesario cuandoBidderBean o SellerBean necesiten chequear la ID y password del usuario.

    Nota: No todos los objetos Beans estn vivos en un momento dato. Elservidor de JavaBeansTM de Enterprise podra tener un nmeroconfigurable de Beans que puede mantener en memoria.

    Este mtodo no est implementado porque el contenedor de los JavaBeans deEnterprise carga los datos por nosotros.

    public void ejbLoad() throws RemoteException {}

  • Mtodo StoreEl mtodo ejbStore del Bean es llamado por el contenedor para grabar los datosdel usuario. Este mtodo no est implementado porque el contenedor de losJavaBeans de Enterprise graba los datos por nosotros.

    public void ejbStore() throws RemoteException {}

    Connection PoolingLa carga y almacenamiento de datos en la base de datos puede tardar muchotiempo y reducir el rendimiento general de la aplicacin. Para reducir el tiempo deconexin, el servidor de Weblogic BEA usa una cola de conexiones JDBCTM parahacer un cache con las conexiones con la base de datos, por eso las conexionesestn siempre disponibles cuando la aplicacin las necesita.

    Sin embargo, no estamos limitados a la cola de conexiones JDBC. Podemossobreescribir el comportamiento de la cola de conexiones del Bean y sustituirlanosotros mismos.

    Descriptor de DesarrolloLa configuracin restante para un Brans persistente controlado por contenedorocurre en el momento del desarrollo. Lo que ves abajo es un Descriptor deDesarrollo basado en texto usado en un servidor de BEA Weblogic EnterpriseJavaBeans.

    Texto del Descriptor de Desarrollo

    (environmentProperties

    (persistentStoreProperties persistentStoreType jdbc

    (jdbc tableName registration dbIsShared false poolName ejbPool (attributeMap creditcard creditcard emailaddress emailaddress balance balance password password theuser theuser

  • ); end attributeMap ); end jdbc ); end persistentStoreProperties ); end environmentProperties

    El descriptor de desarrollo indica que el almacenamiento es una base de datos cuyaconexin est contenida en una cola de conexiones JDBCTM llamada ejbPool. ElattributeMap contiene la variable del Bean Enterprise a la izquierda y su campoasociado de la base de datos a la derecha.

    Descriptor de Desarrollo XML

    En Enterprise JavaBeans 1.1, el descriptor de desarrollo usa XML. Aqu est laconfiguracin equivalente en XML:

    Containercreditcard emailaddress balance password theuser

    registrationjavax.sql.DataSourceContainer

    Los campos del contenedor controlador se mapean directamente a su nombrecontraparte en la tabla de la base de datos. El recurso de autorizacin delcontenedor (res-auth) significa que el contenedor maneja el login a la tablaREGISTRATION.

    Ozito

  • Mtodos de Bsqueda del Contenedor ControladorLa facilidad de bsqueda de la casa de subastas est implementada como un mtodo finder del contenedor. Arranca cuando el usuario escribe una cadena de bsqueda y pulsa elbotn Submit en la pgina principal para localizar un tem de la subasta. Como se muestra en el diagrama, el navegador pasa la cadena de bsqueda al mtodoAuctionServlet.searchItem, que luego la pasa al mtodo BidderBean.getMatchingItemsList.

    En este punto, BidderBean.getMatchingItemsList pasa la cadena de bsqueda al mtodo findAllMatchingItems declarado en el interface AuctionItemHome. Este mtodo esun mtodo buscador, y la implementacin del contenedor vara la forma en que maneja las llamadas a los mtodos finder. Los contenedores BEA Weblogic buscan en el descriptorde desarrollo del Bean la informacin sobre los mtodos finder.

    En el caso de la busqueda, el descriptor de desarrollo mapea la cadena de bsqueda pasada a AuctionItemHome.findAllMatchingItems al campo summary en la tablaAuctionItems de la base de datos. Este le dice al servidor Enterprise JavaBeansTM que recupere datos de todos los campos que en el campo summary contengan el texto de lacadena de bsqueda.

  • Esta seccin pasea a travs de las diferentes partes del cdigo de bsqueda finder.AuctionServlet.searchItemsl

    BidderBean.getMatchingItemsListl

    AuctionItemHome.findAllMatchingItemsl

    Descriptor de Desarrollo de AuctionItemBeanl

    AuctionServlet.searchItemsEl mtodo searchItems recupera el texto de la cadena del navegador, crea una pgina HTML para mostar el resultado de la bsqueda, y le pasa la cadena de bsqueda al mtodoBidderBean.getMatchingItemsList. BidderBean es un Bean de sesin que recupera una lista de tems de la subasta y chequea la ID y la password del usuario para los usuariosque quieren pujar por algn articulo.

    Los resultados de la bsqueda se devuelven a este mtodo en una variable Enumeration.

    private void searchItems(ServletOutputStream out, HttpServletRequest request) throws IOException {

    //Retrieve search string String searchString=request.getParameter( "searchString");

    //Create HTML page String text = "Click Item number for description and to place bid."; setTitle(out, "Search Results"); try { addLine(""+text, out);

    //Look up home interface for BidderBean BidderHome bhome=(BidderHome) ctx.lookup( "bidder");

    //Create remote interface for BidderBean Bidder bid=bhome.create();

    //Pass search string to BidderBean method Enumeration enum=(Enumeration) bid.getMatchingItemsList(searchString);

    if(enum != null) { displayitems(enum, out); addLine("", out); } } catch (Exception e) { addLine("AuctionServlet Search Items error",

  • out); System.out.println("AuctionServlet : "+e); } out.flush();}

    BidderBean.getMatchingItemsListEl mtodo BidderBean.getMatchingItemsList llama al mtodo AuctionItemHome.findAllMatchingItems y le pasa la cadena de bsqueda. AuctionItemBean es un bean deentidad que maneja actualizaciones y recuperaciones de tems de la subasta.

    El resultado de la bsqueda es devuelto a este mtodo en una variableEnumeration.

    public Enumeration getMatchingItemsList( String searchString) throws RemoteException {

    Enumeration enum=null; try{//Create Home interface for AuctionItemBean AuctionItemHome home = (AuctionItemHome) ctx.lookup("auctionitems");

    //Pass search string to Home interface method enum=(Enumeration)home.findAllMatchingItems( searchString); }catch (Exception e) { System.out.println("getMatchingItemList: "+e); return null; } return enum;}

    AuctionItemHome.findAllMatchingItemsEl mtodo AuctionItemHome.findAllMatchingItems no est implementado por AuctionItemBean. Las implementaciones del mtodo AuctionItemBean finder estndefinidas en el descriptor de desarrollo de AuctionItemBean cuando se usan contenedores de BEA Weblogic.

    Cuando se usan estos contenedores, incluso si el Bean tiene implementaciones del mtodo finder, son ignorados y en su lugar se consultan las selecciones en el descriptor dedesarrollo.

    //Declare method in Home interface public Enumeration findAllMatchingItems( String searchString) throws FinderException, RemoteException;

    Descriptor de Desarrollo de AuctionItemBeanCuando se llama a un mtodo finder de un Bean, el contenedor consulta el descriptor de desarrollo para ese Bean para encontrar qu datos necesita recuperar el mtodo finder dela tabla de la base de datos. El contenedor pasa esta informacin al servidor Enterprise JavaBeans, que hace la recuperacin real.

    El descriptor de desarrollo para AuctionItemBean proporciona finderDescriptors para todos los mtodos finder declarados en el interface AuctionItemHome. ElfinderDescriptor para el mtodo findAllMatchingItems mapea la cadena de bsqueda al campo summary de la tabla AuctionItems de la base de datos. Esto le dice alservidor Enterprise JavaBeans que recupere los datos de todas las filas de la tabla en las que el contenido del campo summary corresponda con el texto de la cadena de bsqueda.

    (finderDescriptors "findAllItems()" "(= 1 1)" "findAllNewItems(java.sql.Date newtoday)" "(= startdate $newtoday)" "findAllClosedItems(java.sql.Date closedtoday)" "(= enddate $closedtoday)" "findAllMatchingItems(String searchString)"

  • "(like summary $searchString)"); end finderDescriptors

    Ozito

  • Manejo de Datos y TransacionesCuando usamos la arquitectura Enterprise JavaBeansTM, los datos se leen yescriben en la base de datos sin tener que escribir ningn cdigo SQL. Pero qupasa si no quereos almacenar los datos en una base de datos, o si queremosescribir nuestros propios comandos SQL, o manejar transaciones?Podemos sobreescribir el contenedor controlador interno de persistencia eimplementar un Bean controlador de persistencia usando nuestro propioalmacenamiento de datos y nuestro cdigo de manejo de transaciones.

    La persistencia del Bean controlador se convierte en til cuando queremos mscontrol del que proporciona el contenedor controlador. Por ejemplo podramossobreescribir la mayora de los contenedores para que mapeen un Bean en una filade la tabla, implementar nuestros propios mtodos finder, o personalizar el cach.

    Este captulo presenta dos versiones de la clase RegistrationBean del captuloanterior. Una versin lee y escribe los datos del usuario en un fichero usandostreams de entrada y salida serializados. La otra versin proporciona nuestrospropios comandos SQL para leer y escribir en la base de datos. Tambin explicacmo podemos escribir nuestro propio cdigo de manejo de transaciones.

    Bean-Controlador de Persistencia y la plataforma JDBCTMl

    Manejar Transacionesl

    Mtodos de Bsqueda del Bean Controladorl

    Tienes Prisa?Esta tabla te lleva directamente a los tpicos especficos

    Tpico SeccinBean-Controlador de Persistencia y laPlataformna JDBC

    Conectar con la base de datosl

    Mtodo Createl

    Mtodo Loadl

    Mtodo Refreshl

    Mtodo Storel

    Mtodo Findl

    Manejo de Transaciones Por qu Manejar Transaciones?l

    Sincronizacin de Sesinl

    Transaction Commit Model

    Mtodos de Bsqueda del Bean-Controlador AuctionServlet.searchItemsl

    SearchBeanl

  • Ozito

  • Bean-Controlador de Persistencia y la PlataformaJDBCPuede que haya algunas veces que querramos sobreescribir la persistencia delcontenedor controlador e implementar mtodos de Beans de entidad o de sesinpara usar nuestros propios comandos SQL. Este tipo de persistencia controlada porel Bean puede ser til si necesitamos aumentar el redimiento o mapear datos demltiples Beans en una sla fila de la tabla de la base de datos.

    Esta seccin nos muestra cmo convertir la clase RegistrationBean.java paraacceder a la base de datos con la clase PreparedStatement del JDBC.

    Conectar con la Base de Datosl

    Mtodo Createl

    Mtodo Loadl

    Mtodo Refreshl

    Mtodo Storel

    Mtodo Findl

    Conectar con la Base de DatosEsta versin de la clase RegistrationBean.java establece la conexin con la base dedatos ejemplarizando una clase esttica Driver y proporcionando el mtodogetConnection.

    El mtodo getConnection necesita la clase esttica DriverManager para unmotor de la base datos registrada que corresponda con la URL. En este caso, laURL es weblogic.jdbc.jts.Driver.

    //Create static instance of database driverstatic { new weblogic.jdbc.jts.Driver();}

    //Get registered driver from static instancepublic Connection getConnection() throws SQLException{ return DriverManager.getConnection( "jdbc:weblogic:jts:ejbPool"); }

  • Mtodo CreateEl mtodo ejbCreate asigna valores a las variables miembro, obtiene una conexincon la base de datos, y crea un ejemplar de la clase java.sql.PreparedStatementpara ejecutar la sentencia SQL que escribe los datos en la tabla registration de labase de datos.

    Un objeto PreparedStatement se crea desde una sentenica SQL que se enva a labase de datos y se precompila antes de enviar cualquier dato. Podemos llamar alas sentencias setXXX apropiadas sobre el objeto PreparedStatement paraenviar datos. Manteniendo los objetos PreparedStatement y Connection comovariables de ejemplar privadas reducimos la sobrecarga porque las sentencias SQLno tienen que compilarse cada vez que se envan.

    Lo ltimo que hace el mtodo ejbCreate es crear una clase de clave primaria conel ID del usuario, y devolverlo al contenedor.

    public RegistrationPK ejbCreate(String theuser, String password, String emailaddress, String creditcard) throws CreateException, RemoteException {

    this.theuser=theuser; this.password=password; this.emailaddress=emailaddress; this.creditcard=creditcard; this.balance=0;

    try { con=getConnection(); ps=con.prepareStatement("insert into registration ( theuser, password, emailaddress, creditcard, balance) values ( ?, ?, ?, ?, ?)"); ps.setString(1, theuser); ps.setString(2, password); ps.setString(3, emailaddress); ps.setString(4, creditcard); ps.setDouble(5, balance); if (ps.executeUpdate() != 1) { throw new CreateException ( "JDBC did not create a row"); } RegistrationPK primaryKey = new RegistrationPK();

  • primaryKey.theuser = theuser; return primaryKey; } catch (CreateException ce) { throw ce; } catch (SQLException sqe) { throw new CreateException (sqe.getMessage()); } finally { try { ps.close(); } catch (Exception ignore) {} try { con.close(); } catch (Exception ignore) {} }}

    Mtodo LoadEste mtodo obtiene la clave primaria desde el contexto de entidad y lo pasa almtodo refresh que carga los datos.

    public void ejbLoad() throws RemoteException { try { refresh((RegistrationPK) ctx.getPrimaryKey()); } catch (FinderException fe) { throw new RemoteException (fe.getMessage()); } }

    Mtodo RefreshEl mtodo refresh es el cdigo suministrado por el programador para cargar losdatos desde la base de datos. Chequea la clave primaria, obtiene la conexin con labase de datos, y crea un objeto PreparedStatement para consultar en la base dedatos la clave primaria especificada.

    Los datos se leen desde la base de datos en un ResultSet y se asignan a lasvariables miembro globales para que RegistrationBean tenga la informacin msactualizada del usuario.

    private void refresh(RegistrationPK pk) throws FinderException, RemoteException {

    if (pk == null) {

  • throw new RemoteException ("primary key cannot be null"); } Connection con = null; PreparedStatement ps = null; try { con=getConnection(); ps=con.prepareStatement("select password, emailaddress, creditcard, balance from registration where theuser = ?"); ps.setString(1, pk.theuser); ps.executeQuery(); ResultSet rs = ps.getResultSet(); if (rs.next()) { theuser = pk.theuser; password = rs.getString(1); emailaddress = rs.getString(2); creditcard = rs.getString(3); balance = rs.getDouble(4); } else { throw new FinderException ( "Refresh: Registration (" + pk.theuser + ") not found"); } } catch (SQLException sqe) { throw new RemoteException (sqe.getMessage()); } finally { try { ps.close(); } catch (Exception ignore) {} try { con.close(); } catch (Exception ignore) {} }}

  • Mtodo StoreEste mtodo obtiene una conexin con la base de datos y crea unPreparedStatement para actualizarla.

    public void ejbStore() throws RemoteException { Connection con = null; PreparedStatement ps = null; try { con = getConnection(); ps = con.prepareStatement("update registration set password = ?, emailaddress = ?, creditcard = ?, balance = ? where theuser = ?"); ps.setString(1, password); ps.setString(2, emailaddress); ps.setString(3, creditcard); ps.setDouble(4, balance); ps.setString(5, theuser); int i = ps.executeUpdate(); if (i == 0) { throw new RemoteException ( "ejbStore: Registration ( " + theuser + ") not updated"); } } catch (RemoteException re) { throw re; } catch (SQLException sqe) { throw new RemoteException (sqe.getMessage()); } finally { try { ps.close(); } catch (Exception ignore) {} try { con.close(); } catch (Exception ignore) {} }}

  • Mtodo FindEl mtodo ejbFindByPrimaryKey corresponde con la firma del mtodoFindByPrimaryKey del interface RegistrationHome. Este llama al mtodo refreshpara obtner o refrescar los datos de usuario para el usuario especficado en la claveprimaria.

    La versin de persistencia del contenedor controlador de RegistrationBean noimplementa este mtodo porque el contenedor maneja la obtencin y refresco delos datos de usuario.

    public RegistrationPK ejbFindByPrimaryKey( RegistrationPK pk) throws FinderException, RemoteException {

    if ((pk == null) || (pk.theuser == null)) { throw new FinderException ("primary key cannot be null"); } refresh(pk); return pk;}

    Ozito

  • Control de TransacionesNo sera maravilloso si cada operacin que intentara nuestra aplicacin tuvieraxito? Desafortunadamente, en el mundo multi-thread de las aplicacionesdistribuidas y recursos compartidos, esto no es siempre posible.

    Por qu? Primero de todo, los recursos compartidos deben mantener una vistaconsistente de los datos de todos los usuarios. Esto significa que leer y escribirtiene que ser controlado para que los usuarios no se sobreescriban los datos unosa los otros, o los errores de transacin no corrompan la integridad de los datos.Tambin, si trabajamos en una red con retardos intermitenes o cadas deconexiones, el potencial para que las operaciones fallen en una aplicacin basadaen web se incrementa con el nmero de usuarios.

    Los fallos de operaciones son inevitables, lo mejor es recuperar luego la seguridad,y aqu es donde entra el control de transaciones. Las bases de datos modernas ylos controladores de transaciones nos permiten deshacer y repetir el estado de unasecuencia de operaciones fallidas para asegurar que los datos son consistentespara el acceso desde mltiples threads.

    Esta seccin aade cdigo al SellerBean del ejemplo de la casa de subastas paraque pueda manejar la insercin de itms en la subasta ms all del controlador detransaciones por defecto proporcionado por su contenedor.

    Por qu Controlar las Transaciones?l

    Sincronizacin de Sesin

    Ejemplo de Contenedor Controladorm

    Cdigom

    l

    Modo de Entrega de la Transacin

    Configurador del Servidorm

    Descripciones de Atributos de Transacinm

    Descripciones del Nivel de Aislamientom

    Ejemplo de Bean-Controladorm

    l

    Por qu Controlar las Transaciones?Cuando accedemos a una base de datos usando el API JDBC, todas las aplicacionesse ejecutan con una entrega automtica explcita por defecto. Esto significa quecualquier aplicacin que est viendo los datos ver los datos actualizados despusde cada llamada a JDBC.

    Para aplicaciones sencillas, esto podra ser aceptable, pero consideremos laaplicacin de la casa de subastas y las secuencias que ocurren cuando SellerBean

  • inserta un tem de subasta. Primero se carga la cuenta del usuario para listar eltem, y se aade el tem a la lista de tems de la subasta. Estas operacionesivolucran a RegistrationBean para cobrar la cuenta y AuctionItemBean paraaadir el tem a la lista de subasta.

    En el modo de entrega automtico, si falla la insercin del tem de subasta, slo sese puede deshacer el listado, y tenemos que ajustar manualmente la cuenta delusuario para descontarle la lista de cargos. Mientras tanto, otro thread podra estarintentando deducir de la misma cuenta de usuario, sin encontrar crdito, yabortando cuando quizs unos milisegundos despus se podra haber completado.

    Hay dos formas para segurarnos de que el dbito se ha devuelto a su valor cuandofalla la insercin de un tem en la subasta:

    Aadir cdigo de sincronizacin de sesin al Bean de sesin del contenedorcontrolador para obtener el control sobre las entregas de la transacin yvolver atrs.

    l

    Configurar JDBC para los servicios de modo de entrega transacin y aadircdigo para arrancar, parar, entregar y deshacer la transacin. Esto es unatransacin controlada por Bean y puede ser usada por Beans de entidad y desesin.

    l

    Sincronizacin de SesisnUn Bean de sesin controlado por contenedor puede opcionalmente incluirsincronizacin de sesin para controlar la entrega automtica por defectopropocionada por el contenedor. El cdigo de sincronizacin permite al contenedornotificar al Bean cuando se alcanzan los puntos importantes en la transacin.Adems de recibir la notificacin, el Bean puede tomar cualquier accin necesariaantes de que la transacin proceda con el siguiente punto.

    Nota: Un Bean de Sesin que usa transaciones controladas por Bean nonecesita sincronizacin de sesin porque tiene la entrega totalmentecontrolada.

    Ejemplo de Control por ContenedorSellerBean es un Bean de sesin que usa RegistrationBean para comprobar laID y la password del usuario cuando alguien postea un tem para la subasta yapunta en la cuenta del vendedor un listado, y AuctionItemBean aade losnuevos tems a la base de datos.

    La transacin empieza en el mtodo insertItem con el apunte del dbito y terminacuando se entrega la transacin completa o se deshace. La transacin completaincluye deshacer el apunte de 50 centavos si el tem de subasta es null (lainsercin falla), o si se captura una excepcin. Si el tem de subasta no es null y lainsercin se realiza con xito, se entrega la transacin completa, incluyendo el

  • cobro de los 50 centavos.

    Cdigo

    Para usar sincronizacin de sesin, un Bean de sesin implementa el interfaceSessionSynchronzation y sus tres mtodos, afterBegin, beforeCompletion, yafterCompletion. Este ejemplo adapta el cdigo de SellerBean.java para usarsincronizacin de sesin.

    public class SellerBean implements SessionBean, SessionSynchronization {

    private transient SessionContext ctx; private transient Properties p = new Properties(); private transient boolean success = true;

    public void afterBegin() {}

    public void beforeCompletion() { if (!success ) { ctx.setRollbackOnly(); } }

    public void afterCompletion(boolean state) {}afterBegin: El contenedor llama a este mtodo antes del dbito para notificar alBean de sesin de que una nueva transacin va a comenzar. Podemos implementareste mtodo que haga cualquier trabajo prvio en la base de datos que pudiera sernecesario para la transacin. En este caso no son necesarios trabajos prvios, poreso este mtodo no est implementado.

    beforeCompletion: El contenedor llama a este mtodo cuando est listo paraescribir el tem de subasta y el dbito en la base de datos, pero antes de hacerlorealmente (entregarlo). Podemos implementar este mtodo para escribir cualquieractualizacin cach de la base de datos o deshacer la transacin. En este ejemplo,el mtodo llama al mtodo setRollbackOnly sobre el contexto de la sesin en elcaso de que la variable success sea false durante la transacin.

    afterCompletion: El contenedor llama a este mtodo cuando la transacin seentrega. Un valor booleano de true significa que el dato ha sido enviado y falsesignifica que la transacin se ha deshecho. El mtodo usa el valor boolean paradeterminar si necesita resetear el estado del Bean en el caso de que se hayadeshecho. En este ejemplo, no es necesario resetear el estado en el caso de unfallo.

    Aqu est el mtodo insertItem con comentarios que muestran dnde estn los

  • puntos donde se llama a los mtodos de SessionSynchronization.

    public int insertItem(String seller, String password, String description, int auctiondays, double startprice, String summary) throws RemoteException {

    try{ Context jndiCtx = new InitialContext(p);

    RegistrationHome rhome = (RegistrationHome) sCtx.lookup("registration"); RegistrationPK rpk=new RegistrationPK(); rpk.theuser=seller; Registration newseller=rhome.findByPrimaryKey(rpk);

    if((newseller == null) || (!newseller.verifyPassword(password))) { return(Auction.INVALID_USER); }

    //Call to afterBegin newseller.adjustAccount(-0.50);

    AuctionItemHome home = (AuctionItemHome) jndiCtx.lookup("auctionitems"); AuctionItem ai= home.create(seller, description, auctiondays, startprice, summary); if(ai == null) { success=false; return Auction.INVALID_ITEM; } else { return(ai.getId()); }

    }catch(Exception e){ System.out.println("insert problem="+e); success=false;

  • return Auction.INVALID_ITEM; }//Call to beforeCompletion//Call to afterCompletion

    }

    Modo de Entrega de la TransacinSi configuramos los servicos JDBC para modo de entrega de transacin, podemoshacer que el Bean controle la transacin. Para configurar los servicios de JDBC parala entrega, llamamos a con.setAutoCommit(false) sobre nuestra conexin JDBC.No todos los drivers JDBC soportan el modo de entrega, pero para hacer que elBean controle y maneje las transaciones, necesitamos un driver que lo haga.

    El modo de entrega de la transacin nos permite aadir cdigo que crea una red deseguridad alrededor de una secuencia de operaciones dependientes. El API deTransaction de Java, proporciona las ayudas que necesitamos para crear esa redde seguridad. Pero si estamos usando la arquitectura JavaBeans de Enterprise,podemos hacerlo con mucho menos cdigo. Slo tenemos que configurar elservidor de JavaBeans de Entrprise, y especificar en nuestro cdigo donde empiezala transacin, donde para, donde se deshace y se entrega.

    Configuracin del servidor

    Configurar el servidor de JavaBeans Enterprise implica especificar las siguientesselecciones en un fichero de configuracin para cada Bean:

    Un nivel de aislamiento para especificar cmo de exclusivo es el acceso deuna transascin a los datos compartidos.

    l

    Un atributo de transacin para especificar cmo controlar las transacionesmediante el Bean o el contenedor que contina en otro Bean.

    l

    Un tipo de transacin para especificar si la transacin es manejada por elcontenedor o por el Bean.

    l

    Por ejemplo, podramos especificar estas selecciones para el servidor BEA Weblogicen un fichero DeploymentDescriptor.txt para cada Bean.

    Aqu est la parte de DeploymentDescriptor.txt para SellerBean que especificael nivel de aislamiento y el atributo de transacin.

    (controlDescriptors (DEFAULT isolationLevel TRANSACTION_SERIALIZABLE transactionAttribute REQUIRED runAsMode CLIENT_IDENTITY runAsIdentity guest

  • ); end DEFAULT); end controlDescriptors

    Aqu est el equivalente en lenguaje XML.

    SellerBean * Container Required

    En este ejemplo, SellerBean est controlado por el Bean.

    SellerBean * Bean Required

    Descripcin de Atributo de Transacin: Un Bean Enterprise usa un transactionattribute para especificar si una transacin de Bean es manejada por el propioBean o por el contenedor, y cmo manejar las transaciones que empezaron en otroBean.

    El servidor de JavaBeans de Enterprise slo puede controlar una transacin a lavez. Este modelo sigue el ejemplo configurado por el Object Transaction Service(OTS) de la OMG, y significa que la especificacin actual de los JavaBeansEnterpirse no proporcionan una forma para transaciones anidadas. Una transacinanidada es un nueva transacin que arranca dentro de otra transacin existente.Mientras que las transaciones anidadas no estn permitidas, continuar unatransacin existente en otro Bean es correcto.

    Cuando se entra en un Bean, el servidor crea un contexto de transacin paracontrolar la transacin. Cuando la transacin es manejada por le Bean, accedemospara comenzar, entregar o deshacer la transacin cuando sea necesario.

    Aqu estn los atributos de transacin con una breve descripcin de cada uno deellos. Los nombres de los atributos cambiaron entre las especificaciones 1.0 y 1.1de los JavaBeans Enterprise.

    Especificacin 1. Especificacin 1.0

    REQUIRED TX_REQUIRED

  • Transacin controlada por el contenedor. El servidor arranca y maneja una nuevatransacin a peticin del usuario o contina usando la transacin que se arrancen el cdigo que llam a este Bean.REQUIRESNEW TX_REQUIRED_NEWTransacin controlada por contenedor. El servidor arranca y maneja una nuevatransacin. Si una transacin existente arranca esta transacin, la suspende hastaque la transacin se complete.Especificado como tipode transacin de Bean enel Descriptor dedesarrollo

    TX_BEAN_MANAGED

  • En este contexto, serializable significa proceso como una operacin serial, y nodebera confundirse con la serializacin de objetos para preservar y restaurar susestados. Ejecutar transaciones como una sla operacin serial es la seleccin mslenta. Si el rendimiento es un problema, debemos usar otro nivel de aislamientoque cumpla con los requerimientos de nuestra aplicacin, pero mejore elrendimiento.

    TRANSACTION_REPEATABLE_READ: En este nivel, los datos leidos por unatransacin pueden ser leidos, pero no modificados, por otra transacin. Segarantiza que el dato tenga el mismo valor que cuando fue ledo por primera vez, amenos que la primera transacin lo cambie y escriba de nuevo el valor cambiado.

    TRANSACTION_READ_COMMITTED: En este nivel, los datos ledos por unatransacin no pueden ser ledos por otra transacin hasta que la primeratransacin los haya entregado o deshecho

    TRANSACTION_READ_UNCOMMITTED:En este nivel, los datos involucrados enuna transacin pueden ser ledos por otros threads antes de que la primeratransacin se haya completado o se haya deshecho. Las otras transaciones nopueden saber si los datos fueron finalmente entregados o deshechos.

    Ejemplo de Bean ControladorSellerBean es un Bean de sesin que usa RegistrationBean para chequear la IDy la password del usuario cuando alguien postea un tem para la subasta, apunta eldbito en la cuenta del usuario, y AuctionItemBean aade un nuevo tem a labase de datos de la subasta.

    La transacin empieza en el mtodo insertItem con el dbito de la cuenta ytermina cuando la transacin completa se entrega o se deshace. La transacincompleta incluye deshacer el apunte de 50 centavos si el tem de subasta es null(la insercin falla), o si se captura una excepcin. Si el tem de subasta no es nully la insercin se realiza con xito, se entrega la transacin completa, incluyendo elcobro de los 50 centavos.

    Para este ejemplo, el nivel de aislamiento es TRANSACTION_SERIALIZABLE, yel atributo de transacin es TX_BEAN_MANAGED. Los otros Beans en latransacin, RegistrationBean y AuctionItemBean, tienen un nivel deaislamiento de TRANSACTION_SERIALIZABLE y un atributo de transacin deREQUIRED.

    Los cambios en esta versin de SellerBean sobre la versin del contenedorcontrolador se marcan con comentarios:

    public int insertItem(String seller, String password, String description, int auctiondays,

  • double startprice, String summary) throws RemoteException {

    //Declare transaction context variable using the//javax.transaction.UserTransaction class UserTransaction uts= null;

    try{ Context ectx = new InitialContext(p);

    //Get the transaction context uts=(UserTransaction)ctx.getUserTransaction();

    RegistrationHome rhome = ( RegistrationHome)ectx.lookup("registration"); RegistrationPK rpk=new RegistrationPK(); rpk.theuser=seller; Registration newseller= rhome.findByPrimaryKey(rpk);

    if((newseller == null)|| (!newseller.verifyPassword(password))) { return(Auction.INVALID_USER); }

    //Start the transaction uts.begin();

    //Deduct 50 cents from seller's account newseller.adjustAccount(-0.50);

    AuctionItemHome home = ( AuctionItemHome) ectx.lookup("auctionitems"); AuctionItem ai= home.create(seller, description, auctiondays, startprice, summary);

    if(ai == null) {//Roll transaction back uts.rollback(); return Auction.INVALID_ITEM; }

  • else {//Commit transaction uts.commit(); return(ai.getId()); }

    }catch(Exception e){ System.out.println("insert problem="+e);//Roll transaction back if insert fails uts.rollback(); return Auction.INVALID_ITEM; }}

    Ozito

  • Mtodos de Bsqueda de Bean ControladorLa bsqueda en el contenedor controlador descrita en el captulo 2 est basada en el mcanismo del mtodo finder donde el descriptor de desarrollo, en lugar del Bean, especifica elcomportamiento del mtodo finder. Mientras el mecanismo del mtodo finder funciona bien para consultas sencillas, no puede manejar operaciones complejas que impliquen ms de untipo de Bean o tablas de bases de datos. Tambin, la especificacin 1.1 de los JavaBeans de Enterprise actualmente no proporciona para poner las reglas del mtodo finder en eldescriptor de desarrollo.

    Por eso, para consultas y bsquedas ms complejas, tenemos que escribir bsquedas y consultas controladas por el Bean. Esta seccin explica cmo escribir una versin de la facilidadde bsqueda de la casa de subastas controlada por el Bean. La bsqueda controlada por el Bean inplica cambios en el mtodo AuctionServlet.searchItems y un nuevo Bean de sesin,SearchBean.

    AuctionServlet.searchItemsl

    SearchBeanl

    AuctionServlet.searchItemsLa bsqueda empieza cuando el usuario final enva una cadena de bsqueda a la facilidad de bsqueda de la pgina principal de la casa de subastas, y pulsa el boton Submit. Esto llamaa AuctionServlet, que recupera la cadena de bsqueda desde la cabecera HTTP y la pasa al mtodo searchItem.

    Nota: La lgica de bsqueda para este ejemplo es bastante simple. El propsito es mostrar cmo mover la lgica de bsqueda a otro Bean Enterprise separado para quepodamos mover bsquedas ms complejas nosotros solos.

    La

  • operacin searchItem se hace en dos partes: 1) usar la cadena de bsqueda para recuperar las claves primarias, y 2) usar las claves primarias para recuperar los tems de la subasta

    Parte 1: Lo primero que hace el mtodo searchItems es pasar la cadena de bsqueda enviada por el usuario final al Bean de sesin SearchBean.

    SearchBean (descrito en la siguiente seccin) implementa una bsqueda controlada por Bean que recupera una lista de claves primarias para todos los tems de la subasta cuyo campoSummary contenga caracteres que correspondan con los de la cadena de bsqueda. Esta lista es devuelta al mtodo searchItems en una variable Enumeration.

    Enumeration enum=(Enumeration) search.getMatchingItemsList(searchString);

    Parte

  • 2: El mtodo searchItems usa la lista Enumeration devuelta en la parte 1 y usa AuctionItemBean para recuperar cada Bean por turno llamando a findByPrimaryKey sobre cada claveprimaria de la lista. Esta es una bsqueda controlada por contenedor basada en el mecanismo del mtodo finder descrito en el captulo 2.

    //Iterate through search resultswhile ((enum != null) && enum.hasMoreElements())) { while(enum.hasMoreElements(in)) {

    //Locate auction items AuctionItem ai=ahome.findByPrimaryKey(( AuctionItemPK)enum.nextElement()); displayLineItem(ai, out); }}

    SearchBeanLa clase SearchBean.java define una bsqueda controlada por el Bean para claves primarias de tems de subasta con los campos summary que contienen caracteres que correspondencon la cadena de bsqueda. Este Bean establece una conexin con la base de datos, y proporciona los mtodos getMatchingItemsList y EJBCreate.

    Conexin con la Base de Datos

    Como este Bean controla su propio acceso a la base de datos, tiene que establecer su propia conexin con ella. No puede delegar esto al contenedor..

    La conexin con la base de datos se establece ejemplarizando una clase Driver esttica y proporcionando el mtodo getConnection. Este mtodo requiere una clase estticaDriverManager para registrar un driver con la base de datos que corresponda con la URL. En este caso la URL es weblogic.jdbc.jts.Driver.

    //Establish database connection static { new weblogic.jdbc.jts.Driver(); }

    public Connection getConnection() throws SQLException { return DriverManager.getConnection(

  • "jdbc:weblogic:jts:ejbPool"); }

    Obtener la Lista de tems EncontradosEl mtodo getMatchingItemsList busca AuctionItemsBean y crea un objeto PreparedStatement para hacer una consulta a la base de datos por los campos summary quecontengan la cadena de bsqueda. Los datos se leen desde la base de datos dentro de un ResultSet, almacenado en un Vector, y devuelto a AuctionServlet.

    public Enumeration getMatchingItemsList( String searchString) throws RemoteException {

    ResultSet rs = null; PreparedStatement ps = null; Vector v = new Vector(); Connection con = null;

    try{//Get database connection con=getConnection();//Create a prepared statement for database query ps=con.prepareStatement("select id from auctionitems where summary like ?"); ps.setString(1, "%"+searchString+"%");//Execute database query ps.executeQuery();//Get results set rs = ps.getResultSet();//Get information from results set AuctionItemPK pk; while (rs.next()) { pk = new AuctionItemPK(); pk.id = (int)rs.getInt(1);//Store retrieved data in vector v.addElement(pk); } rs.close(); return v.elements();

    }catch (Exception e) { System.out.println("getMatchingItemsList: "+e); return null; }finally { try { if(rs != null) { rs.close(); } if(ps != null) { ps.close(); } if(con != null) { con.close(); } } catch (Exception ignore) {} } }

    Mtodo Create

    El mtodo ejbCreate crea un objeto javax.naming.InitialContext. Esta es una clase JNDI (Java Nanimg and Directory) que permite a SearchBean acceder a la base de datos sinrelacionarse con el contenedor:

    public void ejbCreate() throws CreateException, RemoteException {

  • Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.TengahInitialContextFactory"); try{ ctx = new InitialContext(p); }catch(Exception e) { System.out.println("create exception: "+e); } }

    Ozito

  • Clculo DistribuidoTan recientemente como hace diez aos, el clculo distribuido generalmentesignificaba que teniamos clientes PCs en una habitacin con un servidor en otra. Elproblema con esta arquitectura es que si se pierde la conexin con el servidor, losclientes no pueden actualizar las bases de datos de la compaa.

    Para evitar esta prdida de tiempo, se crearon los diferentes modelos de red. Unejemplo es el modelo de servidor maestro y esclavo donde si el maestro falla, elesclavo toma el relevo. El problema con los distintos modelos de red es que todosrequieren alguna forma de intervencin manual y se unieron con un sistemaoperativo o un lenguaje. Y aunque estas aproximaciones consiguieron reducir eltiempo de parada, no cumplen con los sistemas de distribucin heterognea queconsiste en una mezcla de protocolos de red y mquinas.

    La plataforma JavaTM combinada con otros avances como Common Object RequestBroker Architecture (CORBA), servidores multi-fila, y redes sin cables han llevadoun paso mas all la realizacin de la computacin totalmentedistribuida, de latradicional aproximacin cliente y servidor.

    Ahora podemos construir aplicaciones que incluyan servicios de redundancia pordefecto. Si una conexin de servidor falla, podemos usar un servicio de otroservidor. CORBA y los puentes "Distributed Component Object Model" (DCOM)significan que los objetos pueden ser transferidos entre casi todas las mquinas ylenguajes. Y con el nuevo sistema de software JiniTM, el entorno de clculodistribuido pude estar pronto en todos los hogares, oficinas o escuelas.

    Servicios de Bsquedal

    Remote Method Invocation (RMI)l

    Common Object Request Broker Architecture (CORBA)l

    Tecnologa JDBCTMl

    Servletsl

    Tienes Prisa?Esta tabla te llevar directamente a los tpicos especificados.

    Tpico Seccin

  • Servicios de Bsqueda Java Naming and Directory Interface (JNDI)l

    Common Object Request Broker Architecture(CORBA) Naming Service

    l

    Interoperable Object References (IOR)l

    Remote Method Invocation (RMI)l

    RMI Over Internet Inter-ORB Protocol (IIOP)l

    JINI Lookup Servicesl

    Aumentar el Rendimiento de la Bsquedal

    Remote MethodInvocation (RMI)

    Sobre RMIl

    RMI en la aplicacin Subasta

    Introduccin a la Clasem

    Sumario de Ficherosm

    Compilar el Ejemplom

    Arrancar el Registro RMIm

    Arrancar el Servidor Remotom

    l

    Establecer Comunicaciones Remotasl

    La clase RegistrationServer

    Exportar un Objeto Remotom

    Pasar por Valor y por Referenciam

    Recoleccin de Basura Distribuidam

    l

    Interface Registrationl

    Interface ReturnResultsl

    La Clase SellerBeanl

    Common ObjectRequest BrokerArchitecture (CORBA)

    Esquema de Mapeo IDL

    Referencia Rpidam

    Configurar el Mapeo IDLm

    Otros Tipos IDLm

    l

    CORBA en la Aplicacin de Subasta

    CORBA RegistrationServerm

    Fichero de Mapeos IDLm

    Compilar el Fichero de Mapeos IDLm

    Ficheros Stub y Skeletonm

    l

    Object Request Broker (ORB)l

  • Hacer Accesible el Servidor CORBAm

    Aadir un nuevo ORBm

    Accesos al Servicio de Nombres por clientesCORBA

    m

    Clases Helper y Holderl

    Recoleccin de Basural

    Retrollamadas CORBAl

    Uso de Cualquier Tipol

    Conclusinl

    Tecnologa JDBC Drivers JDBCl

    Conexiones a Bases de Datosl

    Sentencias

    Sentencias Callablem

    Sentenciasm

    Sentencias Preparadasm

    l

    Guardar los Resultados de la Base de Datosl

    Hojas de Resultadosl

    Hojas de Resultados Scrollablesl

    Controlar Transacionesl

    Caracteres de Escapel

    Mapeo de Tipos de Bases de Datosl

    Mapeo de Tipos de Datosl

    Ozito

  • Servicios de BsquedaLos servicios de bsqueda permiten las comunicaciones a travs de la red. Un programa cliente puede usar un protocolo de bsqueda para obtener informacin sobre programasremotos o mquinas que usen esa informacin para establecer una comunicacin.

    Un servicio de bsqueda comn con el que podramos estar familiarizados es el Directory Name Service (DNS). Mapea direcciones de Internet Protocol (IP) a nombres demquinas. Los programas usan el mapeo DNS para buscar direcciones IP asociadas con un nombre de mquina y usar la direccin IP para establecer una comunicacin.

    l

    De la misma forma, el AuctionServlet presentado en Chapter 2 usa el servicio de nombres interno de la arquitectura de JavaBeans Enterprise para buscar unas referencias a BeansEnterprise registrados con el servidor de JavaBeans Enterprise.

    l

    Adems de los servicios de nombres, algunos protocolos de bsqueda proporcionan servicios de directorio. Este servicios como el Lightweight Directory Access Protocol (LDAP) y elNIS+ de Sun proporcionan otra informacin y servicios ms all de los disponibles con el servicio de nombres. Por ejemplo, NIS+ asocia un atributo workgroup con una cuenta deusuario. Este atributo puede usarse para restringir el acceso a una mquna, por lo que slo los usuarios especificados en el workgroup tienen acceso.

    Este captulo describe como se usa el "Naming and Directory Interface (JNDI)" de Java en la aplicacin de subastas para buscar los Beans de Enterprise. Tambin explica como usaralgunos de los otros muchos servicios de bsqueda que tenemos disponibles. El cdigo para usar estos servicios no es tan sencillo como el cdigo de la bsqueda en la aplicacin de lasubasta del captulo 2, pero las ventajas que ofrecen estos otros servicios hacen que algunas veces merezca la pena ese cdigo ms complejo.

    Java Naming and Directory Interface (JNDI)l

    Servicio de Nombres de la Arquitectura Common Object Request Broker (CORBA)l

    Interoperable Object References (IOR)l

    Remote Method Invocation (RMI)l

    RMI Over Internet Inter-ORB Protocol (IIOP)l

    Servicios de Bsqueda JINIl

    Aumentar el Rendimiento de la Bsquedal

    Java Naming and Directory Interface (JNDI)El API de JNDI hace sencillo conectar servicios de bsqueda de varios proveedores en un programa escrito en lenguaje Java. Siempre que el cliente y el servidor usen el mismo serviciode bsqueda, el cliente puede fcilmente buscar informacin registrada en el servidor y establecer una comunicacin.

    Los Beans de sesin de la aplicacin de subasta usan JNDI y una fbrica de nombres JNDI especial de BEA Weblogic para buscar Beans de entidad. Los servicios JNDI normalmenteinicializan la fbrica de nombres como una propiedad de la lnea de comandos o como un valor de inicializacin.

    Primero, la fbrica de nombres weblogic.jndi.TengahInitialContextFactory se pone dentro de un objeto java.util.Property, luego este objeto se pasa como parmetro alconstructor de InitialContexT. Aqu tenemos un ejemplo del mtodo ejbCreate:.

    Context ctx; //JNDI context

    public void ejbCreate() throws CreateException, RemoteException { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.TengahInitialContextFactory"); try{ ctx = new InitialContext(env); }catch(Exception e) { System.out.println("create exception: "+e); } }

    Una vez creado, el contexto JNDI se usa para buscar los interfaces principales de los Beans Enterprise. En este ejemplo, se recupera una referencia a un Bean Enterprise uinda alnombre registration y se usa para operaciones posteriores:

    RegistrationHome rhome = (RegistrationHome) ctx.lookup("registration"); RegistrationPK rpk=new RegistrationPK(); rpk.theuser=buyer; Registration newbidder = rhome.findByPrimaryKey(rpk);

    En el lado del servidor, el descriptor de desarrollo para el RegistrationBean tiene su valor beanhomename como registration. Las herramientas de JavaBeans de Enterprisegeneran el resto del cdigo de nombres para el servidor.

    El servidor llama a ctx.bind para unir el nombre registration al contexto JNDI. El parmetro this referencia a la clase _stub que representa el RegistrationBean.

  • ctx.bind("registration", this);JNDI no es la nica forma de localizar objetos remotos. Los servicios de bsqueda tambin estn disponibles en las plataformas RMI, JNI y CORBA. Podemos usar directamente losservicios de bsqueda de estas plataformas directamente desde el API del JNDI. JNDI permite a las aplicaciones cambiar el servicio de nombres con poco esfuerzo. Por ejemplo, aquest el cdigo que hace que el mtodo BidderBean.ejbCreate use el servicio de bsqueda de org.omb.CORBA en vez del servicio de bsqueda por defecto de BEA Weblogic.

    Hashtable env = new Hashtable(); env.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory"); Context ic = new InitialContext(env);

    Servico de Nombres CORBAEl "Common Object Request Broker Architecture" (CORBA) define una especificacin para que los objetos de un sistema distribuido se comuniquen unos con otros. Los objetos que usanla especificaci