Construir Aplicaciones EJB con JBoss, Lomboz y Eclipse

Los servicios web prometen ser la siguiente generaci�n en el desarrollo de software. En esencia, un servicio web significa un interface a aplicaciones web o empresariales que nos permite integrar �stas con otras aplicaciones empresariales, incluyendo aquellas de diferentes vendedores y diferentes plataformas, utilizando XML como el lenguaje de intercambio de datos.

Hay mucha confusi�n sobre los servicios web. En el pasado hab�a varias iniciativas para proporcionar tecnolog�a de integraci�n agn�stica vendedor-a-plataforma, pero ninguna de ellas ha tenido mucho �xito. Un buen ejemplo es conseguir que una aplicaci�n empresarial ejecut�ndose en Windows se comunique con otra aplicaci�n empresarial de Unix. De verdad, ha sido posible, pero muchas veces con un mecanismo que no est� bien soportado por �mbos entornos. Esto ha cambiado con el advenimiento de los servicios web SOAP y XML y el pegamento que cada uno quiera ponerle.

El mecanismo b�sico de los servicios Web es utilizar XML para transportar los datos a trav�s de diferentes aplicaciones utilizando el protocolo web est�ndar HTTP. Especificamente se utiliza SOAP (Simple Object Access Protocol) que es un XML de peso ligero basado en RPC (Remote Procedure Call) sobre HTTP. El protocolo tiene tres partes:

  1. Un envelope (SOAP envelope) que define un marco de trabajo para describir qu� hay en un mensaje y c�mo procesarlo.
  2. Un conjunto de reglas de codificaci�n para expresar ejemplares de tipos de datos definidos por la aplicaci�n.
  3. Un conjunto de reglas para representar llamadas y respuestas a procedimientos remotos.

.�Servicios Web Est�ndar:

Ahora veamos la evoluci�n de algunos est�ndares utilizados en los servicios web, como son SOAP, WSDL (Web Services Description Language), UDDI (Universal Description Discovery and Integration), ebXML que ha sido promovido por OASIS (Organization for the Advancement of Structured Information Standards) y UN/CEFACT (United Nations Centre for Trade Facilitation and Electronic Business). En este tutorial s�lo cubriremos SOAP y WSDL.

WSDL (Web Services Description Language) describe el interface de un servicio de red de forma similar a como lo hace IDL (Interface Definition Language) en CORBA (Common Object Request Broker Architecture), especificando qu� mensajes enviar� y recibir� un punto_final endpoint (es decir un ejemplar de servicio que procesa solicitudes de clientes y devuelve respuestas). WSDL es en s� mismo un formato de metadatos XML. (En t�rminos de mecanismos similares como RMI o CORBA, un servicio es un interface o conjunto de m�todos que un cliente puede invocar a trav�s de la red).

SOAP (Simple Object Access Protocol) describe el formato de los datos transmitidos por la red.

Ambos est�ndares a�n est�n evolucionado bajo la atenta mirada de la W3C, pero ya son tratados como los bloques de construcci�n para la siguiente revoluci�n en programaci�n distribuida y en la industria de IT en general. Los servicios Web prometen hacer a la comunicaci�n m�quina-a-m�quina lo que la Web ha hecho para la comunicaci�n humano-a-humano y m�quina-a-humano.

Sin embargo, debido a la evoluci�n natural de los servicios web est�ndar junto las distintas herramientas y plataformas relacionadas, el impacto total est� lejos todav�a.

.�Servicios Web en Java:

Como se discuti� anteriormente, los servicios web est�ndar a�n est�n evolucionando y su soporte en Java tambi�n. Aunque los servicios Web inicialmente fueron promovidos por Microsoft e IBM, con la liberaci�n del J2EE 1.4, Sun ha proporciona soporte total para los servicios web.

En el entorno J2EE los servicios web se construyen sobre JAX-RPC (Java API for XML-based RPC). Este es un API para construir servicios web y clientes que utilizan llamadas a procedimientos remotos (RPC) y XML.

