Sei sulla pagina 1di 28

Integracion de EJB3 y JSF

Integracin de EJB3 y JSF


Hace escaso 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.

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. 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. 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; }

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 :

Como no necesitamos almacenar ningn estado tanto para listar clientes como para crear nuevos clientes, es evidente que nuestro bean va a ser sin estado, por ello en el campo Session Type elegimos Stateless. En el campo Create Interface podemos elegir Remote, Local o ambas. Si no seleccionamos ninguna, el contenedor generar una interfaz local implcitamente en tiempo de ejecucin. El cliente principal de nuestro bean va a ser un Managed Bean del mdulo web, es decir, el cliente va a ser una clase que se va a ejecutar en el mismo servidor de aplicaciones, y en la misma JVM, por lo que vamos a seleccionar que nuestro bean implementa una interfaza Local. Pulsamos Finish, y vemos que NetBeans nos ha creado dos ficheros :

ServicioClientesBean es el bean propiamente dicho que implementa la lgica de negocio, y ServicioClientesLocal es una interfaz con una anotacin Local ( si no lleva anotacin se asume que es Local ), y que es implementada por nuestro bean. La interfaz va a quedar definida de este modo : package org.monteagudo.service;

import java.util.List; import javax.ejb.Local; import org.monteagudo.entity.Cliente;

/** * This is the business interface for ServicioClientes enterprise bean. */

@Local public interface ServicioClientesLocal {

public void crearCliente(Cliente cliente); public List<Cliente> listarClientes();

} Y el bean quedar definido de este otro modo : package org.monteagudo.service;

import java.util.List; import javax.ejb.*; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.monteagudo.entity.Cliente;

/** * This is the bean class for the ServicioClientesBean enterprise bean. * Created 16-jul-2006 23:15:44 * @author jlm */ @Stateless() public class ServicioClientesBean implements ServicioClientesLocal {

@PersistenceContext EntityManager em;

public void crearCliente(Cliente cliente) { em.persist(cliente);

public List<Cliente> listarClientes() { Query query = em.createQuery("SELECT c FROM Cliente AS c"); return query.getResultList(); }

} Vemos que el bean est anotado como Stateless, lo que identifica al bean como sin estado. Otra caracterstica importante es la anotacin PersistenceContext. Cuando anteriormente creamos la entidad Cliente tambin configuramos el fichero persistence.xml. Este fichero es el que utiliza el servidor de aplicaciones para crear objetos de tipo EntityManager. Podramos acceder a estos objetos va JNDI, pero es recomendado inyectar el EntityManager a travs de la anotacin PersistenceContext. Una vez tenemos el EntityManager ya vamos a poder realizar operaciones sobre todas nuestras entidades definidas en nuestra aplicacin. Con todo esto ya tendramos implementado nuestro mdulo EJB. Para comprobar si ha ido todo bien podemos hacer un Build de este mdulo. Para ello vamos a seleccionar con el botn derecho el mdulo del EJB, y vamos a seleccionar la opcin Build Project, as veremos si ha habido algn problema con alguna de las clases que hemos definido.

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 GestionClientesWebModule, 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 GestionClientesWebModule, 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 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; }

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 :

Como podemos ver, la plantilla que nos ha creado NetBeans no tiene incluidas los taglib de JSF. Vamos a agregarlos manualmente. Como puede resultar un poco difcil acordarse del uri de los tags, vamos a ver dnde podemos consultarlos de forma ms o menos rpida. Navegamos por la ventana de proyectos hasta los ficheros descriptores de los tag libraries (tld) :

Hacemos doble-click sobre el tld y ah encontraremos las etiquetas short-name y uri, que son las que utilizaremos para agregar las taglibs de JSF. Una vez tenemos definidos los taglibs que necesitamos, vamos a crear una tabla JSF para listar todos los clientes. NetBeans ofrece una paleta de controles bsica que nos permite crear una tabla a partir de una de un objeto java.util.List. Si la paleta de controles no nos apareciera en el IDE podemos mostrarla seleccionando la opcin de men Window -> Palette. En la paleta seleccionamos el control JSF Data Table y lo arrastramos a la zona de cdigo en la que queremos mostrar la tabla. Nos aparece un asistente que nos solicita por una parte el Entity Bean que queremos representar, y por otra parte el mtodo del Managed Bean que nos devuelve la lista de clientes. El asistente lo rellenaremos con la siguiente informacin :

Como podemos observar, el asistente se ha encargado de generarnos de forma automtica la tabla con toda la informacin referente a nuestra entidad cliente. Finalmente la pgina la modificaremos para que tenga la siguiente forma : <%@page <%@page <%@taglib <%@taglib <%@taglib contentType="text/html"%> pageEncoding="UTF-8"%> uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> uri="http://java.sun.com/jsf/html" prefix="h"%> uri="http://java.sun.com/jsf/core" prefix="f"%>

<html> <head> <meta http-equiv="Content-Type" <title>Listado </head>

content="text/html; de

charset=UTF-8"> Clientes</title>

<body> <f:view> <h:form> <h1><h:outputText <h:dataTable <h:column> <f:facet <h:outputText </f:facet> <h:outputText </h:column> <h:column> <f:facet <h:outputText </f:facet> <h:outputText </h:column> <h:column> <f:facet <h:outputText </f:facet> <h:outputText </h:column> <h:column> <f:facet <h:outputText </f:facet> <h:outputText </h:column> </h:dataTable> <br/> <h:commandButton </h:form> </f:view> </body> </html> Ahora nos falta crear la pgina que nos va a permitir crear nuevos clientes. Agregamos la pgina como hicimos con la anterior, y le daremos el nombre crearCliente. Al igual que en la pgina listarClientes utilizamos el control JSF Data Table para que el IDE nos generara el cdigo de la tabla, en esta pgina vamos a utilizar el control JSF Form para que NetBeans nos genere el cdigo del formulario de la entidad Cliente. Para ello vamos a selecccionar el control y lo vamos a arrastrar a la zona de la pgina en la que queremos implementar el formulario. A continuacin nos aparecer un asistente, el cul podemos rellenarlo como sigue :

value="Listado de value="#{ClientesManagedBean.clientes}"

Clientes"/></h1> var="item"> name="header"> value="Id"/> value="#{item.id}"/>

name="header"> value="Nombre"/> value="#{item.nombre}"/>

name="header"> value="Apellidos"/> value="#{item.apellidos}"/>

name="header"> value="Direccion"/> value="#{item.direccion}"/>

action="create"

value="Nuevo

Cliente"/>

Del formulario que nos ha creado NetBeans vamos a borrar los datos relativos al Id del Cliente, ya que este campo tiene que estar vaco, y ser el framework de persistencia JPA quin nos genere el nuevo identificador de cliente. Por otra parte, he modificado la propiedad value de los campos inputText que ha generado el diseador, y he utilizado directamente la entidad Cliente en lugar de campos individuales en el Managed Bean. De este modo, es diseador ha creado lo siguiente : <h:inputText id="nombre" value="#{ClientesManagedBean.nombre}" title="Nombre" />

y lo he cambiado por esto otro : <h:inputText title="Nombre" /> id="nombre" value="#{ClientesManagedBean.cliente.nombre}"

Tampoco hay que olvidarse de agregar dentro del formulario el botn que se encargar de hacer el submit de los datos. La pgina, al final, nos tiene que quedar como sigue : <%@page <%@page <%@taglib <%@taglib <%@taglib contentType="text/html"%> pageEncoding="UTF-8"%> uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> uri="http://java.sun.com/jsf/html" prefix="h"%> uri="http://java.sun.com/jsf/core" prefix="f"%>

<html> <head> <meta http-equiv="Content-Type" <title>Nuevo </head> <body>

content="text/html;

charset=UTF-8"> Cliente</title>

<f:view> <h2>Nuevo Cliente</h2> <h:form> <h:outputText>Nombre:</h:outputText> <h:inputText id="nombre" value="#{ClientesManagedBean.cliente.nombre}" title="Nombre" /><br> <h:outputText>Apellidos:</h:outputText> <h:inputText id="apellidos" value="#{ClientesManagedBean.cliente.apellidos}" title="Apellidos" /><br> <h:outputText>Direccion:</h:outputText> <h:inputText id="direccion" value="#{ClientesManagedBean.cliente.direccion}" title="Direccion" /><br> <br/> <h:commandButton </h:form> </f:view> </body> </html> Por ltimo, vamos a hacer una pequea modificacin a la pgina index.jsp, para que al iniciar la aplicacin nos redirija hacia la pgina listarClientes. As es cmo debera quedar index.jsp : <%@page <%@page <%@taglib contentType="text/html"%> pageEncoding="UTF-8"%> uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

action="#{ClientesManagedBean.crearCliente}"

value="Grabar"/>

<c:redirect url="faces/listarClientes.jsp"/> 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 facesconfig.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 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'?> CONFIGURATION FILE -->

<!-=========== FULL ==================================

<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> <managed-bean-class>org.monteagudo.web.ClientesManagedBean</managed-beanclass> <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 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.

RESTful... la forma ms ligera de hacer WebServices (Parte 1)

Quienes hayan usado SOAP para WebService, sabrn que es bien fcil de disear, pero algo complicado de consumir: se necesita toda una API para construir los clientes utilizando el WSDL. Por ejemplo, para PHP se necesita de la biblioteca NuSOAP. Entonces, para lograr el concepto de "lenguaje nico XML" es un dolor de cabeza. Y ms an si el cliente es tan simple como JavaScript, manejar XML de SOAP provocara suicidos masivos... o no usar WebServices. Adems, con SOAP se permite crear un solo servicio y ponerle varios mtodos. Esto puede llevar a un mal diseo del servicio ya que podra tener un servicio que haga de todo: por ejemplo, un servicio de manejo de Clientes que permita tambin manejar Proveedores. RESTful es una propuesta muy interesante de Roy Fielding que permite manejar los servicios web con mtodos definidos, manteniendo la simpleza del protocolo como XML, pero que cada servicio sea identificado nicamente con un solo URI. En este post veremos cmo crear un Servicio RESTful usando NetBeans, y haremos crecer de poco a poco nuestro ejemplo... desde hacer operaciones sencillas, hasta manejar estructuras complejas. Cabe destacar que los servicios de las redes sociales como Flickr, Twitter, Facebook, etc son basados en RESTful. Para este ejemplo usaremos NetBeans 6.9.1, y GlassFish v3.0.1, ya que usaremos las caractersticas de Java EE6. Con GlassFish v.2 igual funciona, y NetBeans ayuda en ello, Para comenzar, debemos entender que necesitamos de una clase para manejar un servicio. En esta clase solo pueden haber mximo cuatro mtodos pblicos que son ejecutados por los cuatro mtodos HTTP disponibles para RESTful: 1. 2. 3. 4. GET POST DELETE PUT

Los mtodos GET y POST son conocidos en los formularios (<form method="post" />) Tienen algo que ver? S, y lo veremos poco a poco. Cada uno de estos mtodos determina la accin que har el REST sobre nuestra aplicacin. No deben haber ms de un GET o POST o DELETE o PUT, solo tiene que haber uno de cada mtodo. Cada uno tiene una tarea especifica: 1. GET: Para obtener un valor. Puede ser un listado de objetos 2. POST: Para guardar un nuevo objeto (instancia de identidada) en la aplicacin 3. DELETE: Para eliminar un objeto (instancia de identidad) 4. PUT: Para actualizar un objeto.

Suena a un mantenimiento CRUD? S, exacto. Eso es lo que es: los mtodos para hacer mantenimiento a una entidad de la aplicacin. Entonces, la clase que deber tener estos mtodos es como una clases EJB Facade de una aplicacin Java EE. Por tanto, esta clase se llamar "Recurso", funcionar como un EJB, solo manejar la persistencia de una etndiad, pero ser accedido desde la web. Cmo se hace? Bueno, iremos de poco a poco conociendo cmo hacer un mantenimiento complejo usando nicamente RESTful.
CREANDO PROYECTO Y CONFIGURANDO REST

Crearemos un proyecto web comn y silvestre en NetBeans. Yo crear uno llamado SimpleRESTweb. Este proyecto har un simple clculo de factorial. (Aunque a muchos no les guste, comenzar siempre con una calculadora ya que es el clsico ejemplo de Entrada->Procesamiento->Salida.. lo dems, usando entidades, bases de datos, etc.. es lo mismo, solo que utiliza ms variables) Luego, crearemos una clase comn y silvestre, llamada FactorialResource. Tendr (por ahora) un mtodo llamado factorial()

public class FactorialResource { public long factorial(long base) { if (base >= 1) { return factorial(base - 1) * base; } return 1; } }

A esta clase se puede crear su TestCase para asegurarnos que funciona correctamente. Notemos que hasta ahora no hemos hecho nada REST. La diversin comienza aqu: Agreguemos la notacin @Stateless al inicio de la clase. Esto convierte automticamente a nuestra clase en un EJB

Luego, seguido al @Stateless agregamos la anotacin @Path("/factorial") Esto indica que este recurso ser accedido desde la ruta "/factorial" via web. Ahora, guardemos el archivo... y en ese mismo momento, el NetBeans detectar de que se ha creado un recurso REST, entonces pedir activar esta caracterstica en la aplicacin... por tanto pedir dnde estar activado todos los recursos REST.

Utilizaremos el dado por defecto (/resources). Clic en Ok. Nota: En GlassFish v2 (Java EE 5) solo existirn dos opciones Y con esto, nuestra clase ya es un recurso REST.

Pero an este recurso no tiene mtodos. Ahora veremos cmo convertir nuestro mtodo convencional en un mtodo REST.

CREANDO UN MTODO REST

Recordemos que solo podemos crear un mtodo de tipo GET,POST,PUT y DELETE. Y como el mtodo factorial nos deber devolver un solo valor segn el parmetro que le especificamos, usaremos el tipo GET. Para ello agregamos la anotacin @GET antes del mtodo. Y con esto, nuestro recurso ya tiene un mtodo.

Antes de continuar, los valores que se reciben desde el recurso REST deben ser objetos. Por tanto, nuestro mtodo debe cambiar un poco para que no devuelva un long, sino un java.lang.String. Adems, debemos indicar que el parmetro base del mtodo Java factorial ser recibido via URL con el nombrebase. Es decir, se llamar al URL as ..../factorial?base=5 Para ello usaremos la notacin @QueryParam antes de la declaracin del parmetro y ponemos el nombre de la cadena query.

@Stateless @Path("/factorial") public class FactorialResource { @GET public String factorial(@QueryParam("base") long base) { return Long.toString($factorial(base)); } long $factorial(long base) {

if (base >= 1) { return $factorial(base - 1) * base; } return 1; } }

El nombre del parmetro de la cadena query podra ser diferente al del mtodo java.

//.... @GET public String factorial(@QueryParam("numero") long base) { //....

Pero si se hace eso, se debera recordar que para accederlo via URL debe ser con ese mismo nombre ..../factorial?numero=5 Pero para evitar problemas, usaremos el mismo nombre. Y en caso de ser necesario, podemos cambiar el nombre. Eso ya queda a criterio del diseador de la aplicacin.
PROBANDO LA APLICACIN

Pues bien, ahora guardemos el proyecto, hagamos clic derecho sobre el cono de proyecto y seleccionamos "Deploy". Esperamos a que se compile el proyecto, se ejecute el GlassFish y se despliegue. Aqu propondr tres maneras de probar el recurso REST. El primero es el ms fcil, usando el URL. Bastar con abrir nuestro navegador y escribir el URL del proyecto: http://localhost:8080/SimpleRESTweb/resources/factorial?base=10 Este URL est compuesto de lo siguiente: SimpleRESTweb: El contexto de la aplicacin. Que generalmente es el nombre del proyecto. resources: Ubicacin de los recursos REST de la aplicacin. Este nombre nos lo pidi el NetBeans cuando guardamos la clase Java por primera vez con la notacin @Path ya que detect que tena recursos REST. Si se desea cambiar esta ruta, hagamos clic derecho en el nodo "RESTful Web Services" del proyecto y seleccionando "REST Resources Configuration" factorial: Es el nombre de nuestro recurso (Definido por la anotacin @Path) base: Es el parmetro del recurso. Justamente es una cadena Query. El resultado debe mostrarse tan simple como una web sin formato ni nada

Y ese es el resultado. Quizs me digan "hey, pero esto tambin lo puedo hacer con un servlet". Pues s, pero no es lo mismo, ya que el Servlet puede guardar variables de sesin, y aqu en REST no... en Servlet se puede formatear en un HTML, pero aqu en REST no, porque lo que debe devolver es solo dato. La segunda manera que muestro cmo probar este recurso REST es usando un formulario HTML. Escribamos lo siguiente en el index.jsp

<body> <h1>Calculando factorial</h1> <form action="resources/factorial"> Base: <input name="base" type="text" /> <button>Calcular</button> </form> </body>

El resultado saldr en otra pgina. Y la tercera forma (que es la ms profesional) es usando el NetBeans. Hacemos clic derecho sobre el cono del proyecto y seleccionamos "Test RESTful WebService".

Con esto, el IDE crear una pgina local que acceder al WADL de la aplicacin y se mostrar en el navegador web.

El WADL es anlogo al WSDL de SOAP Luego, podemos seleccionar del panel izquierdo el recurso que est disponible (en este caso "factorial")...

... y vemos que nos muestra cuales son los parmetros (solo base) que estn disponibles para este recurso. Probamos escribiendo valores en el parmetro, y hacemos clic en "Test".

CONSUMIENDO REST

Todo servicio web no es til si no se sabe cmo consumir. En este post mostraremos cmo consumir este simple REST. En los siguientes post realizaremos recursos que utilizan objetos complejos.

Usando JavaScript
Para consumir desde JavaScript, se debera utilizar la tcnica AJAX. Y en vez de hacer toda la biblioteca de consumir AJAX con JavaScript, mejor usamos algo ya hecho... como el jQuery. Crearemos una pgina html al que llamaremos test-jquery.html. Y ah pondremos lo siguiente.

<html> <head>

<title></title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"> </script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h2>Calcular factorial</h2> Nmero:<input type="text" name="base" id="base"/> <button type="button" id="calcularBtn">Calcular</button> <div id="resultado"> Resultado: <span></span> </div> <script type="text/javascript"> jQuery("#calcularBtn").click(function(){ var base = jQuery("#base").val(); jQuery.get("http://localhost:8080/SimpleRESTweb/resources/factorial",{ base:base },function(resultado){ jQuery("#resultado span").text(resultado) }) }) </script> </body> </html>

Esta HTML funciona desde Firefox cuando se ejecuta desde el NetBeans,

y funciona en IExplorer si se ejecuta localmente (o sea, abrindolo desde el explorador de archivos y activar el filtro de ActiveX que advierte el IE).

Usando Java
Con NetBeans ms el complemento Jersey, se nos hace muy fcil consumir servicios REST. Para integrarlo con el IDE, necesitamos registrar el WADL. Esta URL lo podemos obtener as: http://host:puerto/contexto-web/resources/application.wadl Para nuestro ejemplo, este es http://localhost:8080/SimpleRESTweb/resources/application.wadl Podemos abrirlo desde el navegador y se nos mostrar un XML que contiene la definicin de los recursos (/factorial) y los parmetros de cada mtodo. En este caso hay un mtodo GET y tiene como parmetro un long.

Ahora bien, este URL del WADL lo vamos a necesitar para registrarlo en el NetBeans. En el IDE vayamos al panel de servicios (Ctrl+5) y hacemos clic derecho sobre el nodo "Web Services" y seleccionamos "Add Web Service..."

Luego, en la entrada de URL, pegamos la direccin del WADL. Y como nombre de paquete ponemos simplerest.

Y listo, ya tendremos registrado el WebService en nuestro IDE.

Esto nos permitir utilizar este servicio en cualquiera de nuestras aplicaciones. Por ejemplo, ahora, en Java. Hagamos un nuevo proyecto llamado SimpleRESTClientJavaApp. Ahora, crearemos un nuevo archivo (Ctrl+N) y seleccionamos la categora "Web Services" y el tipo de archivo "RESTful Java Client"

Luego, en el siguiente paso, pongamos como nombre de la clase FactorialClient, dentro de la opcin "Select the REST resource" seleccionemos la opcin "IDE Registered"

... y hagamos clic en "Browse" para seleccionar el WebService que acabamos de registrar.

y clic en "Finish". Listo, el IDE nos crear la clase FactorialClient que contendr los recursos necesarios para acceder al servicio REST.

Ahora, cmo se consume esto?... en nuestra clase Java solo debemos instanciar la clase, pasarle el parmetro y recibir el valor. Fcil

Potrebbero piacerti anche