|
Buscador
Secciones
Otras zonas
Registro
Foros
Recomendamos
|
|
|
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. |
[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]$
|
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:

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.
|
Nota:
Hay unos cuantos servicios web que vienen dentro del paquete de Apache-AXIS para ayudarnos con la curva de aprendizaje. |


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/ |



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:
|
<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).
[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]$ |
|
Nota:
Por defecto utiliza el puerto 8080, pero si tienes que utilizar un puerto diferente utiliza la opción -p <puerto>. |
[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).


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


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

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

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:

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:
|
Probar tu Cliente: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:
|
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...]
| Leer comentarios (74) | |
| Escribir comentario | |
| Puntuación: |
|
| Votar | |
| Recomendar este tutorial | |
| Estadísticas |
Copyright © 1999-2007
Programación en castellano.
Todos los derechos reservados.
Formulario de Contacto -
Datos legales -
Publicidad
Hospedaje web y servidores dedicados linux por Ferca Network
red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados