Вы находитесь на странице: 1из 19

Integracin de JSF, Spring e Hibernate para crear una Aplicacin Web del Mundo Real

Autor: Derek Yang Shen Traductor: Juan Antonio Palos (Ozito)

Introduccin Requerimientos Funcionales de la Aplicacin de Ejemplo o Casos de Utilizacin o Reglas de Negocio o Presunciones o Flujo de Pginas Diseo de la Arquitectura de Alto nivel o Arquitectura Multi-capa o Diseo de la Arquiectura de JCatalog o La Capa de Presentacin y JavaServer Faces Model-View-Controller (MVC) JavaServer Faces JSF y MVC Por qu JSF? Bean Manejado, Bean de Respaldo, objeto vista y Modelo de objeto de dominio Seguridad Paginacin Cach Subida de Ficheros Validacin Personalizacin de los Mensajes de Error o La Capa de Lgica-de-Negocio y el Marco de Trabajo Spring o La Capa de Integracin e Hibernate Data Access Object (DAO) Implementacin o Diseo de la Base de Datos o Diseo de Clases o Conectarlo Todo Capa de Presentacin Capa de Lgica-de_Negocio Capa de Integracin

Conclusin

Introduccin
La tenologa JavaServer Faces (JSF) es un nuevo marco de trabajo para interfaces de usuario para aplicacin J2EE. Por diseo, es particularmente til con aplicaciones basadas en la arquitectura MVC (Model-View-Controller). Numrosos artculos han presentado ya JSF. Sin embargo, la mayora toma una aprximacin terica que no cumple los retos del desarrollo empresarial del mundo real. Quedan muchos problemas por resolver. Por ejemplo, dnde entra JSF en la arquiectura general MVC?, Cmo se integra JSF con otros marcos de trabajo?, Existe la lgica de negocio en los beans que hay tras JSF? Y principalmente, cmo se puede construir una aplicacin Web del mundo real utilizando JSF? Este tutorial corrige todos esos problemas. Muestra cmo integrar JSF con otros mrcos de trabajo, espcficamente, Spring e Hibernate. Demuestra cmo crear la aplicacin web JCatalog, un sistema de catlogo de productos online. Usando el ejemplo JCatalog este tutorial cubre todas las fases del diseo de una aplicacin Web, incluyendo el descubriemto de los requerimientos del negocio, el anlisis, la seleccin de tecnologas, la arquitectura de alto nivel, y el diseo a nivel de la implementacin. Este tutorial discute las ventajas y desventajas de las tecnologas utilizadas en JCatalog y demuestra aproximaciones para disear algunos de los aspectos clave de la aplicacin. Este tutorial est escrito para arquitectos Java, desarrolladores que ya han trabajado con aplicaciones Web basadas en J2EE. No es una introduccion a JSF, al marco de trabajo Spring ni a Hibernate.

Requerimientos Funcionales de la Aplicacin de Ejemplo


La aplicacin de ejemplo de este tutorial, JCatalog, es una aplicacin Web del mundo real, suficientemente realista para proporcionar una importante discusin sobre las decesiones arquitecturales de una aplicacin Web. Empezaremos presentando los requrimientos de JCatalog. Nos referiremos a esta seccin a lo largo del tutorial para dirigir las decisiones tcnicas y el diseo de la arquitectura. La primera fase en el diseo de una aplicacin Web es descubrir los requerimientos funcionales del sistema. Los usuarios pueden navegar por un catlogo de productos y ver los detalles de un producto y los administradores pueden manejar el catlogo de productos. Se pueden aadir algunas mejoras, como el control de inventario y el procesamiento de pedidos para hacer que la aplicacin sea realmente un sistema de negocio-electrnico.

Casos de Utilizacin
Se utiliza el anlisis de los casos de utilizacin para acceder a los requerimientos funcionales de la aplicacin. En la siguiente figura se puede ver el diagrama de casos de utilizacin:

Un diagrama de casos de utilizacin identifica los actores en un sistema y las operaciones que podran realizar. En la aplicacin de ejemplo se deben implementar siete casos de utilizacin. Al actor User puede navegar por el catlogo de productos y ver los detalles de esos productos. Una vez que el User entra en el sistema, se convierte en el actor Administrator, que puede crear nuevos productos, editar productos existentes, y borrar productos obsoletos.

Reglas de Negocio
JCatalog debe cumplir las siguientes reglas de negocio:

Cada producto tiene un ID nico Cada producto pertenece al menos a una categora El ID de un producto no se puede modificar una vez creado.

Presunciones
Hacemos las siguientes presunciones para el diseo e implementacin de la aplicacin:

El Ingls es el idioma por defecto, no se requiere internacionalizacin No existen ms de 500 productos en el catlogo El catlogo no se actualiza muy frecuentemente.

Flujo de Pginas
La siguiente figura muestra todas las pginas de JCatalog y las transiciones entre ellas:

La aplicacin tiene dos grupos de pginas: pblicas por Internet y de administracin por intranet. La intranet es accesible slo cuando el usuario se 'logea' en el sistema. ProductSummary no se presenta a los usuarios como una pgina separada. Se muestra en un marco HTML dentro de la pgina Catalog. ProductList es un catalogo especial que slo pueden ver los administradores. Contiene enlaces para crear, editar y borrar productos. La siguiente figura muestra el esqueleto de la pgina Catalog. Idealmente, por cada pgina, se debe incluir en la documentacin de los requerimientos un esqueleto que detalle la informacin de todos los controles y del contenido requerido en la esa pgina.

Diseo de la Arquitectura de Alto nivel


La siguiente fase del diseo de una aplicacin web es el diseo de la arquitectura de alto nivel. Esto implica subdividir la aplicacin en componentes funcionales y particionar estos componentes en capas. El diseo de la arquitectura de alto nivel es neutral a las tecnologas utilizadas.

Arquitectura Multi-capa
Una arquitectura multicapa particiona todo el sistema en distintas unidades funcionales: cliente, presentacin, lgica-de-negocio, integracin, y sistema de informacin empresarial (EIS). Esto asegura una divisin clara de responsabilidades y hace que el sistema sea ms mantenible y extensible. Los sistemas con tres o ms capas se han probado como ms escalables y flexibles que un sistema clienteservidor, en el que no existe la capa central de lgica-de-negocios. La capa del cliente es donde se consumen y presentan los modelos de datos. Para una aplicacin Web, la capa cliente normalmente es un navegador web. Los clientes pequeos basados-en-navegador no contienen lgica de presentacin; se trata en la capa de presentacin. La capa de presentacin expone los servicios de la capa de lgica-de-negocio a los usuarios. Sabe cmo procesar una peticin de cliente, cmo interactar con la capa de lgica-de-negocio, y cmo seleccionar la siguiente vista a mostrar. La capa de la lgica-de-negocio contiene los objetos y servicios de negocio de la aplicacin. Recibe peticiones de la capa de presentacin, procesa la lgica de negocio basada en las peticiones, y media en los accesos a los recursos de la capa EIS. Los componenes de la capa de lgica-de-negocio se benefician de la mayora de lo servicios a nivel de sistema como el control de seguridad, de transaciones y de recursos. La capa de integracin es el puente entre la capa de lgica-de-negocio y la capa EIS. Encapsula la lgica para interactar con la capa EIS. Algunas veces a la combinacin de las capas de integracin y de lgicade-negocio se le conoce como capa central. Los datos de la aplicacin persisten en la capa EIs. Contiene bases de datos relacionales, bases de datos orientadas a objetos, y sistemas antiguos.

Diseo de la Arquiectura de JCatalog


La siguiente figura muestra el diseo de la arquitectura de alto nivel de JCatalog y cmo se acopla en la arquitectura multi-capa.

La aplicacin utiliza una arquitectura multi-capa no-distribuida. La figura anterior muestra el particionamiento de las capas de la aplicacin y las tecnologas elegidas para cada capa. Tambin sierve como diagrama de ejemplo de despliegue de la aplicacin. Para una arquitectura colocada, las capas de presentacin, de lgica-de-negocio y de integracin estn fsicamente localizadas en el mismo contenedor Web. Interfaces bien-definidos aislan las responsabilidades de cada capa. La arquitectura colocada hace que la aplicacin sea ms simple y escalable. Para la capa de presentacin, la experiencia muestra que la mejor prctica es elegir un marco de trabajo de aplicaciones Web existente y probado en vez de disear y construir un marco de trabajo personalizado. Hay varios marcos de trabajo de este tipo entre los que elegir: Struts, WebWork, y JSF. Nosotros utilizaremos JSF para JCatalog. Se pueden utilizar EJB (Enterprise JavaBeans) o POJO (plain old Java objects) para construir la capa de lgica-de-negocio. EJB con sus interfaces remotos es una mejor eleccin si la aplicacin es distribuida. Como JCatalog es una aplicacin web tpica que no requiere acceso remoto, se utilizar POJO con la ayuda del marco de trabajo Spring, para esta capa. La capa de integracin maneja la persistencia de los datos con la base de datos relacional. Se pueden utilizar diferentes aproximaciones para implementar la capa de integracin:

JDBC puro (Java DataBase Connectivity): Es la aproximacin ms flexible; sin embargo es difcil trabajar con JDBC de bajo nivel, y un mal cdigo JDBC no tiene un rendimiento muy bueno. Beans de entidad: Un Bean de entidad con persistencia manejada por el contenedor (CMP) es una forma costosa de aislar el cdigo de acceso-a-datos y manejar el mapeo O/R (objecto-relacional) para persistencia de datos. Es una aproximacin centrada en el servidor de aplicaciones. Un bean de

entidad no ata la aplicacin a un tipo particular de base de datos, pero si ata la aplicacin al contenedor EJB. Marco de Trabajo de Mapeo O/R: Un marco de trabajo de mapeo O/R toma una aproximacin centrada en el objeto para implementar la persistencia de datos. Una aplicacin de este tipo es fcil de desarrollar y altamente portable. Existen varios marcos de trabajo bajo este dominio: JDO (Java Data Objects), Hibernate, TopLink, y CocoBase son unos pocos ejemplos. En la aplicacin de ejemplo se utiliza Hibernate.

Ahora discutiremos los problemas de diseo asociados con cada capa de la aplicacin. Como JSF es una tecnologa relativamente nueva, aconsejo su utilizacin.

La Capa de Presentacin y JavaServer Faces


La capa de presentacin recoge la entrada del usuario, presenta los datos, controla la navegacin por las pgina y delega la entrada del usuario a la capa de la lgica-de-negocio. La capa de presentacin tambin puede validar la entrada del usuario y mantener el estado de sesin de la aplicacin. En las siguientes secciones, discutiremos las consideraciones de diseo y los patrones de la capa de presentacin, y la razn porque la que he elegido JSF para implementar JCatalog.

Model-View-Controller (MVC)
MVC es el patrn de diseo arquitectural recomendado para aplicaciones interactivas Java. MVC separa los conceptos de diseo, y por lo tanto decrementa la duplicacin de cdigo, el centralizamiento del control y hace que la aplicacin sea ms extensible. MVC tambin ayuda a los desarrolladores con diferentes habiliades a enfocarse en sus habilidades principales y a colaborar a travs de interfaces claramente definidos. MVC es el patrn de diseo arquitectural para la capa de presentacin.

JavaServer Faces
JSF es un marco de trabajo de componentes de interface de usuario del lado del servidor para aplicaciones Web basadas en Java. JSF contiene un API para representar componentes UI y manejar sus estados, manejar sus eventos, a validacin del lado del servidor, y la conversin de datos, definir la navegacin entre pginas, soportar internacionalizacin y accesibilidad; y proporcionar extensibilidad para todas estas caractersticas. Tambine contien dos libreras de etiquetas JSP (JavaServer Pages) personalizadas para expresar componentes UI dentro de una pgina JSP y para conectar componentes a objetos del lado del servidor.

JSF y MVC
JSF encaja bien en la arquitectura de la capa de presentacin basada en MVC. Ofrece una clara separacin entre el comportamiento y la presentacin. Une los familiares componentes UI con los conceptos de la capa-Web sin limitarnos a una tecnologa de script o lenguaje de marcas particular. Los beans que hay tras JSF son la capa de modelo (en una seccin posterior hablaremos ms de estos beans). Tambin contienen acciones, que son una extensin de la capa del controlador y delegan las peticiones del usuario a la capa de la lgica-de-negocio. Observe, que desde la prespectiva de la arquitectura general de la aplicacin, tambin se puede referir a la capa de lgica-de-negocio como la capa del modelo. Las pginas JSP con etiquetas JSF personalizadas son la capa de la vista. El Servlet Faces proporciona la funcionalidad del controlador.

Por qu JSF?
JSF no es slo otro marco de trabajo Web. Las siguientes caractersticas diferencian a JSF de otros marcos de trabajo:

Desarrollo de una Aplicacin Web Orientada a Objetos al Estilo Swing: El modelo de componentes UI con estado del lado del servidor con oyentes/manejadores de eventos inicia el desarrollo de aplicaciones Web orientadas a objetos. Control de Beans-de-Respaldo: Los beans de respaldo son componentes JavaBeans asociados con componentes UI utilizados

en la pgina. El control de beans-de-respaldo separa la definicin de los objetos componentes del UI de los objetos que realizan el procesamiento especfico de la aplicacin y que adems contienen los datos. La implementacin de JSF almacena y maneja estos ejemplares de beans de respaldo en el mbito apropiado. Modelo de componentes UI extensible: Los componentes UI de JSF son elementos configurables, reutilizables que componen los intefaces de usuario de aplicaciones JSF. Se puede extender un componentes UI estndar y desarrollar componentes ms complejos, como barras de men y rboles. Modelo de Renderizado Flexible: Un renderizador separa la vista y la funcionalidad de los componentes UI. Se pueden crear y utilizar varios renderizadores para definir diferentes apariencias del mismo componente para el mismo o diferentes clientes. Modelo de Conversin y Validacin Extensible: Basados en los convertidores y validadores estndar, se pueden desarrollar convertidores y validadores personalizados, que proporcionan un mejor modelo de proteccin.

A pesar de su potencia, JSF no esta madura an. Los componentes, convertidores y validadores que vienen con JSF son bsicos. Y el modelo de validacin por-componente no puede manejar validaciones muchos-a-muchos entre componentes y validadores. Adems, las etiquetas personalizadas de JSF no se pueden integrar con JSTL (JSP Standard Tag Library) simultneamente. En la siguientes secciones, describiremos varios aspectos claves y decisiones de diseo que he realizado cuando implement JCatalog con JSF. Empezar con una discusin de la definicin de beans manejados y beans de respaldo en JSF. Luego presentar cmo manejar la seguridad, la paginacin, el cach, la subida de ficheros, la validacin y la personalizacin de mensajes de error en JSF.

Bean Manejado, Bean de Respaldo, objeto vista y Modelo de objeto de dominio


JSF presenta dos nuevos trminos: managed bean (bean manejado) y backing bean (bean de respaldo). JSF proporciona una fuerte facilidad de bean manejado. Los objetos JavaBean manejados por una implementacin JSF se llaman beans manejados. Un bean manejado describe como se crea y se maneja un bean. No tiene nada que ver con las funcionalidades del bean. El bean de resplado define las propiedades y las lgicas de manejo asociadas con los componentes UI utilizados en la pgina. Cada propiedad del bean de respaldo est unida a un ejemplar de un componente o a su valor. Un bean de respaldo tambin define un conjunto de mtodos que realizan funciones para el componente, como validar los datos del componente, manejar los eventos que dispara el componente, y realizar el procesamiento asociado con la navegacin cuando el componente se activa. Una tpica aplicacin JSF acopla un bean de repaldo con cada pgina de la aplicacin. Sin embargo, algunas veces en el mundo real, forzar una relacin uno-a-uno entre el bean de respaldo y la pgina no es la solucin ideal. Puede causar problemas como la duplicacin de cdigo. En el escenario del mundo real, varias pginas podran necesitar compartir el mismo bean de respaldo detrs de la escena. Por ejemplo, en JCatalog, las pginas CreateProduct y EditProduct comparten la misma definicion de ProductBean. Un objeto view (vista) es un objeto modelo utilizado especficamente en la capa de presentacin. Contiene los datos que debe mostrar en la capa de la vista y la lgica para validar la entrada del usuario, manejar los eventos, e interactar con la capa de lgica-de-negocio. El bean de respaldo es el objeto vista en una aplicacin basadas en JSF. Bean de respaldo y objeto vista son trminos intercambiables en este tutorial. En comparacin con la aproximacin ActionForm y Action de Struts, el desarrollo con beans de respaldo de JSF sigue unas mejores prcticas de diseo orientado a objetos. Un bean de respaldo no slo contiene los datos a ver, tambin el comportamiento relacionado con esos datos. En Struts, Action y ActionForm contienen los datos y la lgica por separado. Todos hemos odo hablar del modelo de objeto de dominio. Entonces, cul es la diferenica en el modelo de objeto de dominio y un objeto vista? En una sencilla aplicacin Web, un modelo de objeto de dominio se puede utilizar entre capas, sin embargo, en aplicaciones Web ms complejas, se necesita utilizar un modelo de objeto vista separado. Los modelos de objeto de dominio son como objetos de negocio y deberan pertenecer a la capa de lgica-de-negocio. Contiene los datos de negocio y la lgica de negocio asociados con el objeto de negocio especfico. Un objeto vista contiene datos especficos de la presentacin y el comportamiento. ProductListBean de JCatalog ofrece un buen ejemplo. Contiene los

datos y la lgica especfica de la capa de presentacin; es decir datos y lgica relacionados con la paginacin. La desventaja de separar los objetos vista del modelo de objetos de dominio es que debe ocurrir un mapeo de datos entre los dos modelos de objetos. En JCatalog, ProductBeanBuilder y UserBeanBuilder usan las Commons BeanUtils para implementar el mapeo de datos.

Seguridad
Actualmante, JSF no tiene una caracterstica de seguridad interna. Los requirimientos de seguridad para la aplicacin de ejemplo son bsicos: slo se necesita la autentificacin basada en nombre de usuario y password para que el usuario entre en la intranet de administracin, y no se requiere autorizacin. Se han propuesto varias alternativas para manejar la autentificacin de usuarios en JSF:

Usar un bean de respaldo: Esta es una solucin simple. Sin embargo, ata los beans de respaldo un rbol de herencia especfico. Usar un decorador ViewHandler JSF: De esta forma, la lgica est fuertemente unida a una tecnologa especfica de capa Web. Usar un filtro servlet: Una aplicacin JSF no es diferente de cualquier otra aplicacin Web basada en Java. Hace que un filtro sea el mejor lugar para manejar el chequeo de autentificacin. De esta forma, la lgica de autentificacin de desacopla de la aplicacin web.

En la aplicacin de ejemplo, la clase SecurityFilter maneja la autentificacin de los usuarios. Actualmente, los recursos protegidos son slo tres pginas, y sus localizaciones estn codificadas dentro de la clase Filter por simplicidad. Se pueden realizar mejoras para externalizar las reglas de seguridad y los recursos protegidos a un fichero de configuracin.

Paginacin
La aplicacin de un catlogo requiere paginacin. La capa de presentacin puede manejar la paginacin, lo que significa que los datos se debe recuperar y almacenar en esta capa. La paginacin tambin se puede manejar desde la capa de lgica-de-negocio, la capa de integracin o incluso desde la capa de EIS. Una de las presunciones de la aplicacin JCatalog era que no poda haber ms de 500 productos en el catlogo. La informacin de todos los productos puede caber en la sesin de usuario. La lgica de paginacin est en la clase ProductListBean. El parmetro relacionado con la paginacin "product per page" se configura mediante la facilidad del bean manejado de JSF.

