Você está na página 1de 12

Integracin de EJB3 y JSF

Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

Hace un tiempo que sali la versin final de JEE 5, versin que ha traido grandes cambios a la plataforma Java con respecto a la versin anterior. Se ha intentado hacer la plataforma ms accesible a los programadores facilitando el desarrollo de las aplicaciones empresariales Java, y tomando como base la configuracin por defecto, que tan buenos resultados parece haber generado a la plataforma Ruby on Rails.

A pesar del esfuerzo realizado por el grupo de expertos encargado de definir las especificaciones que forman parte de JEE por simplificar el desarrollo de aplicaciones JEE, hay que tener en cuenta que JEE se trata de una plataforma compleja, alrededor de la cual se concentran usa serie de APIs y de conceptos, y que sin un conocimiento medio de stos ser difcil sacar el mximo partido a JEE, por lo que aunque a primera vista parezca sencillo el desarrollo de aplicaciones tendremos que intentar conocer al mximo todo aquello que se mueve a su alrededor si queremos sacar rendimiento a JEE.

En este artculo/tutorial voy a intentar mostrar cmo desarrollar un prototipo de aplicacin en la que integramos dos tecnologas que forman parte de esta renovada plataforma, EJB3 y Java Server Faces. Para ello voy a utilizar NetBeans 5.5, cuyo equipo tambin ha realizado grandes esfuerzos por simplificar al mximo el desarrollo de aplicaciones JEE con este IDE. La aplicacin (si es que la podemos llamar as ) que vamos a desarrollar no podra ser ms trivial, y simplemente se encarga de mostrar un listado de los clientes dados de alta en una base de datos, y da la opcin de creacin de nuevo clientes.

Persistencia
En NetBeans 5.5 tenemos integrado el servidor de aplicaciones open source Glassfish, y ste, a su vez, integra el motor de base de datos open source Derby. Glasshfish tiene configurado va JNDI un acceso a esta base de datos con el nombre jdbc/__default, que es el que vamos a utilizar para desarrollar este proyecto.

JPA es el nuevo framework de persistencia de Java, y se basa en gran medida en la solucin open source ms popular de persistencia que hasta ahora hemos tenido, Hibernate. JPA podemos utilizarlo tanto desarrollando con JEE como con JSE, lo cual supone un gran avance con respecto a cmo se controlaba la persistencia en la versin anterior de J2EE. Cualquier programador que haya trabajado con Hibernate no tendr ningn problema en utilizar JPA debido a su gran similitud.

1 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

Iniciando un nuevo proyecto


Para comenzar un nuevo proyecto JEE con NetBeans vamos seleccionar la opcin de men File -> New Project. En la parte izquierda de la nueva ventana seleccionaremos Entreprise y a continuacin Enterprise Application. Se nos mostrar un nuevo asistente que deberemos configurar del siguiente modo :

Pulsamos Finish y NetBeans nos va a crear toda la estructura bsica de nuestra aplicacin. Nos crear un directorio global para el proyecto, y dentro de ste, entre otros, habr un directorio para el mdulo EJB y otro para el mdulo Web.

En primer lugar vamos a crear una entidad, que se llamar Cliente. Posteriormente crearemos un Stateless Session Bean para gestionar las posibles operaciones que queramos realizar sobre la entidad Cliente. Con esto ya tendremos configurado nuestro mdulo EJB. Dentro de nuestro mdulo web implementaremos un Managed Bean que utilizar el Stateless Session Bean tanto para listar como para crear clientes, y crearemos dos pginas web, una para listar los clientes y otra para crear nuevos clientes.

Desarrollando el mdulo EJB


Entidades

El primer paso es crear una nueva entidad. Java necesita un objeto especial para trabajar con entidades, EntityManager, el cual necesita un fichero de configuracin llamado persistence.xml, y en el cul se configura la conexin a la base de datos. Por lo tanto, cuando creemos a travs de NetBeans una entidad, si no se encuentra el fichero persistence.xml NetBeans nos propondr la creacin del mismo.

Para crear la entidad vamos a hacer click con el botn derecho sobre el mdulo EJB GestionClientes-EJBModule, y vamos a seleccionar la opcin de men New -> File/Folder.

2 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

Seleccionamos la categora Persistence, y en la lista de la derecha hacemos click sobre Entity Class.

Tenemos un nuevo asistente en el que configuraremos el nombre y el paquete de nuestra entidad. En este asistente, una vez hayamos proporcionado el nombre tanto de la entidad como del paquete, nos aparecer un nuevo botn ( Create Persistence Unit ) en la parte inferior del mismo a travs del cual podremos crear el fichero persistence.xml.

El asistente para la creacin de la entidad nos quedar del siguiente modo :

Y el asistente para la creacin de nuestro fichero persistence.xml nos quedar as :

El Datasource que utilizamos para almacenar nuestras entidades es el que nos propone NetBeans por defecto, que como comentamos anteriormente es un Datasource que viene configurado de serie en Glassfish y hace referencia a una base de datos Derby.

No es necesario que creemos nosotros las tablas manualmente, ya que el nuevo framework de persistencia de Java JPA podemos configurarlo para que cree las tablas en nuestra base de datos a partir de nuestras entidades.

3 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

En posteriores artculos intentar explicar cmo configurar persistence.xml para que almacene nuestros datos en una base de datos MySQL que ya tengamos nosotros creada.

Pulsamos aceptar a los dos asistentes que tenemos abiertos, y modificamos nuestra clase Cliente para implementarla del siguiente modo : package org.monteagudo.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; /** * * @author jlm */ @Entity public class Cliente { private Long id; private String nombre; private String apellidos; private String direccion; /** Creates a new instance of Cliente */ public Cliente() { } @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getNombre() { return nombre; }

4 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

public void setNombre(String nombre) { this.nombre = nombre; } public String getApellidos() { return apellidos; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } public String getDireccion() { return direccion; } public void setDireccion(String direccion) { this.direccion = direccion; } } Stateless Session Bean Vamos a crear un Stateless Session Bean para poder hacer operaciones sobre la entidad Cliente. Para crear el bean vamos a hacer click con el botn derecho sobre el mdulo EJB GestionClientes-EJBModule, y vamos a seleccionar la opcin de men New -> File/Folder. Seleccionamos la categora Enterprise, y en la lista de la derecha hacemos click sobre Session Bean.

Nos aparece un nuevo asistente para configurar el bean. Lo rellenaremos para que nos quede del siguiente modo :

5 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

Sessionclientes, es vemos bean una ser un Remote, sin estado, por ello enes decir, el nuevosvael Finish, evidente que va a interfazManaged para o implementa una para crear Como no necesitamos Stateless.va a ejecutar va implcitamente en misma JVM,ser lo clase que se nuestro estado creado bean ambas.: web,seleccionamos cliente principal unanuestro queaNetBeansbean ha tanto Locallistar clientes como ejecucin. El ninguna,Type elegimos vamospodemos elegir localel serBeanservidor de Si no de interfaza Local. En el campo pordeyque generar seleccionar que nuestro dosdel mduloaplicaciones, y en la Create Interface Pulsamosa contenedor almacenar ningn nos en a mismo ficherostiempo el campo

queinterfazquedar definidobean deServicioClientes que Local ( si no ServicioClientesLocal es implementada por nuestro enterprise bean. lleva anotacin se asume ServicioClientesBean es definidaforcliente);una dichobean.implementa la lgica de negocio, y ), que import interfaceaServicioClientesLocal conmodoanotacin /**This java.util.List; interface este este modo : *package org.monteagudo.service; otro is List<Cliente> */ public voidbean class el de @LocalLocal business 23:15:44ServicioClientesBean enterprise bean. public classjlm y quedar for the propiamente ServicioClientesLocal { }Laeles javax.ejb.Local; listarClientes(); { Y @PersistenceContext una interfaz bean vacrearCliente(Cliente package org.monteagudo.service; import org.monteagudo.entity.Cliente; { javax.persistence.EntityManager; javax.persistence.PersistenceContext; : javax.persistence.Query; org.monteagudo.entity.Cliente; /**This java.util.List; em.createQuery("SELECT c FROM Cliente AS al bean como sin estado. is the bean */ anotacinquery hacer anotado anotacin @Stateless()el ya em; de vatambinde para{mdulo. lofichero persistence.xml. Este poder sibotn public javax.ejb.*;tendramos Build implements PersistenceContext.Para comprobarfichero esde EntityManager public the problema un es configuramos } Querymdulo est return query.getResultList(); }* CreatedestocrearCliente(Clienteladeavezclases objetos de tipo EntityManager. a con elrealizar operaciones PersistenceContext. comoes definidas EntityManagera seleccionar si travs la @authorelServicioClientesBean pero seleccionarelelque nuestra c"); acceder a 16-jul-2006 EJB, JNDI,Una las crear que hemos Build Project, anteriormente ha que todoelestos objetoscon algunacliente) recomendado ello definido. ya vamos creamosqueentidad todas aplicaciones este tenemoslamdulo EJB. aplicacin. Podramos Otrautilizapodemosimportanteimplementado nuestroPara inyectar elCuandoas veremos ido el en identifica habido algn servidor derecho voidsobre Cliente y vamos todo em.persist(cliente); nuestras entidades Con caracterstica=del listarClientes() Stateless, opcin vamos EntityManager a ha bienla Vemos List<Cliente>

Desarrollando el mdulo Web

Antes de comenzar a definir nuestro Managed Bean y nuestras pginas JSF, vamos a configurar un par de cosas en el mdulo web.

La primera de ellas va a ser indicar a NetBeans que queremos utilizar JSF. Para ello vamos a hacer click con el botn derecho sobre el mdulo web GestionClientes-WebModule, y pulsaremos la opcin Properties. En la lista de categoras vamos a seleccionar Frameworks, pulsamos sobre el botn Add y seleccionamos Java Server Faces. Aceptamos, y podremos comprobar que NetBeans, por una parte ha creado el fichero de configuracin de JSF, faces-config.xml, y por otra parte ha modificado el fichero web.xml para agregar opciones de configuracin de JSF.

La segunda tarea que vamos a realizar a nuestro mdulo web va a ser decirle que queremos utilizar las clases que hemos desarrollado en el mdulo EJB. Para ello vamos a hacer de nuevo click con el botn derecho sobre el mdulo web GestionClientes-WebModule, y pulsaremos la opcin Properties. Seleccionamos Libaries y hacemos click al botn Add Project. Seleccionamos GestionClientes-ejb y pulsamos Add Project JAR Files, y despus aceptamos.

Ahora ya podemos crear nuestro Managed Bean

6 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

Managed Bean

Hacemos click con el botn derecho sobre el mdulo web GestionClientes-WebModule y seleccionamos New -> File / Folder. Nos vamos a la categora web y pulsamos sobre JSF Managed Bean. Nos aparece un asistente para la configuracin del Managed Bean, el cul debemos configurarlo del siguiente modo :

El asistente nos crea una plantilla del bean, el cul modificaremos para implementarlo as : package org.monteagudo.web; import java.util.List; import javax.ejb.EJB; import org.monteagudo.entity.Cliente; import org.monteagudo.service.ServicioClientesLocal; /** * * @author jlm */ public class ClientesManagedBean { private Cliente cliente = new Cliente(); @EJB ServicioClientesLocal servicioClientes; public Cliente getCliente() { return cliente;

7 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

} public void setCliente(Cliente cliente) { this.cliente = cliente; } public List<Cliente> getClientes() { return servicioClientes.listarClientes(); } public String crearCliente() { servicioClientes.crearCliente(cliente); return "success"; } } Como vemos, podemos inyectar al managed bean un EJB que hemos desarrollado anteriormente en el mdulo EJB. Desde entonces podemos utilizar la interfaz como cualquier otra clase dentro del managed bean para crear nuevos clientes y para listar clientes ya existentes.

Pginas JSF Uno de los ltimos pasos que nos queda por realizar es desarrollar dos pginas JSP, as como configurar el fichero faces-config.xml.

Vamos a crear una pgina que nos va permitir listar todos los clientes existentes en la base de datos. Hacemos click con el botn derecho sobre el mdulo web GestionClientes-WebModule y seleccionamos New -> File / Folder. Nos vamos a la categora web y pulsamos sobre JSP. Nos aparece un asistente para la configuracin del JSP en el que nicamente vamos a indicar el nombre de la pgina web :

8 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

: Navegamos a agregarlos manualmente. consultarlos de forma tiene de los los taglib de de los tags, por la a ver dnde podemoshasta puede resultar un poco menos rpida. JSF. Vamosvamos ventana de que nos Como los NetBeans no ms oincluidastag libraries uri Como podemos ver, la plantillaproyectosha creado ficheros descriptoresdifcil acordarse del (tld)

las IDE doble-click representar, Table y necesitamos, nosla Window que nos Hacemos a partirde una agregarylas encontraremos de etiquetascrearcdigo y la el: la sobre El devuelve queremos tabla. los taglibs que arrastramos a Bean vez podemoslapara JSF tldaparece unala JSF.de men Managed una nosJSF para queremosla los el declientes. un objeto java.util.List. mtodo deldebsica -> tablauri,que son seleccionamos clientes. NetBeansyahtaglibsasistente las vamossiguienteunanoparte EnEntity en el todosmostrar definidosel Dataofrece lo rellenaremospaleta zonashort-nameen permite crear unaque utilizaremosmostrarla seleccionandoparte elSi la controlesa controlesPalette. apareciera listartabla tenemoscontrol deNosasistente unlodeopcinqueconla solicita por informacin que paleta Una que lista por otra paleta de Bean que nos

modificaremos paradevalue="#{ClientesManagedBean.clientes}" Finalmente tabla con toda laobservar, el asistente a ha encargado de charset=UTF-8"> Como<metacontentType="text/html"%>senuestra prefix="c"%> var="item"> la pgina la podemos informacin la siguiente de Clientes"/></h1> <%@page pageEncoding="UTF-8"%> content="text/html; generarnos de forma automtica la <%@taglib uri="http://java.sun.com/jsp/jstl/core" entidad cliente. <html> <h:column> Clientes</title> <head></h:column> tengavalue="Id"/> forma : http-equiv="Content-Type" <title>Listado que </head> uri="http://java.sun.com/jsf/html" prefix="h"%> <body><h:column> <f:view> uri="http://java.sun.com/jsf/core" prefix="f"%> <h:form> <h:outputTextreferente <h1><h:outputText value="#{item.id}"/> <h:dataTablename="header"> <f:facet </f:facet> <h:outputText value="Listado value="Nombre"/> value="Direccion"/> <h:commandButtonvalue="#{item.nombre}"/> Para action="create" Data </h:form> </body> arrastrarcon pgina la y le elutilizar el nombre crearCliente. que </html></h:dataTable> continuacin <h:outputTextzonade vamos a a permitir control JSF el para Agregamos el y lo</f:view> </f:facet>a lalavalue="#{item.apellidos}"/> para vamosIDE Al el :formulario. genere listarClientes formulario el control daremos el crear rellenarlo comonosigual que la cdigo como <f:facet utilizamos asistente, JSFen podemos ello que clientes.sigue NetBeans nos pgina de la tabla, en la pgina quela entidadvalue="Nuevo nuevosimplementar generara control Ahora noscdigo<br/>name="header">pginaculla que queremosForma selecccionar el en la A vamos</h:column> el falta <h:outputText value="Apellidos"/> Table Cliente"/> a nos del esta value="#{item.direccion}"/> hicimos crear aparecer un de nos va Cliente. anterior,

genere elparte,quepor esto value="#{ClientesManagedBean.nombre}"campos title="Nombre" el yalopgina,ycontentType="text/html"%>la entidad creado campos botn relativosJPAgenerado /> Delque este al id="nombre" creado quedardentro del framework el datos title="Nombre"del Cliente, Managed nuevode Cliente</title>cliente.content="text/html;siguiente : que seindividualesnos diseador, hayfinal,modificadoquepropiedad valueel formulario deinputText queencargar de el Porformulario utilizado directamente otrasubmit identificador estar vaco, la <h:inputTexthe Delos modo, :esNetBeansser prefix="c"%> y <body> uri="http://java.sun.com/jsf/core" prefix="h"%> los de he hacer<metapageEncoding="UTF-8"%> como siguelos lo charset=UTF-8"> haId /> en TampocoBean.he nos ha value="#{ClientesManagedBean.cliente.nombre}" al quin el <h:outputText>Nombre:</h:outputText> La<head> uri="http://java.sun.com/jsp/jstl/core" Cliente en lugar persistencia <%@page uri="http://java.sun.com/jsf/html" vamos a : <%@taglib campo olvidarse de agregar y prefix="f"%> <html>cambiado tiene que de diseador ha de borrar <title>Nuevo este otro <f:view> http-equiv="Content-Type" <h2>Nuevo <h:form> /><br>id="direccion" value="#{ClientesManagedBean.cliente.direccion}" title="Nombre" queanos tienela pgina listarClientes. As la pgina debera quedar que al iniciar la <h:outputText>Apellidos:</h:outputText> title="Apellidos" /><br>datos.action="#{ClientesManagedBean.crearCliente}"para index.jsp : <h:outputText>Direccion:</h:outputText> title="Direccion" <br/>id="nombre" value="#{ClientesManagedBean.cliente.nombre}" <h:commandButton </h:form> /><br> </f:view> url="faces/listarClientes.jsp"/> </body> aplicacin nos redirijaid="apellidos" value="#{ClientesManagedBean.cliente.apellidos}" Por</head>vamosCliente</h2> pequea modificacin a es cmo index.jsp, value="Grabar"/> ltimo, hacia <%@page contentType="text/html"%> <%@taglib pageEncoding="UTF-8"%> <c:redirect uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> </html><h:inputTexthacer una Configuracin de JSF : faces-config.xml Lo nico que nos queda por hacer antes de probar la aplicacin es definir el fichero de configuracin faces-config.xml. Para configurar este fichero NetBeans nos provee una sencilla utilidad. Para hacer uso de ella primero tenemos que abrir el fichero faces-config.xml, que se encuentra en la ventana Projects, en el mdulo web GestionClientes-WebModule, dentro de la carpeta Configuration Files. Hacemos doble-click para editarlo, y vemos que ya tenemos definido el Managed Bean que habamos creado.

El siguiente paso es definir las reglas de navegacin. Vamos a hacer click con el botn derecho

9 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

sobre la ventana de cdigo de este fichero, seleccionamos la opcin de men Java Server Faces y a continaucin Add Navigation Rule. Hacemos un browse, seleccionamos la pgina listarClientes y pulsamos Add.

Aviso : A m, en ciertas ocasiones, se me bloquea NetBeans cuando agrego las reglas de navegacin a travs del asistente, por lo tanto y por si acaso es conveniente grabar el proyecto antes de continuar. Hay que tener en cuenta que estamos ante una versin beta, por lo que este tipo de cuelgues puede pasar.

Ahora, dentro del cdigo que nos ha generado ( entre las etiquetas navigation-rule ), volvemos a hacer click con el botn derecho, seleccionamos Add Navigation Case, y rellenamos la informacin que nos solicita el asistente del siguiente modo :

Ya slo nos faltara agregar otra regla de navegacin para la pgina crearCliente. Al final, el fichero faces-config.xml nos quedar configurado del siguiente modo :

<?xml version='1.0' encoding='UTF-8'?> <!-- =========== FULL CONFIGURATION FILE ================================== --> <faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"> <managed-bean> <managed-bean-name>ClientesManagedBean</managed-bean-name>

10 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

<managed-bean-class>org.monteagudo.web.ClientesManagedBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> <navigation-rule> <from-view-id>/listarClientes.jsp</from-view-id> <navigation-case> <from-outcome>create</from-outcome> <to-view-id>/crearCliente.jsp</to-view-id> <redirect/> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/crearCliente.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/listarClientes.jsp</to-view-id> <redirect/> </navigation-case> </navigation-rule> </faces-config>

Probando el Proyecto
Ya slo nos queda probar que todo funcione correctamente. Para ello vamos a hacer un build del proyecto. En la solapa Projects seleccionamos GestionClientes con el botn derecho y hacemo click sobre build.

A continuacin iniciamos la base de datos Derby. Vamos al men Tools, Derby Database y seleccionamos Start Derby Server.

Y por ltimo seleccionamos de nuevo el proyecto GestionClientes con el botn derecho y clickamos sobre Run Project, y si todo ha funcionado correctamente tendra que abrirse en el

11 / 12

Integracin de EJB3 y JSF


Escrito por Adrin Toledo Domingo, 19 de Octubre de 2008 21:32 -

navegador la pgina listarClientes que hemos diseado anteriormente.

Conclusin
Hemos visto una forma sencilla de trabajar con EJB3 y Java Server Faces con la ayuda de NetBeans. Vemos que la complejidad a la hora de programar se ha reducido bastante con respecto a la versin 2.1 de EJB, pero conviene tener en cuenta que alrededor de todo lo que hemos visto existe un conglomerado de APIs que conviene controlar para poder sacar el mximo partido a JEE.

En esta aplicacin hemos trabajado con las configuraciones por defecto que nos propone la plataforma, por lo cual no resulta complejo poner a funcionar este prototipo. Pero no slo en esto se basa JEE, tenemos servicios y APIs tales como JMS, JTA, Security, Web Services, interceptores, etctera, que debemos conocer si queremos obtener toda la potencia que JEE nos puede ofrecer.

Fuente www.jroller.com

12 / 12

Você também pode gostar