Ejemplo de aplicaci´ on Java EE 6.

Tienda Web con JPA+EJB+JSF
FJRP – CCIA-2011 Septiembre-2011

´ Indice
1. Descripci´ on de la aplicaci´ on de ejemplo 1.1. Presentaci´ on del ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Pasos previos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Arquitectura de la soluci´ on de ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4. Simplificaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Capa de l´ ogica de aplicaci´ on 2.1. Entidades JPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Enterprise Java Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1. Paquete ejb.dao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.2. Paquete ejb.negocio 3. Capa de presentaci´ on Web 3.1. P´ aginas JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Managed Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Capa de presentaci´ on SWING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 4 5 5 6 6 6 7 7 8 8 9 10

1.
1.1.

Descripci´ on de la aplicaci´ on de ejemplo
Presentaci´ on del ejemplo

Como punto de partida para el desarrollo del proyecto Java EE del curso 2011/12 se aporta como ejemplo una peque˜ na aplicaci´ on para la gesti´ on de una tienda web.

1

1. Los datos manejados por la aplicaci´ on de ejemplo se almacenan en un servidor MySQL. Para desintalar las versiones antiguas. Instalar el entorno de desarrollo Netbeans 7.sql 3.sql) Instalaci´ on: Acceder como administrador de MySQL y crear un usuario scs con password scs $ mysql --user=root --password (pedir´ a el password del administrador.1 y el servidor de aplicaciones GlassFish v3.0.1).jar incluido en Netbeans o descargarlo desde la p´ agina de MySQL.org asegur´ andose de que incluya el servidor de aplicaciones GlassFish.sh en sus respectivos directorios de instalaci´ on (en /home/alumno) 1. por defecto suele ser el password vac´ ıo) mysql> GRANT ALL PRIVILEGES ON *.1. 2 . Descarga: Tablas+datos (ejemplo-JEE.netbeans.1/bin/ne &) 2. La instalaci´ on de Netbeans y Glassfish se hace de forma conjunta quedando Netbeans configurado para usar GlassFish como servidor de aplicaciones por defecto. Instalar la base de datos. mysql> exit Crear la base de datos ejemplo tienda propiedad del usuario scs con la estructura y los datos incluidos en el fichero ejemplo-JEE. mysql> GRANT ALL PRIVILEGES ON *. tanto de Netbeans como de GlassFish. adem´ as del alta de clientes.XX-bin. aunque se perder´ an los accesos directos del men´ u y habr´ a que lanzar Netbeans desde l´ ınea de comandos ($ /home/alumno/netbeans-7. Se puede usar el fichero mysql-connector-java-5.0.0. Se puede descargar la u ´ltima versi´ on de Netbeans en http://www.2. ambas cuentan con un un script bash unsintall. Se incluyen 2 capas de presentaci´ on diferentes: Una capa de presentaci´ on Web basada en JSF (Java Server Faces ) encargada fundamentalmente de la interacci´ on de los compradores.* TO ’scs’@’localhost’ IDENTIFIED BY ’scs’ WITH GRANT OPTION.Se trata de una aplicaci´ on Java EE 6 Cuenta una capa de aplicaci´ on (o negocio) implementada con componentes EJB (Enterprise Java Bean ) que hace uso de JPA (Java Persistence API ) como mecanismo de mapeo Objeto/Relacional para proveer de una capa de acceso a la base de datos.1 Tambi´ en se puede optar por borrar los directorios de instalaci´ on sin m´ as. que da soporte a los casos de uso relacionados con la navegaci´ on a trav´ es del cat´ alogo de la tienda y la confecci´ on de pedidos de compra. Pasos previos Es recomendable trabajar con una versi´ on de Netbeans lo m´ as reciente posible (actualmente Netbeans 7. Una capa de presentaci´ on consistente en una aplicaci´ on de escritorio SWING simplificada encargada de los casos de uso relacionados con el mantenimiento del cat´ alogo de la tienda Web (familias y productos) y la gesti´ on de los pedidos recibidos.1.* TO ’scs’@’%’ IDENTIFIED BY ’scs’ WITH GRANT OPTION. Antes de desplegar y ejecutar la aplicaci´ on es necesario incluir en el servidor de aplicaciones el conector JDBC de MySQL.sql $ mysql --user=scs --password=scs < ejemplo-JEE. En el laboratorio no se requieren permisos de administrador para instalarlo y deber´ ıa ser posible mantener a la vez la versi´ on existente junto con la nueva.

1/ide/modules/ext/mysql-connector-java-5.jar.XX-bin. Es necesario seleccionar la opci´ on Open Requierd Projects en la opci´ on Open Project antes de abrirlo o en el men´ u contextual del proyecto una vez abierto ([bot´ on derecho] → Open Requierd Projects ). 3 .$ cp /home/alumno/netbeans-7.war y/o .jar • Para EjemploTiendaWeb-war se crea dist/EjemploTiendaWeb-war.tar.1.gz $ tar xzvf EjemploTiendaWeb.gz Al abrir el proyecto EjemploTiendaWeb se carga s´ olo el proyecto principal.1/bin/asadmin start-domain Para ejecutar la aplicacion: sobre el proyecto principal [bot´ on derecho] → Run (en este caso se lanzar´ a el navegador web por defecto para mostrar la p´ agina principal del proyecto EjemploTiendaWebwar ) • En este caso la aplicaci´ on web ser´ a accesible en la URL: http://localhost:8080/EjemploTiendaWeb-war/ Desde la pesta˜ na services de Netbeans se puede manejar el servidor de aplicaciones GlassFish (Servers →GlassFish v3 domain : iniciar. aparecer´ an 2 subproyectos: EjemploTiendaWeb-ejb : m´ odulo EJB con la definici´ on de las entidades JPA y los EJBs de la aplicaci´ on EjemploTiendaWeb-war : p´ aginas JSF y Managed Beans que conforma el interfaz web de la tienda virtual En caso de que Netbeans informe del error.1 de GlassFish. despliegue y ejecuci´ on.1. En ocasiones durante la depuraci´ on ser´ a necesario cancelar el despliegue de una aplicaci´ on (opci´ on undeploy sobre la aplicaci´ on concreta) Tambi´ en se puede acceder a la consola de GlassFish desde un navegador web con la url: http://localhost:4848 Desde la opci´ on Despliegue dela consola web de GlassFish se pueden desplegar los ficheros .tar. se deber´ a especificar el servidor de aplicaciones a utilizar.1.0.jar \ /home/alumno/glassfish-3. . 5.ear que agrupa a los dos anteriores Para desplegar la aplicaci´ on: sobre el proyecto principal [bot´ on derecho] → Deploy • En caso de que el servidor GlassFish no estuviera arrancado se iniciar´ a al hacer el primer despliegue • Se puede arrancar GlassFish desde linea de comandos /home/alumno/glassfish-3. en este caso la versi´ on 3. recargar) y ver la lista de aplicaciones deplegadas. parar. Se deber´ a abrir el proyecto Descarga: ejemploTiendaWeb. Compilaci´ on. Abrir la aplicaci´ on en Netbeans La aplicaci´ on Java EE de ejemplo est´ a conformada por tres proyectos Netbeans: Un proyecto de tipo Java EE → EJB Module Un proyecto de tipo Java Web → Web Application Un proyecto SWING (pendiente de incluir) Los dos primeros est´ an agrupados en un proyecto Java EE → Enterprise Application y se desplar´ an juntos en el servidor de aplicaciones.war • Para EjemploTiendaWeb se crea EjemploTiendaWeb.1/glassfish/domains/domain1/lib/ 4. • En los respectivos directorios dist de cada proyecto se generar´ an los ficheros que empaquetan los componentes de la aplicaci´ on y que se deber´ a desplegar en el servisdor GlassFish • Para EjemploTiendaWeb-ejb se crea dist/EjemploTiendaWeb-ejb. Para compilar la aplicaci´ on basta seleccionar la opci´ on Clean and Build del proyecto principal ([bot´ on derecho] → Clean and Build ).ear de las aplicaciones Java EE.

Tanto la capa de presentaci´ on web basada en JSF como la aplicaci´ on de escritorio SWING no implementan ning´ un tipo de l´ ogica de aplicaci´ on. Toda la l´ ogica de la aplicaci´ on necesaria para implementar los caso de uso del ejemplo es responsabilidad de los componentes EJB incluidos en el subproyecto EjemploTienda-ejb. Arquitectura de la soluci´ on de ejemplo El ejemplo de aplicaci´ on Java EE 6 sigue un esquema de cliente ligero estricto. perfilCliente. esta arquitectura tan estricta puede ser un poco excesiva y en el caso de que s´ olo se hubieran incluido clientes web se podr´ ıa hacer conseguido la misma funcionalidad 4 controlador PedidoControlador vistas FamiliaBussinesDelegate JFrameDetalleProducto JFrameDetallePedido RMI/IIOP ProductoDAO FamiliaDAO entidades Producto Familia Faces servlet Pedido Cliente LineaPedido .xhtml controladores Páginas JSF CompraService Usuario GenéricoDAO ClienteDAO UsuarioDAO PedidoDAO ejb.1. limit´ andose a mostar datos al usuario y a capturar y validar las entradas recibidas.xml ejb.dao facesConfig.xhtml pedidoCompletado.xhtml carroCompra.xhtml productos.negocio PedidoBussinesDelegate JFrameDetalleFamilia ServiceLocator CONTENEDOR EJBs (pendiente) Aplicación SWING JFramePrincipal JFrameProductos JFramePedidos modelo ProductoBussinesDelegate ProductoControlador FamiliaControlador En este caso.xhtml CatálogoController BaseController UsuarioController CatálogoService Base de Datos CarroCompraController GestorUsuariosService login.xhtml CONTENEDOR WEB detalleProducto. al tratarse de una aplicaci´ on sencilla.3.

Simplificaciones En la capa de negocio se han definido las Entidades JPA y a partir de ellas se generaron las tablas MySQL (usando los tipos y tama˜ nos por defecto de cada campo) • Ver el fichero de configuraci´ on persistence.jasypt.org/ el tutorial How to encrypt user passwords En la presentaci´ on de los datos en la aplicaci´ on web se ha omitido. no el acceso remoto sobre RMI/IIOP desde otras JVMs. En la base de datos y en la capa web (tambi´ en en la capa EJB) los passwords de los usuarios se almacenan y manejan en claro en forma de strings. En la capa de negocio se ha utilizado un EJB con estado (@Stateful) para implementar el carro de la compra de cada cliente. • Por razones de seguridad lo habitual es almacenar un hash (MD5. • Ver la librer´ ıa Java Simplified Encryptionhttp://www. SHA-1) del password y no el password en si.4.trabajando exclusivamente en el contenedor de Servlet. por lo que las acciones comunes y sus reglas de navegaci´ on se repiten en casi todas las p´ aginas. por simplicidad. Nota: La versi´ on 3. crear las entidades JPA mapeando tablas relacionales ya existentes. aunque s´ olo permite el acceso local desde la JVM donde se ejecuta el servidor de aplicaciones. 1. En este caso. Lo deseable ser´ ıa contar con un esquema de paginaci´ on que evite el tr´ afico de grandes vol´ umenes de datos y facilite la navegaci´ on. etc) Las funcionalidades de la capa web se han limitado al m´ aximo para evitar complicar en exceso el ejemplo. 2. para mostrar un ejemplo de uso de estos EJBs. En la capa web se usan los componentes de validaci´ on de entrada est´ andar incluidos en JSF 2. En la capa web todas las p´ aginas siguen la misma plantilla. El esquema ideal hubiera sido delegar completamente la maquetaci´ on a las hojas de estilos CSS. con JSF y los Managed Beans. la raz´ on de incluir una capa de EJBs (y por lo tanto exigir un servidor de aplicaciones JEE completo) es la de permitir el acceso remoto desde la aplicaci´ on SWING.0 (rangos. • En este caso se ha hecho as´ ı por motivos didacticos. • Lo m´ as sencillo hubiera sido gestionar el carro de la compra dentro de los ManagedBeans de sesi´ on de la capa web.1 de la especificaci´ on EJB (incluida en la futura especificaci´ on Java EE 6) contempla la posibilidad de incluir componentes EJBs en la capa web. la paginaci´ on de los resultados.xml en el subproyecto EjemploTiendaWeb-ejb • En un entorno real lo m´ as habitial ser´ a el caso contrario. fechas. Capa de l´ ogica de aplicaci´ on El proyecto EjemploTiendaWeb-ejb contiene la definici´ on de las Entidades JPA responsables del mapeo Objeto/Relacional de la base de datos y los EJBs responsable de implementar la l´ ogica de los casos de uso de la aplicaci´ on. 5 . por lo que en algunos aspectos (como la gesti´ on de los elementos del carro de la compra) el interfaz de usuario no es todo lo c´ omodo y funcional que debiera. dejando que todas las operaciones realizadas por los EJB fueran sin estado. Se ha usado una hoja de estilo CSS gen´ erica aplicando modificadores de estilo en componentes puntuales.

la capa de l´ ogica de aplicaci´ on sigue la arquitectura descrita en el art´ ıculo Lean SOA with Java EE 6 Los EJBs de ambos paquetes implementan de forma aproximada el patr´ on Session Facade. lo que significa que las lineas de pedido no se carga desde la base de datos hasta que se pretenda acceder a ellas. Todas las entidades (≡ tuplas) est´ an identificadas por atributos num´ ericos gestionados por MySQL (campos autoincrementales). estado) Tiene una relaci´ on N:1 (@ManyToOne ) con Cliente Tiene una relaci´ on 1:N (@OneToMany ) con LineaPedido El acceso a las LineasPedido desde Pedido es de tipo (fetch=FetchType. De modo general. etc).1. Almacena la informaci´ on de una l´ ınea de un pedido.1.) sobre el lado 1 (Pedido) se propagan en cascada al lado N (LineaPedido) (cascade=CascadeType.1. Almacena los datos personales de los usuarios de tipo cliente. Pedido. Entidades Usuario. no las l´ ıneas de detalle. Almacena la informaci´ on de los pedidos (fecha. tipo. creaci´ on. password. Almacena los datos de los productos que conforman el cat´ alogo de la tienda. Almacena las descripciones de las familias de productos consideradas en el cat´ alogo de la tienda. Tiene una relaci´ on N:1 (@ManyToOne ) con el Pedido del que forma parte Tiene una relaci´ on N:1 (@ManyToOne ) con Producto 2. actualizaci´ on.negocio). no se utilizan atributos de las entidades como identificadores (NIF.. fecha de u ´ltimo acceso). Almacena los datos de los usaurios del sistema (login. .. 6 . • Para ”cargar” las lineas de un pedido es necesario acceder a la lista de LineaPedido (m´ etodo getLineas() ) (as´ ı se hace cuando se pide un Pedido con un ID concreto en el EJB PedidosDAO ) Todas operaciones (borrado. Se usa principalmente para el control de accesos. ofreciendo a los clientes locales o remotos un interfaz de acceso a la l´ ogica de la aplicaci´ on.dao. ejb. junto con las enumeraciones TipoUsuario y EstadoPedido.LAZY ). Enterprise Java Beans Los EJB que conforman la capa modelo y son responsables de la l´ ogica de la aplicaci´ on se reparten en dos paquetes (ejb. • Se hace as´ ı para evitar un n´ umero de consultas y un tr´ afico excesivo cuando se hacen consultas donde se devuelva multitud de pedidos. cliente. • Las b´ usquedas de pedidos devolver´ an s´ olo la ”cabecera” del pedido. Tiene una relaci´ on 1:1(@OneToOne ) con Usuario Producto.2. En ambos caso se ofrece tanto un interfaz local (usado por la aplicaci´ on Web JSF) como un interfaz remoto (usado por la aplicaci´ on de escritorio SWING).ALL) LineaPedido. 2. fecha de alta. Cliente. Tiene una relaci´ on N:1 (@ManyToOne ) con Familia Familia. Entidades JPA El paquete entidades contiene la definci´ on de las clases Entidad del ejemplo.2.

dao contiene EJB orientados principalmente a dar soporte a los casos de uso t´ ıpicos en las tareas de mantenimiento de una Base de Datos (operaciones CRUD [create. update.. Operaciones sobre Usuarios. Operaciones b´ asicas sobre las entidades (independientes de la Entidad concreta) UsuarioDAO. incluida la b´ usqueda por familia. PedidoDAO. El paquete ejb. A˜ nade diversos tipos y criterios de b´ usqueda. que oculta las tecnolog´ ıas y el modo de acceso a los datos.2.2. A˜ nade diversos tipos y criterios de b´ usqueda. Operaciones sobre Clientes. A˜ nade diversos tipos y criterios de b´ usqueda. Hay un tercer paquete (ejb. En este caso se implementa un patr´ on Service Facade puro. delete ]: acceso.dao.java ´ o XxxxServiceRemote. En ambos casos se ha seguido la misma convenci´ on de nombrado: • XxxxDAO. FamiliaDAO.dao provee de EJBs para implementar las operaciones b´ asicas sobre las entidades que componenen la aplicaci´ on (con la excepci´ on de la entidad LineaPedido que es gestionada por el EJB PedidoDAO ). en este caso. De esta clase gen´ erica (junto con el respectico interfaz gen˜ nerico) heredan los dem´ as EJBs (y sus interfaces local y remoto). a˜ nadiendo nuevas operaciones.java ´ o XxxxServiceLocal. 2. altas. Salvo CarroCompraService todos son EJB sin estado (@Stateless ).excepciones) con la definici´ on de las excepciones generadas por la capa modelo: ExcepcionEntidad (error en el acceso a una entidad de la B. ProductoDAO. En general proveen de operaciones de mayor complejidad que las del paquete ejb. En esta caso se ha definido un DAO gen´ erico (GenericoDAO [implementaci´ on] y GenericoDAOInterface [inetrface]) con las 4 operaciones b´ asicas (crear. El paquete ejb. Incluye operaciones de autenticaci´ on y comprobaci´ on de privilegios. que marca un pedido como anulado y reincorpora las candidades pedidas a las existencias de los productos devueltos. La funcionalidad ofrecida por este conjunto de EJB se coresponde de un modo gen´ erico con el patr´ on DAO (Data Access Object). actualizar y borrar). Paquete ejb. delegando.java ´ o XxxxService. bajas y modificiaciones). 7 . aunque no suele ser lo habitual. uso de un ID que no existe.java: Interfaz local del EJB (@Local ) • XxxxDAORemote. Operaciones sobre Pedidos (e implicitamente sobre LineaPedido).D. ClienteDAO. read.La distinci´ on entre ambos paquetes se debe a su orientaci´ on.negocio En este paquete se incluyen EJBs que implementan caso de uso espec´ ıficos de la aplicaci´ on.negocio ofrece soporte a casos de uso un poco m´ as espec´ ıficos de de m´ as alto nivel que hacen uso los EJBs del anterior paquete. GenericoDAO. las operaciones concretas en el EntityManager de JPA. usualmente operaciones de b´ usqueda espec´ ıficas. ExcepcionExistencias (intento de servir un producto del que no hay stock disponible) 2. Operaciones sobre Familias. responsabiliz´ andose de coordinar las invocaciones de otros EJBs encargados del manejo de datos. Paquete ejb.1. inserci´ on de un ID repetido. etc). A˜ nade diversos tipos y criterios de b´ usqueda y la operaci´ on anularPedido(). Operaciones sobre Productos.java: Clase de implementaci´ on del EJB (@Stateless o @Stateful ) • XxxxDAOLocal. buscar por ID.java: Interfaz remoto del EJB (@Remote ) Por simplicidad ambas interfaces (local y remota) coinciden.dao El paquete ejb.2.

y modificaci´ on de los datos del cliente) 3. Fichero faces-config.0). Nota: No es estrictamente necesario utilizar un EJB con estado en este caso (adem´ as de ser poco escalables). Se ha empleado Facelets como tecnolog´ ıa para la definici´ on de las vistas en lugar de p´ aginas JSP(Java Server Pages ). Define las reglas de navegaci´ on que en conjunci´ on con los valores de retornod de los m´ etodos de acci´ on de estos Managed Beans determinan el flujo entre las p´ aginas JSF. EJB sin estado responsable de la gesti´ on del cat´ alogo de productos. Delega sus tareas en los EJBs ProductoDAO y FamiliaDAO CompraService.xhtml. realizando b´ usquedas de productos y familias bajo diversos criterios. 3. Todas las p´ aginas tienen 4 secciones: encabezado. ver carrito. Managed Beans : clases Java que proveen los datos a presentar en las p´ aginas JSF y los m´ etodos invocados por las acciones desencadenas por los eventos de la p´ agina JSF. Las responsibilidades de la capa web basada en JSF se distribuyen entre tres componentes: P´ aginas JSF: ficheros XHTML (en el caso de emplear Facelets) donde se define la disposici´ on y propiedades de los componentes JSF de la presentaci´ on web.CatalogoService. ver/editar perfil) • La comuna izquierda se define en plantillas/vistaIzquierda. junto con le alta de su respectivo Usuario.xhtml conforme a la sintaxis de los Facelets ). Contiene un mensaje de presentaci´ on y bienvenida y enlaces para desencadenar las acciones b´ asicas del ususario (login. Capa de presentaci´ on Web La capa de presentaci´ on Web se ha implementado utilizando el framework JSF(Java Server Faces 2. EJB sin estado resposable de la autenticaci´ on y de la gesti´ on de usuarios y clientes (creaci´ on de nuevos Clientes. GestorUsuariosService.0 y por la facilidaes que ofrece para definir y manejar plantillas. Mantiene la lista de ProductoCompra de cada cliente donde se asocia el Producto y la cantidad comprada Verifica la disponibilidad de los productos pedidos Genera el Pedido (junto con las LineaPedido correspondientes) una vez que se confirma la compra.xml: define los Managed Beans que conforman la aplicaci´ on JSF y su alcance (sesi´ on.xhtml. contiene u ´nicamente un mensaje. se incluye para mostar su uso.1. petici´ on. Contiene cajas de b´ usqueda y una lista de familias con enlaces para que el usuario navege a trav´ es del cat´ alogo de productos. aplicaci´ on). registro. P´ aginas JSF Todas las p´ aginas JSF que conforman la aplicaci´ on comparten la misma plantilla (definida en el fichero plantillas/plantillaGeneral. en primer lugar por ser la tecnolog´ ıa por defecto para JSF 2. contenido y pie de p´ agina El encabezado y la columna izquierda es com´ un a todas las p´ aginas • El encabezado se define en plantillas/vistaCabecera. columna izquierda. logout. EJB con estado responsable de la gesti´ on del carro de la compra de un cliente. 8 . El pi´ e de p´ agina es fijo.

xhtml: p´ agina de login 3. Todos los Managed Beans heredan de la clase BaseController que ofrece una serie de funcionalidades b´ asicas comunes a todos los controladores: Acceso a los par´ ametros de las peticiones HTTP Inserci´ on de mensajes de error en el ´ arbol de componentes de la p´ agina JSF (mediante el FacesContext ) Managed Beans de la capa web del ejemplo CatalogoController. por lo que sus atributos estar´ an disponibles mientras dure la sesi´ on del usuario (o hasta que esta caduque). • Delegan en los EJBs las operaciones de acceso a datos y las responsables de implementar los casos de uso de la aplicaci´ on. El seguimiento de la sesi´ on es responsabilidad del servlet JSF. Managed Beans En el ejemplo se definen tres Managed Beans dentro del paquete controladores. bien para darlo de alta (registro) o para que ´ el modifique su perfil login.xhtml: presenta una tabla con la lista de productos detalleProducto.xhtml: presenta los detalles del producto seleccionado carroCompra. productos. Los Managed Beans de la aplicaci´ on de ejemplo delegan toda su funcionalidad en los EJBs de la capa de aplicaci´ on (subproyecto EjemploTiendaWeb-ejb ) por lo que sus u ´nicas funciones estan relacionadas con la gesti´ on de las interacciones derivadas de la acci´ on del usuario: Hacer disponibles los datos a mostar. 9 .negocio. presentaci´ on de detalles del producto) Mantiene un lista de las Familias disponibles y la lista de Productos que encajan con los criterios de b´ usqueda actuales Mantiene una referencia al Producto seleccionado actualmente Delega sus operaciones en el EJB ejb.xhtml: presenta la lista de productos incluidos en la compra de un usuario y permite modificarla y/o confirmarla para generar el correspondiente pedido perfilCliente. navegaci´ on por familias. Ofrecer los m´ etodos encargados de gestionar los eventos generados por los compoenentes JSF de la aplicaci´ on. el programador simplemente debede declarar el tipo de alcance. Gestiona las interacciones relacionadas con el cat´ alodo de productos de la tienda (b´ usqueda de productos.xhtml: presenta los datos de un cliente.Cada una de las p´ aginas JSF que componen la aplicaci´ on define su propia zona de contenido. Gestiona las interacciones relacionadas con el mantenimiento del carro de la compra del cliente.CatalogoService CarroCompraController. • Determinan el flujo entre p´ aginas JSF mediante los valores de retorno (String) de los manejadore de las acciones (enlaces y botones) desencadenadas por el usaurio. Todos ellos tienen alcance de sesi´ on (@SessionScoped ). que a su vez se obtendr´ an de los EJBs Mantener los datos introducidos por el usuario durante su interacci´ on con la aplicaci´ on.2.

En los m´ etodos de los Managed Benas vinculados a acciones de las p´ aginas JSF (atributo action en enlaces [h:commandLink] y botones [h:commandButton]) se ha seguido la convenci´ on de que sus nombres comiencen por el prefijo do.doLogin() catalogoController.negocio. objeto Usuario) Mantiene los datos del cliente actual una vez que este haya hecho login satisfactoriamente o que se haya registrado como nuevo usuario. 4. Delega sus operaciones en el EJB ejb. Por ejemplo: usuarioController.Delega sus operaciones en el EJB ejb.CompraService Gestiona la adici´ on y eliminaci´ on de productos al carro de la compra del usuario y la generaci´ on del pedido definitivo.GestorUsuariosService Mantiene los datos relacionados con la autenticaci´ on del usuario (login. Gestiona las interacciones relacionadas con la autenticaci´ on de usuarios y la gesti´ on del perfil del cliente.doBusquedaDescripcion()) etc.doCrearUsuario() usuarioController. UsuarioController.modelo.. password... Capa de presentaci´ on SWING (pendiente de completar) 10 .