Cach
El Cach es una las tecnicas ms importantes para mejorar el rendimiento de las aplicaciones web. El cach se puede conseguir en muchas capas dentro de la arquitectura de una aplicacin. Es ms beneficioso cuando una capa arquitectural puede evitar llamadas a la capa de al lado. La facilidad del bean manejado de JSF hace que el cach sea ms sencillo en la capa de presentacin. Cambiando el mbito del bean manejado, los datos que l contiene se pueden cachear dentro de diferentes mbitos. La aplicacin de ejemplo utiliza un cach de dos niveles. El primer nivel de cach existe dentro de la capa de lgica-de-negocio. La clase CachedCatalogServiceImpl mantiene un cach de lectura/escritura para todos los productos y categoras. Entonces, el cach de primer nivel es un cach de lectura/escritura en el mbito de la aplicacin. Para simplificar la lgica de paginacin y as mejorar la velocidad de la aplicacin, los productos tambin son cacheados dentro de la capa de presentacin en el mbito de la sesin. Cada usuario mantiene su propio ProductListBean dentro de la sesin. Las costes de esta aproximacin son la memoria del sistema y datos obsoletos. Durante una sesin de usuario, ste podra ver datos de un catlogo obsoleto si el administrador actualiza el catlogo. Sin embargo, basado en las presunciones, como no existen ms de 500 productos y el catlogo no se actualiza de forma frecuente, deberamos poder asumir estos costes.

Subida de Ficheros

La implementacin de referencia de JSF de Sun no soporta subida de ficheros. Struts tiene buenas capacidades para esto, sin embargo se necesita la librera de integracin Struts-Faces para utilizar esta caracterstica. En JCatalog, se asocia una imagen con cada producto. Despus de que el usuario crea un nuevo producto, debe subir la imagen asociada con l. La imagen es almacenada dentro del sistema de ficheros del servidor de aplicaciones. El ID del producto es el nombre de la imagen. La aplicacin de ejemplo utiliza el servlet <input type="file">, y el API de subida de ficheros de Jakarta Commons, para implementar una utilidad sencilla. Esta utilidad toma dos parmetros, el directorio de imgenes de producto y la result page de la imagen subida. Los dos son configurables mediante ApplicationBean. Puede ver ms detalles en la clase FileUploadServlet.

Validacin
Los validadores estndar que vienen con JSF son bsicos y podran no cumplir con los requerimientos del mundo real. Desarrollar sus propios validadores JSF es sencillo. Yo he desarrollado el validador SelectedItemsRange con una etiqueta personalizada en la aplicacin de ejemplo. Valida el nmero de tems seleccionados por el componente UI UISelectMany:
<h:selectManyListbox value="#{productBean.selectedCategoryIds}" id="selectedCategoryIds"> <catalog:validateSelectedItemsRange minNum="1"/> <f:selectItems value="#{applicationBean.categorySelectItems}" id="categories"/> </h:selectManyListbox>

Personalizacin de los Mensajes de Error


En JSf, se pueden configurar paquetes de recursos y personalizar los mensajes de error para convertidores y validadores. El paquete de recursos se configura dentro de faces-config.xml:
<message-bundle>catalog.view.bundle.Messages</message-bundle>

Las parejas clave-valor de los mensajes de error se aaden al fichero Message.properties:


#conversion error messages javax.faces.component.UIInput.CONVERSION=Input data is not in the correct type. #validation error messages javax.faces.component.UIInput.REQUIRED=Required value is missing.

La Capa de Lgica-de-Negocio y el Marco de Trabajo Spring


Los objetos y servicios de negocio existen en la capa de lgica-de-negocio. Un objeto de negocio no slo contiene datos, tambin la lgica asociada con ese objeto especfico. En la aplicacin de ejemplo se han identificado tres objetos de negocio: Product, Category, y User. Los servicios de negocio interactan con objetos de negocio y proporcionan una lgica de negocio de ms alto nivel. Se debera definir una capa de interface de negocio formal, que contenga los interfaces de servicio que el cliente utilizar directamente. POJO, con la ayuda del marco de trabajo Spring, implementar la capa de lgica-de-negocio de la aplicacin JCatalog. Hay dos servicios de negocio: CatalogService contiene la lgica de negocio relacionada con el manejo del catlogo, y UserService contiene la lgica de manejo del usuario.

Spring est basado en el concepto de inversin de control (IoC). Entre las caractersticas de Spring utilizadas en la aplicacin de ejemplo se incluyen:

Manejo de Beans con contexto de aplicacin: Spring puede organizar de forma efectiva nuestros objetos de la capa central y manejar las conexiones por nosotros. Spring puede eliminar la proliferacin de solitarios y facilita unas buenas prcticas de programacin orientada a objetos, por ejemplo utilizando interfaces. Manejo de Transaciones Declarativo: Spring utiliza AOP (aspect-oriented programming) para ofrecer manejo de transaciones declarativo sin utilizar un contenedor EJB. De esta forma, el control de transaciones se puede aplicar a cualquier POJO. El control de transaciones de Spring no est atado a JTA (Java Transaction API) y puede funcionar con diferentes estrategias de transacin. En la aplicacin de ejemplo se utiliza el manejo de transacin declarativo con Hibernate. rbol de Excepciones de Acceso a Datos: Spring proporciona un magnfico rbol de excepciones en lugar de SQLException. Para poder utilizar este rbol de excepciones, se debe definir un traductor de excepciones de acceso a datos dentro del fichero de configuracin de Spring:
<bean id="jdbcExceptionTranslator" class= "org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean>

En la aplicacin de ejemplo, si se inserta un producto nuevo con el ID duplicado, se lanza una DataIntegrityViolationException. La excepcin es capturada y relanzada como una DuplicateProductIdException. De esta forma, la DuplicateProductIdException se puede manejar de forma diferente a cualquier otra excepcin de acceso a datos.

Integracin con Hibernate: Spring no nos fuerza a utilizar su potente caracterstica de abstraccin JDBC. Se integra bien con marcos de trabajo de mapeo O/R, especialmente con Hibernate. Spring ofrece un manejo seguro y eficiente de sesiones Hibernate, maneja la configuracin de la SessionFactorie de Hibernate y las fuentes de datos JDBC en el contexto de la aplicacin, y hace que la aplicacin sea ms fcil de testear.

La Capa de Integracin e Hibernate


Hibernate es un marco de trabajo de mapeo O/R Open Source que evita la necesidad de utilizar el API JDBC. Hibernate soporta la mayora de los sistemas de bases de datos SQL. El Hibernate Query Language, diseado como una extensin mnima, orientada a objetos, de SQL, proporciona un puente elegante entre los mundos objeto y relacional. Hibernate ofrece facilidades para recuperacin y actualizacin de datos, control de transaciones, repositorios de conexiones a bases de datos, consultas programticas y declarativas, y un control de relaciones de entidades declarativas. Hibernate es menos invasivo que otros marcos de trabajo de mapeo O/R. Se utilizan Reflection y la generacin de bytecodes en tiempo de ejecucin, y la generacin del SQL ocurre en el momento de la arrancada. Esto nos permite desarrollar objetos persistentes siguiendo el lenguaje comn de Java: incluyendo asociacin, herencia, polimorfismo, composicin y el marco de trabajo Collections de Java. Los objetos de negocio de la aplicacin de ejemplo son POJO y no necesitan implementar ningn interface especfico de Hibernate.

Data Access Object (DAO)


En JCatalog se utiliza el patrn DAO. Este patrn abstrae y encapsula todos los accesos a la fuente de datos. La aplicacin tiene dos interfaces DAO: CatalogDao y UserDao. Sus clases de implementacin,

HibernateCatalogDaoImpl y HibernateUserDaoImpl contienen lgica especfica de Hibernate para

manejar los datos persistentes.

Implementacin
Ahora veamos cmo conectar todo junto e implementar JCatalog. Puede descargar todo el cdigo fuente de la aplicacin desde aqu.

Diseo de la Base de Datos


Creamos un esquema llamado Catalog para la aplicacin de ejemplo, que consta de cuatro tablas, como se ve en la siguiente figura:

Diseo de Clases
En la siguiente figura puede ver el diagrama de clases de la aplicacin:

Durante el diseo se ha utilizado la programacin contra interfaces. En la capa de presentacin, se han utilizado cuatro beans de respaldo: ProductBean, ProductListBean, UserBean, y MessageBean. La capa de lgica-de-negocio contiene dos servicios de negocio (CatalogService y UserService) y tres objetos de negocio (Product, Category, y User). La capa de integracin contiene dos interfaces DAO y sus implementaciones Hibernate. El contexto de aplicacin Spring conecta y maneja la mayora de los beans dentro de las capas de lgica-de-negocio y de integracin. ServiceLocator integra JSF con la capa de lgica-de-negocio.

Conectarlo Todo
Debido a la limitacin de espacio de este artculo, slo examinaremos un caso de uso. El caso de utilizacin CreateProduct demuestra como conectar todo y construir la aplicacin. Antes de sumergirnos en los detalles, usaremos un diagrama de secuencia (en la siguiente figura) para demostrar la integracin de principio-a-fin de todas las capas.

Ahora veremos los detalles de cmo implementar CreateProduct.

Capa de Presentacin
La implementacin de la capa de presentacin implica crear las pginas JSP, definir la navegacin por las pginas, crear y configurar los beans de respaldo, e integrar JSF con la capa de lgica de negocio:

Pgina JSP:
createProduct.jsp es la pgina para crear un nuevo producto. Contiene componentes UI y conecta los componentes al ProductBean. La etiqueta personalizada ValidateItemsRange

