domingo, 12 de febrero de 2012

Web Services


Un servicio web es una pieza de software que utiliza un conjunto de protocolos y estándares que sirven para intercambiar datos entre aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los servicios web para intercambiar datos en redes de ordenadores como Internet. Las ventajas de los web services son:
  • Aportan interoperabilidad entre aplicaciones de software independientemente de sus propiedades o de las plataformas sobre las que se instalen.
  • Los servicios Web fomentan los estándares y protocolos basados en texto, que hacen más fácil acceder a su contenido y entender su funcionamiento.
  • Permiten que servicios y software de diferentes compañías ubicadas en diferentes lugares geográficos puedan ser combinados fácilmente para proveer servicios integrados.
Ahora vamos a ver un ejemplo de uso de servicios web, haciendo el ejemplo de login de usuario:

Primero tenemos que crear el servicio web de usuarios, el cual va a contener todas las funciones correspondientes al usuario, en nuestro caso solo el login (aunque también estarían las funciones de registrar usuario, borrarlo, modificarlo, etc). Este servicio web hará uso de la clase Usuario, que es la que realmente contiene las funciones. Dicho esto, tenemos que crear un nuevo proyecto en Netbeans llamado Usuarios Webservice (New Project -> Java Web -> Web application). En el pondremos la clase MySQL que ya vimos en anteriores entradas y la clase Usuario, que contiene el siguiente código:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
 *
 * @author Tarde
 */
public class Usuario {
 //ATRIBUTOS
 private int id;
 private String nombre;
 private String apellidos;
 private String direccion;
 private String cp;
 private String localidad;
 private String provincia;
 private String pais;
 private String telefono;
 private String alias;
 private String email;
 private String password;
 private int rol;
 private int activado;
public Usuario(){
}
//CONSTRUCTORES
 public Usuario(String alias,String password){
 this.alias=alias;
 this.password=password;
 }
public Usuario(String nombre, String apellidos, String direccion, String cp, String localidad, String provincia, String pais, String telefono, String alias, String email, String password, int rol, int activado) {
 this.nombre = nombre;
 this.apellidos = apellidos;
 this.direccion = direccion;
 this.cp = cp;
 this.localidad = localidad;
 this.provincia = provincia;
 this.pais = pais;
 this.telefono = telefono;
 this.alias = alias;
 this.email = email;
 this.password = password;
 this.rol = rol;
 this.activado = activado;
 }
//METODOS
/**
 * @return the id
 */
 public int getId() {
 return id;
 }
/**
 * @param id the id to set
 */
 public void setId(int id) {
 this.id = id;
 }
/**
 * @return the nombre
 */
 public String getNombre() {
 return nombre;
 }
/**
 * @param nombre the nombre to set
 */
 public void setNombre(String nombre) {
 this.nombre = nombre;
 }
/**
 * @return the apellidos
 */
 public String getApellidos() {
 return apellidos;
 }
/**
 * @param apellidos the apellidos to set
 */
 public void setApellidos(String apellidos) {
 this.apellidos = apellidos;
 }
/**
 * @return the direccion
 */
 public String getDireccion() {
 return direccion;
 }
/**
 * @param direccion the direccion to set
 */
 public void setDireccion(String direccion) {
 this.direccion = direccion;
 }
/**
 * @return the cp
 */
 public String getCp() {
 return cp;
 }
/**
 * @param cp the cp to set
 */
 public void setCp(String cp) {
 this.cp = cp;
 }
/**
 * @return the localidad
 */
 public String getLocalidad() {
 return localidad;
 }
/**
 * @param localidad the localidad to set
 */
 public void setLocalidad(String localidad) {
 this.localidad = localidad;
 }
/**
 * @return the provincia
 */
 public String getProvincia() {
 return provincia;
 }
/**
 * @param provincia the provincia to set
 */
 public void setProvincia(String provincia) {
 this.provincia = provincia;
 }
/**
 * @return the pais
 */
 public String getPais() {
 return pais;
 }
/**
 * @param pais the pais to set
 */
 public void setPais(String pais) {
 this.pais = pais;
 }
/**
 * @return the telefono
 */
 public String getTelefono() {
 return telefono;
 }
/**
 * @param telefono the telefono to set
 */
 public void setTelefono(String telefono) {
 this.telefono = telefono;
 }
/**
 * @return the alias
 */
 public String getAlias() {
 return alias;
 }
/**
 * @param alias the alias to set
 */
 public void setAlias(String alias) {
 this.alias = alias;
 }
/**
 * @return the email
 */
 public String getEmail() {
 return email;
 }
/**
 * @param email the email to set
 */
 public void setEmail(String email) {
 this.email = email;
 }
/**
 * @return the password
 */
 public String getPassword() {
 return password;
 }
/**
 * @param password the password to set
 */
 public void setPassword(String password) {
 this.password = password;
 }
/**
 * @return the rol
 */
 public int getRol() {
 return rol;
 }
/**
 * @param rol the rol to set
 */
 public void setRol(int rol) {
 this.rol = rol;
 }
/**
 * @return the activado
 */
 public int getActivado() {
 return activado;
 }
/**
 * @param activado the activado to set
 */
 public void setActivado(int activado) {
 this.activado = activado;
 }
public int login(){
 int existe=0;
 try{
 MySQL mysql=new MySQL("tienda","//localhost","root", "forman");
mysql.inicializarBD();
//consulta
 mysql.consultar("SELECT idusuarios,rol FROM usuarios WHERE alias='"+alias+"' AND password='"+password+"' AND activado=1;");
 //ejecutar la consulta
 ResultSet rst = mysql.getResultSet();
if(rst.next()){ //Existe
 existe=1;
 id=rst.getInt("idusuarios");
 }else{ //No existe
 id=-1;
 }
 mysql.cerrarBD();
}catch(SQLException err){
 System.out.println("Error SQLException: "+err.getMessage() +"\n"+err.toString());
 }finally{
 return id;
 }
 }
}
Ahora sí, creamos el servicio web. Para ello le damos al segundo botón del ratón sobre nuestro proyecto, y elegimos New -> Web Service . Le damos nombre UsuarioWS y le especificamos el mismo paquete donde se han guardado las otras clases. En este nuevo archivo que se ha creado, se pueden añadir las funciones escribiendo el código manualmente, o mediante el Design, que es una pestaña que aparece en la parte de arriba. Como se ha dicho, este web service se limitará a llamar a la clase usuario y a la función login:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
/**
 *
 * @author Tarde
 */
@WebService(serviceName = "UsuarioWS")
public class UsuarioWS {
/** This is a sample web service operation */

 @WebMethod(operationName = "login")
 public int login(String alias,String password) {
 Usuario usu=new Usuario(alias,password);
 int id=usu.login();
 return id;
 }
}
Hecho esto, ya tenemos la funcionalidad del usuario lista. Ahora se debe compilar y después hacer el ‘Test Web Service’ al archivo UsuarioWS que esta en la carpeta que se generó ‘Web Services’. Se abrirá una nueva ventana en el navegador donde aparecerán las funciones de ese servicio web. Es muy importante comprobar que todo funciona correctamente, antes de que un cliente haga uso de este webservice, que es nuestro siguiente paso.
Imaginemos que este es un proyecto muy grande y el trabajo esta dividido en varios departamentos. En tu departamento, te han asignado la tarea de hacer el servicio web de usuarios y que funcione correctamente. En otro departamento, la tarea que tienen es hacer un aplicación cliente, que haga uso de este webservice. Esta es una de las ventajas de los servicios web: este departamento lo único que tiene que saber es que funciones contiene el servicio web y que parámetros se les pasa, y ellos podrán usarlas como quieran, incluso con lenguajes y arquitectura distintas.
En la aplicación cliente (que será un nuevo proyecto) se tiene que añadir el webservice. Para ello se hace click en el segundo botón New -> Web Service Client. Aquí se añade el proyecto Usuario Webservice creado anteriormente, y se empaqueta en un paquete distinto llamado wsUsuario.
El código del cliente tendría un formulario de usuario y contraseña, que cuando se rellena manda al servlet que es el que hará uso de la función login del servicio web. Para añadir esta función al código hay que pulsar con el segundo botón sobre el código y darle a Insert Code -> Call Web Service Operation, y seleccionar la función login. Ahora en el código habría que usar esta llamada. Se quedaría así:
package org;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.ws.WebServiceRef;
import wsUsuario.UsuarioWS_Service;
/**
 *
 * @author Tarde
 */
@WebServlet(name = "IniciarSesionServlet", urlPatterns = {"/IniciarSesionServlet"})
public class IniciarSesionServlet extends HttpServlet {
 @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/Ejercicio_4.2._-_Usuarios_WebService/UsuarioWS.wsdl")
 private UsuarioWS_Service service_1;
/**
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
 protected void processRequest(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 response.setContentType("text/html;charset=UTF-8");
 PrintWriter out = response.getWriter();
 try{
 ResultSet rst;
 String alias,password;
alias=request.getParameter("txtNombre");
 password=request.getParameter("txtPassword");

 //Encriptacion del password
 StringBuffer passwordEncriptado=Encriptar.encripta(password);

 int id=login(alias,passwordEncriptado.toString());
HttpSession sesion=request.getSession(true);
 if(id!=-1){ //Existe
 sesion.setAttribute("idLogeado", id);
 sesion.setAttribute("nombreLogeado", alias);

request.getRequestDispatcher( "/index.jsp" ).forward( request, response );
 }catch(Exception ex){

 }
 }
 // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
 /**
 * Handles the HTTP <code>GET</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 processRequest(request, response);
 }
/**
 * Handles the HTTP <code>POST</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 processRequest(request, response);
 }
/**
 * Returns a short description of the servlet.
 * @return a String containing servlet description
 */
 @Override
 public String getServletInfo() {
 return "Short description";
 }// </editor-fold>
private int login(java.lang.String arg0, java.lang.String arg1) {
 wsUsuario.UsuarioWS port = service_1.getUsuarioWSPort();
 return port.login(arg0, arg1);
 } 
}

No hay comentarios:

Publicar un comentario