En JAX-RPC, una llamada a un procedimiento remoto est� representada por un protocolo basado en XML, como SOAP. La especificaci�n SOAP define la envoltura estructural, las reglas de codificaci�n y la convenci�n para representar llamadas y respuestas a procedimientos remotos. Estas llamadas y respuestas se transmiten como mensajes SOAP (ficheros XML) sobre HTTP. Aunque los mensajes SOAP son un poco complejos, esta complejidad es transparente para el desarrollador. Cuando se desarrollan las implementaciones del lado del cliente y del servidor, los desarrolladores no tienen que generar mensajes SOAP porque estos los generan las llamadas al API JAX-RPC.

En el lado del servidor, el desarrollador especifica los procedimientos remotos definidiendo m�todos de un interface escrito en Java. El desarrollador tambi�n codifica una o m�s clases que implementan esos m�todos. Los programas cliente tambi�n son f�ciles de codificar. Un cliente crea un proxy, un objeto local que representa el servicio, y luego simplemente llama a los m�todos del proxy. Con JAX-RPC, el desarrollador no tiene que generar o analizar mensajes SOAP. Es el sistema de ejecuci�n JAX-RPC el que convierte las llamadas y respuestas a/desde el API a mensajes SOAP.

Para este tutorial, utilizaremos la librer�a Axis de Apache, que es una iniciativa de c�digo abierto de la Apache Software Foundation (ASF). Axis es un motor SOAP compatible JAX-RPC. Puede integrarse con contendores web como Tomcat/Jetty, lo que permite utilizar muchas caracter�sticas de esos contenedores como la seguridad, los repositorios de recursos, multi-threads, etc.

Nota:
JAX-RPC est� basado en JSR-101, que di� el primer paso en la definici�n de un conjunto de APIs Java est�ndars y un modelo de programaci�n para desarrollar y desplegar servicios web en la plataforma Java.
Otra especificaci�n que est� evolucionando es la JSR-109. Esta est� construida sobre JAX-RPC. Define un mecanismo est�ndar para desplegar servicios web en un entorno J2EE, m�s espec�ficamente en el �rea de la tecnolog�a Enterprise JavaBean (EJB) y los contenodres de servlets.
Jboss.3.2.x viene con soporte integrado para los servicios web proporcionado por Jboss.Net. Jboss.NET tiene Apache AXIS como un plugin de servicio para el Jboss-Microkernel. Jboss.Net utiliza el sistema de despliegue interno de JBOSS que entiende el empaquetado de ficheros WSR [Web Service aRchive (WSR- o .wsr-) que normalmente son ficheros .jar normales que contienen, junto a los byte codes necesarios para conectarse a la maquinaria Axis, un descriptor de despliegue Axis ligeramente extenddio en su entrada "META-INF/web-service.xml"]. Actualmente, no hay disponibles muchos servidores de aplicaciones que soporten el despliegue WSR, lo que puede resultar en problemas de portabilidad.
Por lo tanto, este tutorial utilizar� Apache-AXIS 1.1 para crear y desplegar servicios Web.

.�Instalar AXIS:

Descarga la forma binaria de Apache-Axis desde: http://ws.apache.org/axis/

  1. Primero crea un directorio llamado axis bajo /opt y luego graba este fichero bajo /opt/axis/.
    [vishal@vishal axis]$ pwd 
    /opt/axis 
    [vishal@vishal axis]$ ls 
    axis-1_1.tar.gz
    
  2. Ahora descomprime el fichero. Se crear� un nuevo directorio llamado axis-1_1:
    [vishal@vishal axis]$ tar -xvzf axis-1_1.tar.gz 
    axis-1_1/ 
    axis-1_1/docs/ 
    axis-1_1/docs/ant/ 
    axis-1_1/docs/ant/ant.html 
    axis-1_1/docs/ant/axis-admin.html 
    ----------------------------------------------------- 
    ---------------------------------------------------- 
    ------------------------------------------------------ 
    axis-1_1/xmls/ 
    axis-1_1/xmls/checkstyle.xml 
    axis-1_1/xmls/deploy_catalina_local.xml 
    axis-1_1/xmls/path_refs.xml 
    axis-1_1/xmls/properties.xml 
    axis-1_1/xmls/targets.xml 
    axis-1_1/xmls/taskdefs.xml 
    axis-1_1/xmls/taskdefs_post_compile.xml. 
    [vishal@vishal axis]$ ls 
    axis-1_1 axis-1_1.tar.gz 
    [vishal@vishal axis]$ 
    
  3. Abajo puedes ver la estructura de directorios:
    [vishal@vishal axis]$ pwd 
    /opt/axis 
    [vishal@vishal axis]$ ls 
    axis-1_1 axis-1_1.tar.gz 
    [vishal@vishal axis]$ cd axis-1_1 
    
    
    [vishal@vishal axis-1_1]$ ls 
    docs lib LICENSE README release-notes.html samples webapps xmls 
    
    
    [vishal@vishal axis-1_1]$ pwd 
    /opt/axis/axis-1_1 
    
    
    [vishal@vishal axis-1_1]$ cd lib/ 
    
    
    [vishal@vishal lib]$ ls 
    axis-ant.jar commons-discovery.jar jaxrpc.jar saaj.jar 
    axis.jar commons-logging.jar log4j-1.2.8.jar wsdl4j.jar 
    [vishal@vishal lib]$
    
  4. Ya est� instalado Axis, ahora tenemos que configurarlo para utilizarlos con el servidor de aplicaciones Jboss-3.2.1.

.�Configurar AXIS con JBOSS:

  1. Para configurar Jboss con Axis, primero ve al directorio $JBOSS_HOME/server/default/deploy:
    [vishal@vishal deploy]$ pwd 
    /opt/jboss/jboss-3.2.1/server/default/deploy 
    [vishal@vishal deploy]$ 
    
  2. Crea un directorio llamado webapps:
    [vishal@vishal deploy]$ ls 
    cache-invalidation-service.xml jbossweb-jetty.sar MyStoreMgr.jar 
    cluster-service.xml jboss-xa-jdbc.rar OnlineStore.war 
    farm-service.xml jms properties-service.xml 
    hsqldb-ds.xml jmx-console.war schedule-manager-service.xml 
    http-invoker.sar jmx-ejb-connector-server.sar scheduler-service.xml 
    iiop-service.xml jmx-invoker-adaptor-server.sar sqlexception-service.xml 
    jbossha-httpsession.sar jmx-rmi-adaptor.sar transaction-service.xml 
    jboss-jca.sar mail-service.xml user-service.xml 
    jboss-local-jdbc.rar management uuid-key-generator.sar 
    jboss-net.sar MyFirstBean.jar 
    jbossweb-ejb.jar MySecondBean.jar 
    
    
    [vishal@vishal deploy]$ mkdir webapps 
    
    
    [vishal@vishal deploy]$ ls 
    cache-invalidation-service.xml jbossweb-jetty.sar MyStoreMgr.jar 
    cluster-service.xml jboss-xa-jdbc.rar OnlineStore.war 
    farm-service.xml jms properties-service.xml 
    hsqldb-ds.xml jmx-console.war schedule-manager-service.xml 
    http-invoker.sar jmx-ejb-connector-server.sar scheduler-service.xml 
    iiop-service.xml jmx-invoker-adaptor-server.sar sqlexception-service.xml 
    jbossha-httpsession.sar jmx-rmi-adaptor.sar transaction-service.xml 
    jboss-jca.sar mail-service.xml user-service.xml 
    jboss-local-jdbc.rar management uuid-key-generator.sar 
    jboss-net.sar MyFirstBean.jar webapps 
    jbossweb-ejb.jar MySecondBean.jar 
    [vishal@vishal deploy]$ 
    
  3. Ahora ve al directorio /opt/axis/axis-1_1/webapps. Copia el directorio axis a $JBOSS_HOME/server/all/deploy/all/webapps/:
    [vishal@vishal webapps]$ pwd 
    /opt/axis/axis-1_1/webapps 
    [vishal@vishal webapps]$ ls 
    axis 
    [vishal@vishal webapps]$ cp -r axis /opt/jboss/jboss-3.2.1/server/all/deploy/webapps/. 
    [vishal@vishal webapps]$ 
    
  4. Vuelve al directorio $JBOSS_HOME/server/all/deploy/webapps/ y renombra el directorio axis como axis.war:
    [vishal@vishal webapps]$ pwd 
    /opt/jboss/jboss-3.2.1/server/all/deploy/webapps 
    [vishal@vishal webapps]$ ls 
    axis 
    [vishal@vishal webapps]$ mv axis axis.war 
    [vishal@vishal webapps]$ ls 
    axis.war 
    [vishal@vishal webapps]$ 
    
    Nota:
    Se ha renombrado el directorio axis como axis.war para que JBOSS pueda reconocerlo como una aplicaci�n web y as� el contenedor web pueda desplegarla en tiempo de ejecuci�n.
  5. Ahora desde dentro de Eclipse arranca tu servidor de aplicaciones (JBOOS), si no est� ejecut�ndose. Si no lo est� no lo reinicies, se desplegar� en caliente la aplicaci�n axis.war.
    Asegurate de que tienes todas las librer�as que vienen con AXIS en el classpath ($CLASSPATH o $AXISCLASSPATH):
    [vishal@vishal lib]$ pwd 
    /opt/jboss/jboss-3.2.1/server/all/deploy/webapps/axis.war/WEB-INF/lib 
    [vishal@vishal lib]$ ls 
    axis-ant.jar commons-discovery.jar jaxrpc.jar saaj.jar 
    axis.jar commons-logging.jar log4j-1.2.8.jar wsdl4j.jar 
    [vishal@vishal lib]$ echo $AXISCLASSPATH 
    /opt/axis/axis-1_1/lib/axis.jar:/opt/axis/axis-1_1/lib/jaxrpc.jar:
    /opt/axis/axis-1_1/lib/saaj.jar:/opt/axis/axis-1_1/lib/wsdl4j.jar:
    /opt/axis/axis-1_1/lib/commons-discovery.jar:
    /opt/axis/axis-1_1/lib/commons-logging.jar:. 
    [vishal@vishal lib]$ 
    
  6. Ahora para probar tu configuraci�n ve a http://127.0.0.1:8080/axis/
    Nota:
    El n�mero de puerto ser� diferente si lo has variado del valor por defecto.

    Deber�as poder ver la siguiente p�gina de inicio de Apache-Axis. Si no es as�, quiere decir que no has instalado bien la aplicaci�n webapp o no est� ejecut�ndose el servidor de aplicaciones:

  7. Ahora valida la configuraci�n de la instalaci�n local pulsando en el enlace 'Validate the local installation's configuration':

    Esto te presentar� la p�gina de prueba happyaxis.jsp, que verifica si est�n presentes las librer�as necesarias y opcionales. La URL para �sta ser� algo como: http://localhost:8080/axis/happyaxis.jsp:

    Si falta alguna de las librer�as necesarias, AXIS, no funcionar�.

    Los componentes opcionales, son eso, opcionales; instalalos si los necesitas. Si lo �nico que ves es un error interno del servidor y una pila de excepciones, probablemente tendr�s varios analizadores XML en tu CLASSPATH (o AXISCLASSPATH), y est�n causando confusiones de versiones.

  8. Ve de nuevo a la p�gina de incio de Apache AXIS y selecciona la lista de servicios web desplegados. Pulsando sobre View the list of deployed Web services.
    Nota:
    Hay unos cuantos servicios web que vienen dentro del paquete de Apache-AXIS para ayudarnos con la curva de aprendizaje.
  9. Para asegurarte que tu servicio web se est� ejecutando, pulsa sobre cada WSDL (Web Service Description Language) seg�n la figura anterior. Por ejemplo, si pulsamos sobre AdminService (WSDL) estar� disponible la siguiente pantalla:

Antes de escribir nuestro primer servicio web, probaremos uno de los servicios de ejemplo que se han desplegado como parte del paquete Apache-Axis.

Ahora, SOAP 1.1 utiliza HTTP POST para enviar una solicitud XML al endpoint, pero Axis tambi�n soporta el mecanismo de acceso HTTP GET, que es muy �til para prop�sitos de pruebas. Para probar el servicio, recuperaremos la versi�n de Axis desde el endpoint llamado version, llamando al m�todo getVersion; con la URL:

http://localhost:8080/axis/services/Version?method=getVersion

Esto mostrar� la siguiente pantalla:

Ahora que hemos probado un servicio web, escribamos el nuestro para extender la aplicaci�n Mystore de este tutorial.

Crearemos un servicio web llamado MyStoreLoginService, que permita al usuario entrar en MyStore utilizando un cliente Java, pero utilizando un servicio web (HTTP) en vez de RMI, que es el caso normal cuando se utilizan Servlets/JSPs o un cliente Java. StoreAccessBean actuar� como un endpoint.

Nota:
Lomboz-2.1_02 con Eclipse 2.1 y Lomboz 2.1.1 con Eclipse 2.1.1 no tienen un wizard para crear un servicio web (es decir un Web Service Deployment Descriptor [WSDD]) y desplegarlo. Por eso tendremos que hacerlo manualmente. Ambas versiones de Lomboz si proporcionan un wizard para crear clientes SOAP.

.�Crear el Servicio Web:

Para crear un servicio web necesitamos crear un endpoint. En este caso nuestro bean sin estado StoreAccessBean actuar� como un endpoint. Se llamar� al m�todo loginUser desde el lado del cliente utilizando este servicio web, por eso tenemos que crear un fichero Web Service Deployment Descriptor (WSDD) describiendo la firma del m�todo loginUser junto con alguna otra informaci�n necesaria.

Nota:
Actualmente, s�lo se pueden utilizar como endpoint para un servicio web los Beans de Sesi�n sin estado, seg�n se especifica en JSR-109.
WSDD es un fichero espec�fico de AXIS, utilizado para crear un esqueleto para JAX-RPC. Esto es transparente para el desarrollador, y una vez que se crea y despliega este esqueleto, AXIS genera el WSDL y publica el servicio Web.
Para m�s informaci�n: http://ws.apache.org/axis/
  1. Ahora, en Eclipse ve al explorador de paquetes, expande el nodo Mystore, selecciona src, pulsa con el bot�n derecho y aparecer� un men� desplegable.
  2. En el men� pulsa sobre New y elige Package; pon au.com.tusc.WebService como el nombre de paquete y pulsa Finish.
  3. Ve a src/au.com.tusc.WebService y selecciona New > File:
  4. Ahora crea un fichero llamado deploy.wsdd en el paquete au.com.tusc.WebService:
  5. A�ade las siguientes etiquetas XML al fichero deploy.wsdd:

Examinemos estos descriptores de despliegue:

<service name="MyStoreLoginService" provider="java:EJB">

Esta etiqueta es la responsable de dar el nombre del servicio y el proveedor. El proveedor indica que el servicio web es un servicio EJB-Web. El nombre del servicio ser� MyStoreLoginService y el proveedor ser� java:EJB.

<parameter name="beanJndiName" value="StoreAccessLocal"/>

El primer par�metro es beanJndiName que especifica d�nde est� el bean (EJB) en el �rbol JNDI. Estamos utilizando los interfaces locales de StoreAccessBean, por lo tanto es StoreAccessLocal.

Nota:
Utilizamos interfaces no-locales para StoreAccessBean hasta la p�gina anterior, cuando se accede al bean mediante componentes Web y Clientes Java. Como todos los componentes est�n en la misma JVM, normalmente utilizamos interfaces locales ya que �stos tienen muchas ventajas en comparaci�n con los interfaces remotos:
  1. Modelo de programaci�n m�s sencillo, no necesitan capturar excepciones remotas que no pueden suceder en un entorno local.
  2. Como no se necesita tener RemoteException en todas las firmas de m�todos, nuestro interface de m�todos de negocio del EJB es independiente. Esto puede liberar a los llamadores de la dependencia del API EJB.
  3. Como se est�n ejecutando en la misma JVM y no est�n en un entorno distribuido, aunque est� codificados como llamada-por-valor se ejecutan como llamada-por-referencia.
<parameter name="homeInterfaceName" 
value="au.com.tusc.session.StoreAccessLocalHome"/>

Este par�metro tiene el valor del Interface Remote Home Local que es au.com.tusc.session.StoreAccessLocalHome

<parameter name="remoteInterfaceName"
value="au.com.tusc.session.StoreAccessLocal"/>

El valor de este par�metro es el interface Remote Local que es au.com.tusc.session.StoreAccessLocal