valida el nmero de categoras que el usuario ha seleccionado. Por cada producto nuevo se debe seleccionar al menos una categoria. Navegacin de pginas: La navegacin por la aplicacin se define en el fichero de configuacin de la aplicacin, facesnavigation.xml. Aqu estn las reglas de navegacin definidas para CreateProduct:
<navigation-rule> <from-view-id>*</from-view-id> <navigation-case> <from-outcome>createProduct</from-outcome> <to-view-id>/createProduct.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/createProduct.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/uploadImage.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>retry</from-outcome> <to-view-id>/createProduct.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>cancel</from-outcome> <to-view-id>/productList.jsp</to-view-id>

</navigation-case> </navigation-rule>

Bean de respaldo: El ProductBean no slo contiene los mapeos de propiades a los datos de los componentes UI de la pgina, tambin tiene tres acciones: createAction, editAction, y deleteAction. Aqu est el cdigo para el mtodo createAction():
public String createAction() { try { Product product = ProductBeanBuilder.createProduct(this); //Save the product. this.serviceLocator.getCatalogService().saveProduct(product); //Store the current product id inside the session bean. //For the use of image uploader. FacesUtils.getSessionBean().setCurrentProductId(this.id); //Remove the productList inside the cache. this.logger.debug("remove ProductListBean from cache"); FacesUtils.resetManagedBean(BeanNames.PRODUCT_LIST_BEAN); } catch (DuplicateProductIdException de) { String msg = "Product id already exists"; this.logger.info(msg); FacesUtils.addErrorMessage(msg); return NavigationResults.RETRY; } catch (Exception e) { String msg = "Could not save product"; this.logger.error(msg, e); FacesUtils.addErrorMessage(msg + ": Internal Error"); return NavigationResults.FAILURE; } String msg = "Product with id of " + this.id + " was created successfully."; this.logger.debug(msg); FacesUtils.addInfoMessage(msg); return NavigationResults.SUCCESS; }

Dentro de la accin, se construye un objeto de negocio Product basado en las propiedades de ProductBean. ServiceLocator busca el CatalogService. Finalmente, createProduct pide su delegado al CatalogService, que est en la capa de lgica-de-negocio.

Declaracin del Bean Manejado: El ProductBean se debe configurar en el fichero de configuracin de recursos JSF, facesmanaged-bean.xml:
<managed-bean> <description> Backing bean that contains product information. </description> <managed-bean-name>productBean</managed-bean-name> <managed-bean-class>catalog.view.bean.ProductBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property>

<property-name>id</property-name> <value>#{param.productId}</value> </managed-property> <managed-property> <property-name>serviceLocator</property-name> <value>#{serviceLocatorBean}</value> </managed-property> </managed-bean>

Se configura el ProductBean para tener un mbito de peticin, lo que significa que la implementacin JSF crea un nuevo ejemplar de ProductBean por cada peticin si se ha referenciado dentro de la pgina JSP. La propiedad ID-managed se rellena con el parmetro productId de la peticin. La implementacin JSF obtiene el parmetro desde la peticin y selecciona la propiedad manejada.

Integracin entre las capas de presentacin y de lgica-de-negocio: ServiceLocator abstrae la lgica para localizar los servicios. En la aplicacin de ejemplo, ServiceLocator est definido como un interfae. El interface est implementado como un bean manejado JSF, ServiceLocatorBean, que busca los servicios desde el contexto de aplicacin Spring:
ServletContext context = FacesUtils.getServletContext(); this.appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context); this.catalogService = (CatalogService)this.lookupService(CATALOG_SERVICE_BEAN_NAME); this.userService = (UserService)this.lookupService(USER_SERVICE_BEAN_NAME);

El ServiceLocator est definido como una propiedad dentro de BaseBean. La facilidad de bean manejado de JSF conecta la implementacin del ServiceLocator con aquellos beans manejados que deben acceder a l. Se utiliza la Inversin de Control.

Capa de Lgica-de_Negocio
La tarea de esta capa consiste en definir los objetos de negocio, creando los interfaces de servico con sus implementaciones, y conectndo los objetos con Spring.

Objetos de Negocio: Como Hibernate proporciona la persistencia, los objetos de negocio Product y Category deben proporcionar mtodos get y set para todos sus campos. Servicios de Negocio: El interface CatalogService define todos los servicios relacionados con el control del catlogo:
public interface CatalogService { public Product saveProduct(Product product) throws CatalogException; public void updateProduct(Product product) throws CatalogException; public void deleteProduct(Product product) throws CatalogException; public Product getProduct(String productId) throws CatalogException; public Category getCategory(String categoryId) throws CatalogException; public List getAllProducts() throws CatalogException; public List getAllCategories() throws CatalogException;

} CachedCatalogServiceImpl es la implementacin del interface de servicio, que contiene un mtodo set para un objeto CatalogDao. Spring conecta el CachedCatalogServiceImpl con el objeto CatalogDao. Como estmos condificando para interfaces, no acoplamos fuertemente las

implementaciones.

Configuracin de Spring: Aqu est la configuracin de Spring para CatalogService:


<!-- Hibernate Transaction Manager Definition --> <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> <property name="sessionFactory"><ref local="sessionFactory"/></property> </bean> <!-- Cached Catalog Service Definition --> <bean id="catalogServiceTarget" class="catalog.model.service.impl.CachedCatalogServiceImpl" initmethod="init"> <property name="catalogDao"><ref local="catalogDao"/></property> </bean> <!-- Transactional proxy for the Catalog Service --> <bean id="catalogService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBea n"> <property name="transactionManager"><ref local="transactionManager"/></property> <property name="target"><ref local="catalogServiceTarget"/></property> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>

Se configura el control de transacin declarativo para el CatalogService. CatalogService puede conectarse a una implementacin diferente de CatalogDao. Spring crea y maneja un nico objeto CatalogService y no se necesita una factora. Ahora que la capa de lgica de negocio est lista, conectmosla con la capa de integracin

Integracin entre Spring e Hibernate: Aqu est la configuracin de HibernateSessionFactory:


<!-- Hibernate SessionFactory Definition --> <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> <property name="mappingResources"> <list> <value>catalog/model/businessobject/Product.hbm.xml</value> <value>catalog/model/businessobject/Category.hbm.xml</value> <value>catalog/model/businessobject/User.hbm.xml</value>

</list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> <prop key="hibernate.cache.provider_class">net.sf.hibernate.cache.HashtableCachePro vider</prop> </props> </property> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean> CatalogDao utiliza HibernateTemplate para integrarse entre Hibernate y Spring. Aqu est la configuracin para HibernateTemplate: <!-- Hibernate Template Defintion --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate.HibernateTemplate"> <property name="sessionFactory"><ref bean="sessionFactory"/></property> <property name="jdbcExceptionTranslator"><ref bean="jdbcExceptionTranslator"/></property> </bean>

Capa de Integracin
Hibernate mapea objetos a la base de datos relacional utilizando un fichero de configuracin XML. En JCatalog, Product.hbm.xml expresa el mapeo para el objeto de negocio Product. Se utiliza Category.hbm.xml para el objeto de negocio Category. Los ficheros de configuracin estn en el mismo directorio que los objetos de negocio correspondientes. Aqu est el Product.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping package="catalog.model.businessobject"> <class name="Product" table="product"> <id name="id" column="ID" unsaved-value="null"> <generator class="assigned"/> </id> <property name="name" column="NAME" unique="true" not-null="true"/> <property name="price" column="PRICE"/> <property name="width" column="WIDTH"/> <property name="height" column="height"/> <property name="description" column="description"/> <set name="categoryIds" table="product_category" cascade="all"> <key column="PRODUCT_ID"/> <element column="CATEGORY_ID" type="string"/> </set> </class> </hibernate-mapping> CatalogDao se conecta con HibernateTemplate mediante Spring: <!-- Catalog DAO Definition: Hibernate implementation -->

<bean id="catalogDao" class="catalog.model.dao.hibernate.CatalogDaoHibernateImpl"> <property name="hibernateTemplate"><ref bean="hibernateTemplate"/></property> </bean>

Conclusin
Este tutorial ha mostrado cmo integrar JSF con el marco de trabajo Spring e Hibernate para construir una aplicacin Web del mundo real. La combinacin de estas tres tecnologas proporciona un slido marco de trabajo para el desarrollo de aplicaciones Web. Para este tipo de aplicaciones se debera utilizar una arquitectura multi-capa como arquitectura de alto nivel. JSF se acopla muy bien en el patrn de diseo MVC y se puede utilizar para implementar la capa de presentacin. El marco de trabajo Spring se puede utilizar en la capa de lgica-de-negocio para manejar los objetos de negocio, y porporcionar control de transaciones declarativoo y control de recursos. Spring se integra muy bien con Hibernate. Hibernate es un poderoso marco de trabajo de mapeo O/R y puede proporcionar el mejor servicio dentro de la capa de integracin. Particionando toda la aplicacin Web en capas y programando contra interfaces, se pueden reemplazar las tecnologas usadas para cada capa de la aplicacin. Por ejemplo, Struts puede ocupar el lugar de JSF para la capa de presentacin, y JDO puede reemplazar a Hibernate en la capa de integracin. La integracin entre las capas no es trivial. El uso de la inversin de control y del patrn de diseo Service Locator puede hacerlo ms sencillo. JSF proporciona funcionalidades que no poseen otros marcos de trabajo como Struts. Sin embargo, esto no significa que usted tenga que tirar Struts y empezar a utilizar JSF ahora mismo. Si JSF debe utilizarse o no como marco de trabajo Web para sus aplicaciones, depende del estado de sus proyectos, de los requerimientos funcionales, y de la experiencia de su equipo.

Вам также может понравиться