Exposición Web Service con NetBeans 6.5.1 y Glassfish 2.1

domingo, 24 de mayo de 2009
Tiempo atrás hice un tutorial bastante detallado sobre como crear y consumir web services usando NetBeans y Glassfish. Hoy traigo lo mismo pero con un ejemplo mucho mas sencillo y fácil de entender y digerir.

Esta entrada trata sobre la exposición de un Web Service, en otra entrada explicaré cómo consumirlo.

El ejemplo expone dos métodos a través de Web Service para validar la existencia de un usuario (getUsuario) y para modificar sus datos (setUsuario).

Los datos del usuario están en un archivo XML para mantener el ejemplo sencillo y simple. La estructura del XML es la siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<raiz>
<usuario id="1" user="metalklesk" passwd="metalklesk" activo="true" />
<usuario id="2" user="klesk" passwd="klesk" activo="false" />
</raiz>

como se puede ver a continuación:


El archivo se llama usuarios.xml y debe crearse (o copiarse) en el directorio home del usuario (en el caso de Windows creo que es el directorio del usuario dentro de Mis Documentos, corríjanme si me equivoco y en el caso de Linux es /home/usuario).

Una vez listo ya podemos crear el Web Service. Para esta tarea utilizaremos un contenedor EJB.

Abrimos NetBeans 6.5.1 -> New project -> Java EE -> EJB module


como nombre ingresamos EJBModuleWebService y seleccionamos Glassfish como servidor de aplicaciones.

Una vez listo creamos una clase java a la cual llamaremos Usuario y la agregamos al package org.modelo (como no existe, se creará al ingresarlo en la misma pantalla de creación de la clase). La clase Usuario tendrá el siguiente código:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.modelo;

/**
*
* @author metalklesk
*/
public class Usuario {

private int id;
private String user;
private String passwd;
private boolean activo;

public boolean isActivo() {
return activo;
}

public void setActivo(boolean activo) {
this.activo = activo;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getPasswd() {
return passwd;
}

public void setPasswd(String passwd) {
this.passwd = passwd;
}

public String getUser() {
return user;
}

public void setUser(String user) {
this.user = user;
}
}

Ahora crearemos la clase AccesoDatos en el mismo package. Esta clase tendrá el siguiente código:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.modelo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
*
* @author metalklesk
*/
public class AccesoDatos {

private Document documento = null;
private String archivo = System.getProperty("user.home") + "/usuarios.xml";
private static AccesoDatos datos = new AccesoDatos();

private AccesoDatos() {
try {
documento = (Document) (((DocumentBuilderFactory.newInstance()).newDocumentBuilder()).parse(new File(archivo)));
} catch (SAXException ex) {
Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParserConfigurationException ex) {
Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);
}
}

public static AccesoDatos getInstance() {
return datos;
}

public Usuario getUsuario(String user, String passwd) {
Element raiz = (Element) documento.getDocumentElement();
NodeList hijos = raiz.getElementsByTagName("usuario");
Usuario usuario = null;

for(int i=0; i<hijos.getLength(); i++) {
Element elemento = (Element) hijos.item(i);
String x = elemento.getAttribute("user");
String y = elemento.getAttribute("passwd");

if(x.equalsIgnoreCase(user) && y.equalsIgnoreCase(passwd)) {
usuario = new Usuario();
usuario.setId(Integer.parseInt(elemento.getAttribute("id")));
usuario.setUser(x);
usuario.setPasswd(y);
usuario.setActivo(Boolean.parseBoolean(elemento.getAttribute("activo")));

break;
}
}

return usuario;
}

public boolean setUsuario(Usuario usuario) {
Element raiz = (Element) documento.getDocumentElement();
NodeList hijos = raiz.getElementsByTagName("usuario");
boolean respuesta = false;

for(int i=0; i<hijos.getLength(); i++) {
Element elemento = (Element) hijos.item(i);
int id = Integer.parseInt(elemento.getAttribute("id"));

if(id == usuario.getId()) {
elemento.setAttribute("id", String.valueOf(id));
elemento.setAttribute("user", usuario.getUser());
elemento.setAttribute("passwd", usuario.getPasswd());
elemento.setAttribute("activo", String.valueOf(usuario.isActivo()));

respuesta = actualizarUsuarios();
break;
}
}

return respuesta;
}

private boolean actualizarUsuarios() {
documento.getDocumentElement().normalize();

try {
DOMSource source = new DOMSource(documento);
StreamResult result = new StreamResult(new FileOutputStream(archivo));

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.transform(source, result);

return true;
} catch (TransformerException ex) {
Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);
return false;
} catch (FileNotFoundException ex) {
Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
}

Una vez listo ya podemos crear el Web Service, para eso hacemos click derecho en el proyecto -> New -> Web service


Ingresamos como nombre UsuarioWebService y lo agregamos al package org.modelo.


Una vez listo, ingresamos el siguiente código con los métodos a exponer en el Web Service:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.modelo;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.ejb.Stateless;

/**
*
* @author metalklesk
*/
@WebService()
@Stateless()
public class UsuarioWebService {

/**
* Web service getUsuario
* @param user
* @param passwd
* @return
*/
@WebMethod(operationName = "getUsuario")
public Usuario getUsuario(@WebParam(name = "user")
String user, @WebParam(name = "passwd")
String passwd) {
AccesoDatos datos = AccesoDatos.getInstance();

return datos.getUsuario(user, passwd);
}

/**
* Web service getUsuario
* @param usuario
* @return
*/
@WebMethod(operationName = "setUsuario")
public Boolean setUsuario(@WebParam(name = "usuario")
Usuario usuario) {
AccesoDatos datos = AccesoDatos.getInstance();

return datos.setUsuario(usuario);
}

}

Ya con eso estamos listos con la exposición del Web Service, ahora para probarlo podemos ejecutar la aplicación haciendo click derecho -> Run y luego expandimos la carpeta Web Services, damos click derecho el web service UsuarioWebService y pinchamos la opción Test Web service, lo cual abrirá una ventana del navegador web predeterminado en NetBeans.

Espero les sea de utilidad y como siempre me pueden dejar un comentario con su dirección de correo y les reboto el proyecto NetBeans comprimido.

Saludos !!!

20 comentarios:

Anónimo dijo...

Que buen articulo, me gustaria que me enviaras el proyecto :P espaciolibertad@hotmail.com

Anónimo dijo...

Hola Daniel, me podrias enviar por favor el proyecto para hacer pruebas, gracias, danveg@gmail.com.

Anónimo dijo...

Buena!
Me puedes enviar el proyecto gracias!
ioset@hotmail.com

Anónimo dijo...

Excelente explicación. Por favor envíame tu proyecto para analizarlo. De antemano, gracias. juandie9@hotmail.com

Anónimo dijo...

Necesito el Fuente xfa

bscfernando@hotmail.com

gerard dijo...

okko esta bien as hecho lo facil ahora como haces para que el bton llo vas a programar para q sea del mismo metedo me expico como haces para q lo q ingreses en el textfield sea lo q tenga q buscar

Anónimo dijo...

muy buen aporte podrias enviarme el proyecto en windows a mi mail mled5@hotmail.com mucas gracias lo necesito para la u

Anónimo dijo...

Hola!

No entendi la parte de guardar el archivo xml en home del usuario. Por favor si me puedes explicar esta parte, tengo Windows.

Gracias

Daniel Dario Morales Salas dijo...

Todos los usuarios de todos los sistemas operativos tienen un home que es la carpeta raíz que les corresponde, en Windows no recuerdo cual es porque NO uso windows, pero es fácil saberlo si haces un pequeño programa que solo imprima la propiedad user.home usando: System.out.println(System.getProperty("user.home"))

Con eso ya podrás resolver tu duda y nos cuentas.
Una vez que ya sabes cual es el home que te corresponde, copias ahí el XML.

Saludos!!

Irmay dijo...

Hola. Muy buen artículo. Yo estoy haciendo un proyecto web service también en Netbeans y Glassfish pero el view está en C#. Estoy totalmente ignorante de la sintaxis para envío y recepción de datos. Puede ayudarme en eso?

Muchas gracias.

faja dijo...

hola...
me podrias enviar el proyecto.... te agradesco de antemano,

gracias

Luis fajardo
fajardotk@hotmail.com

Anónimo dijo...

XVR pero haber si me puedes decir las evntajas y utilidades que le puedo dar a este tipo de aplicaciones con web service ya q no tengo experiencia en esto recien toy averiguando!!! Pd si puedes mandas el proyecto mostrado en este bolg al corereo wdyl_2611@hotmail.com

Anónimo dijo...

hola amigo me parece interesante tu proyecto felicidades
podrias mandarmelo mi correo es unicomaster@hotmail.com.mx

Anónimo dijo...

hola me podrias mandar el proyecto please
frmaurei@alumnos.ubiobio.cl

de antemano muchas gracias

Yeison dijo...

me parece genial el proyecto pero si pudieras enviarme el proyecto para fines practicos te lo agradeceria mucho (POR FAVOR)brenesyb@gmail.com

Anónimo dijo...

Hola, Muchas Gracias por este web service me sirvio mucho.

Anónimo dijo...

Hola muy buen articulo me gustaria tener el proyecto, Podrias porfavor enviarme el proyecto al gmcr05@hotmail.com. Gracias

Anónimo dijo...

buenisimo el ejmeplo aver si me envias el codigo!! andresmerida@hotmail.com

Anónimo dijo...

Excelente.. porfa lo envias a mi correo peque_taohotmail.com gracias

Anónimo dijo...

hola excelente ejemplo, serías tan amable de enviámelo a mi corre fernando.carcamo@gmail.com
Desde ya agradecido.
Saludos

Publicar un comentario en la entrada