<parameter name="allowedMethods" value="loginUser"/>

Este par�metro tiene el valor loginUser para indicar que est� m�todo ser� el �nico que se har� p�blico y al que se podr� acceder desde el cliente. El resto de par�metros son espec�ficos del servidor de aplicaciones, en este caso JBOSS.

.�Desplegar el Servicio Web:

Para desplegar esto tenemos que ir a la consola Linux (o una consola DOS en Windows).

Ahora, asumiendo que se est� ejecutando el servidor de aplicaciones (JBOSS) y que se ha desplegado nuestro bean (todos los beans est�n en el fichero MyStore.jar como vimos en p�ginas anteriores).

  1. Ve al directorio donde creaste el fichero deploy.wsdd:
    [vishal@vishal WebService]$ pwd 
    /home/vishal/workspace/MyStore/src/au/com/tusc/WebService 
    [vishal@vishal WebService]$ ls 
    deploy.wsdd 
    [vishal@vishal WebService]$
    
    Nota:
    Aseg�rate de que $AXISCLASSPATH est� configurada correctamente.
    [vishal@vishal WebService]$ echo $AXISCLASSPATH
    /opt/axis/axis-1_1/lib/axis.jar:/opt/axis/axis-1_1/lib/jaxrpc.jar:
    /opt/axis/axis-1_1/lib/saaj.jar:/opt/axis/axis-1_1/lib/wsdl4j.jar:
    /opt/axis/axis-1_1/lib/commons-discovery.jar:
    /opt/axis/axis-1_1/lib/commons-logging.jar:.
    [vishal@vishal WebService]$
    
  2. Ahora utilizaremos la clase AdminClient (org.apache.axis.client.AdminClient) que forma parte del API de AXIS, para desplegar el WSDD.
    Nota:
    Por defecto utiliza el puerto 8080, pero si tienes que utilizar un puerto diferente utiliza la opci�n -p <puerto>.

    Utiliza este comando para desplegar el WSDD:
    
    [vishal@vishal WebService]$ java org.apache.axis.client.AdminClient deploy.wsdd 
    Processing file deploy.wsdd 
    <Admin>Done processing</Admin> 
    [vishal@vishal WebService]$
    
    
    Nota:
    La clase AdminClient se puede utilizar tanto desde la l�nea de comandos como program�ticamente.

Ahora accedamos a nuestro servicio Web mediante su correspondiente Web Service Description Language (WSDL).

  1. Ve a la siguiente URL: http://localhost:8080/axis/servlet/AxisServlet para ver todos los servicios desplegados:
  2. Pulsa sobre el enlace wsdl y se mostrar� el WSDL generado por AXIS para el servicio web desplegado:
  3. Ahora graba este WSDL ya que lo necesitaremos para crear el cliente SOAP utilizando el wizard de Lomboz. Graba este fichero en el paquete au.com.tusc.WebService:
    Nota:
    El wizard de Lomboz para crear clientes SOAP utiliza la herramienta WSDL2Java, que construir� proxies Java y esqueletos para servicios con descriptores WSDL. Esta herramienta viene con la distribuci�n de Apache-AXIS.
  4. Ahora vuelve a Eclipse y refresca tu proyecto. Deber� aparecer MyStoreLoginService.wsdl, como se ve en la siguiente imagen:

Como ya hemos desplegado con �xito el servicio web es hora de crear el test de cliente.

.�Crear el Test de Cliente para el Servicio Web:

Ahora, Lomboz (versiones 2.1_02 y 2.1.1) proporcionan un wizard para crear clientes SOAP para publicar servicios Web utilizando sus ficheros WSDL correspondientes.

Pero antes de hacer esto, necesitamos un paso m�s para asegurarnos de que tenemos todas las librer�as necesarias en el classpath para generar el esquelo para el cliente SOAP. Esta son las mismas ya utilizadas para $AXISCLASSPATH.

Nota:
Esto se puede configurar a�adiendo las librer�as necesarias al fichero jboss321all.server, utilizado para configurar Lomboz con Exlipse.
  1. Ve al Explorador de Proyectos y selecciona el proyecto MyStore, pulsa con el bot�n derecho y selecciona properties.
  2. Dentro de Properties selecciona Java Build Path y selecciona la pesta�a Libraries.
  3. Pulsa Add External jars:
  4. Importa las siguiente librer�as:
    axis.jar, 
    jaxrpc.jar, 
    saaj.jar, 
    wsdl4j.jar, 
    commons-discovery.jar, 
    commons-logging.jar
    
    Nota:
    Lomboz 2.1_02 y 2.1.1 viene con estas librer�as. Como est�mos utilizando la �ltima versi�n de Apache-AXIS (V1.1), es mejor importar las librer�as m�s nuevas.
  5. Ahora dentro del explorador de paquetes ve a src/au.com.tusc.WebService y pulsa con el bot�n derecho..
  6. En el men� que aparece pulsa New y selecciona Lomboz SOAP client Wizard.
  7. En el SOAP Client Wizard selecciona MyStoreLoginService.wsdl. Tambi�n selecciona el checkbox con el nombre Add Axis to buildpath. Y dentro de namespace mapping pon el nombre del paquete: au.com.tusc.WebService:
  8. Pulsa Finish.

Esto crear� el esqueleto (stub) para el cliente utilizando los cuatro ficheros que hay en au.com.tusc.WebService:

Ahora escribamos el test de cliente:

  1. Ve a src/au.com.tusc.WebService y a�ade un fichero llamado TestClient.java.
  2. A�ade el siguiente c�digo a este fichero:

Examinemos las dos sentencias principales:

StoreAccessLocalServiceLocator service = new StoreAccessLocalServiceLocator();

Esta sentencia es necesaria para que el objeto ServiceLocator devuelva el endpoint del servicio web que utilizaremos para llamarlo. En este caso el punto final es http://localhost:8080/axis/services/MyStoreLoginService.

StoreAccessLocal port = service.getMyStoreLoginService();

Esta sentencia devuelve la referencia al interface local del bean para poder llamar a los m�todos necesarios.

Nota:
En Axis 1.1 hay cuatro estilos diferentes de servicios como se especifica en la guia de usuario que viene con la distribuci�n de Apache-AXIS:
  1. Los servicios RPC utilizan convenciones SOAP RPC, y tambi�n la "seccion 5" de SOAP (codificaci�n). el cliente que est�mos creando utiliza este estilo.
  2. Los servicios de documentos no utilizan ninguna codificaci�n (por eso no ver�s serializaci�n de objetos multireferencias o arrays de estilo SOAP por la red) paro a�n hay que hacer uniones de datos XML<->Java.
  3. Los servicios envoltura son como los servicios de documentos, excepto en que vez de unir todo el cuerpo SOAP en una gran estructura utilizan "unwrap" en par�metros individuales. Lo clientes web que veremos m�s adelante utilizan este estilo de servicio.
  4. Los servicios de mensaje reciben y devuelven XML arbitrario en el SOAP Envelope sin ning�n tipo de mapeo/uni�n de datos. Si quieres trabajar con XML en bruto como entrada y salida de los SOAP Envelopes, escribe un servicio de mensaje.

.�Probar tu Cliente:

  1. Para probar tu cliente selecciona el nodo au.com.tusc.WebService.TestClient, ve al men� superior y selecciona el icono del "hombre corriendo".
  2. Selecciona Java Application.

Ahora, si en la consola puedes ver los siguientes mensajes, es que todo ha tenido �xito:

Has aprendido como crear, desplegar y acceder a servicios web utilizando un cliente Java. Tambi�n se puede acceder a este servicio web utilizando componentes web (servlets/JSPs).

Nota:
Hay tres formas diferentes para crear clientes de servicios web:
  1. Utilizando el cliente Static Stub implementado en el ejemplo descrito arriba.
  2. El cliente Dynamic Proxy.
  3. El Cliente Dynamic Invocation Interface (DII) utilizando en el cliente Web implementado en la siguiente seccion.

.�Crear un Cliente Web:

Los pasos necesarios para crear un cliente web se vieron en la p�gina anterior, por eso dejemos los detalles, y entremos directamente a a�adir las siguientes l�neas a nuestro servlet llamado Login del paquete au.com.tusc.WebService:


package au.com.tusc.WebService;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

/**
 * @author vishal
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class Login extends HttpServlet {
        
     public void init(ServletConfig config) throws ServletException {
          super.init(config);
          System.out.println("Entering Login.init()") ;
          System.out.println("Leaving Login.init()") ;
     }
        
     protected void doGet(HttpServletRequest request,HttpServletResponse response)
          throws ServletException, IOException {
          processRequest(request, response);
     }

     protected void doPost(HttpServletRequest request,HttpServletResponse response)
           throws ServletException, IOException {               
           processRequest(request, response);
    }
    
    protected void processRequest (HttpServletRequest request, 
             HttpServletResponse response) throws ServletException, IOException {
           System.out.println("Entering Login.processRequest()");
           response.setContentType("text/html");
           PrintWriter out = response.getWriter ();
           out.println("<html><title>MyStore Login</title>");
           out.println("<body><destacar><h2>Welcome to MyStore </h2></destacar></body>");
           out.print("<body><h2>Login details : UserID is :   ");
           try {
               String username =    callWebService();
               out.print(username);              
           } catch (Exception e) {
                System.out.println("Exception in Login.processRequest ");
           }
           out.print("</h2></body></html>");
           if ( out != null ) out.close();                                                        
           System.out.println("Leaving Login.processRequest()");         
      }
     
      private String callWebService() throws Exception {
    
           // URL is used for creating the call, which uses the WSDL.  
           Call call = new Call( new 
               URL("http://localhost:8080/axis/services/MyStoreLoginService?wsdl") );
              
           // Calls the object, passing in the username and passwd. 
           //The return value is stored as an object.
           String username = (String) call.invoke ("loginUser", 
                new Object[] { new String("ANDY") , new String("PASSWD") } );
           return username;    
      }
}

Nota:
Otra forma de llamar al m�todo loginUser es utilizar la implementaci�n del Interface Service ue hace AXIS del JAXRPC Dynamic Invocation Interface. La clase Service se deber�a utilizar como un punto de entrada para acceder a servicios SOAP. Normalmente, un servicio se crear� con un documento WSDL, y junto con el nombre del servicio puedes pedir un objeto Call que te permitir� llamar al servicio web. Abajo tienes otra forma de implementar el m�todo callWebService(). Ambas versiones de este m�todo utilizan la aproximaci�n DII.
        private String callWebService() throws Exception {

           // Endpoint is used for making the call
           String endpoint = "http://localhost:8080/axis/services/MyStoreLoginService";

           // The Service object is the starting point for accessing the web service.
           Service service = new Service();

           // The call object is used to actually invoke the web service.
           Call call = (Call)service.createCall();

           // Sets the call objects endpoint address
           call.setTargetEndpointAddress(endpoint);

           // Sets the operation name associated with this Call object. 
           call.setOperationName(new QName("loginUser"));

           // Calls the object, passing in the username and passwd. 
           //The return value is stored as an object.
           Object returnValue = call.invoke(new Object[] { 
               new String("ANDY") , new String("PASSWD") });
           return (String) returnValue;
     }
Nota:
La diferencia entre las dos aproximaciones es que el interface Call proporciona soporte para la invocaci�n din�mica de un servicio endpoint mientras que la clase Service act�a como una factor�a de proxies din�micos para el servicio endpoint objetivo.

Abajo tambi�n puedes ver el fichero web.xml donde se muestra el nombre de acceso al bean y su mapeo:

Una vez que has completado el servlet, despliega el m�dulo OnlineStore. Si no hay mensajes de error en la consola es que todo ha ido bien.

Para llamar a el m�todo login del servicio web publicado ve a la URL:

http://localhost:8080/OnlineStore/login
.

Si puedes ver la siguiente pantalla es que tu llamada ha tenido �xito.

Muy bien, ya hemos visto como acceder a servicios web utilizando clientes web y clientes Java desde el mismo entorno.

Lo m�s interesante de los servicios web es poder acceder a ellos desde distintos entornos, se podr�a acceder a nuestro servicio web utilizando un cliente VB.NET (un cliente Microsoft). [Pero eso es cosa de otro Tutorial y de otra Zona...]

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO