Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
con Axis
Dr. Diego Lz. de Ipia Gz. de Artaza
http://paginaspersonales.deusto.es/dipina
http://paginaspersonales.deusto.es/dipina/cursos/J2EECesine.zi
p
dipina@eside.deusto.es
Introduccin I
Introduccin II
SOA
http://msdn.microsoft.com/Longhorn/understa
nding/pillars/Indigo/default.aspx?
pull=/library/en-us/dnbda/html/srorientwp.asp
Servicios Web
http://www.w3.org/TR/SOAP
SOAP
http://www.w3.org/2000/xp/Group/
Es un protocolo de transporte
Peticin SOAP
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/
soap/envelope/">
<soap:Body>
<getProductDetails
xmlns="http://warehouse.example.com/ws"
>
<productId>827635</productId>
</getProductDetails>
</soap:Body>
</soap:Envelope>
Respuesta SOAP
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetailsResponse
xmlns="http://warehouse.example.com/ws">
<getProductDetailsResult>
<productName>Toptimate 3-Piece Set</productName>
<productId>827635</productId>
<description>3-Piece luggage set. Black
Polyester.</description>
<price>96.50</price>
<inStock>true</inStock>
</getProductDetailsResult>
</getProductDetailsResponse>
</soap:Body>
</soap:Envelope>
Apache AXIS
Incluye un servidor
Un servlet que se integra con motores de servlets como
Tomcat
Soporte extensivo del estndar Web Service Description
Language (WSDL)
Una herramienta para generar clases Java a partir de
WSDL
Un conjunto de aplicaciones de ejemplo
Una herramienta para la monitorizacin de los paquetes
TCP/IP
WS-*
Apache Axis
Caractersticas AXIS
Proceso de Generacin de
Programas con Axis
Instalacin Axis
1.
2.
3.
4.
Instalacin Axis
Arrancar el servidor web
Validar la instalacin:
http://127.0.0.1:8080/axis/
(hacer clic en Validate)
Validar un SOAP endpoint:
http://localhost:8080/axis/s
ervices/Version?method=
getVersion
5.
6.
7.
Revisar ejemplo:
http://localhost:8080/axis/EchoH
eaders.jws?method=list
1.
2.
2.
3.
4.
Consumiendo un Servicio
Web
Consumiendo un Servicio
Web
Consumiendo un Servicio
Web
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
public class EchoClient
{
public static void main(String [] args) {
try {
String endpoint = "http://localhost:8080/axis/Echo.jws";
Service service = new Service();
Call
call
= (Call) service.createCall();
);
Consumiendo un Servicio
Web
Consumiendo un Servicio
Web
Consumiendo un Servicio
Web
Publicando un Servicio
Web con AXIS
Revisar
samples/userguide/example2/Calculator.java
Calculator.java
public class Calculator {
public int add(int i1, int i2)
{
return i1 + i2;
}
public int subtract(int i1, int i2)
{
return i1 - i2;
}
}
CalcClient.java
import
import
import
import
org.apache.axis.client.Call;
org.apache.axis.client.Service;
org.apache.axis.encoding.XMLType;
org.apache.axis.utils.Options;
import javax.xml.rpc.ParameterMode;
public class CalcClient
{
public static void main(String [] args) throws Exception {
Options options = new Options(args);
String endpoint = "http://localhost:" + options.getPort() +
"/axis/Calculator.jws";
args = options.getRemainingArgs();
if (args == null || args.length != 3) {
System.err.println("Usage: CalcClient <add|subtract> arg1 arg2");
return;
}
String method = args[0];
if (!(method.equals("add") || method.equals("subtract"))) {
System.err.println("Usage: CalcClient <add|subtract> arg1 arg2");
return;
}
CalcClient.java
Integer i1 = new Integer(args[1]);
Integer i2 = new Integer(args[2]);
Service
Call
Custom Deployment
Por ejemplo:
<service name="MyService"...>
<parameter name="scope" value=request"/>
...
</service>
Utilizando el AdminClient
La clase
org.apache.axis.client.AdminClient
permite el envo del fichero de explotacin al
servidor Tomcat, si est escuchando en un
puerto diferente al 8080 hay que enviar el
parmetro p <port>.
java org.apache.axis.client.AdminClient
deploy.wsdd
java org.apache.axis.client.AdminClient list
java org.apache.axis.client.AdminClient
undeploy.wsdd
Revisar samples/userguide/example3.
Manejadores y Cadenas
Manejadores y Cadenas
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- define the logging handler configuration -->
<handler name="track"
type="java:samples.userguide.example4.LogHandler">
<parameter name="filename" value="MyService.log"/>
</handler>
<!-- define the service, using the log handler we just defined -->
<service name="LogTestService" provider="java:RPC">
<requestFlow>
<handler type="track"/>
</requestFlow>
<parameter name="className"
value="samples.userguide.example4.Service"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
2.
3.
4.
5.
6.
7.
8.
9.
10.
MyService.java
package ej3customdeployment;
public class MyService
{
public String serviceMethod(String arg)
{
return arg;
}
}
Client.java
package ej3customdeployment;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
public class Client
{
public static void main(String [] args)
{
try {
Options options = new Options(args);
String endpointURL = options.getURL();
String textToSend;
args = options.getRemainingArgs();
if ((args == null) || (args.length < 1)) {
textToSend = "<nothing>";
} else {
textToSend = args[0];
}
Service service = new Service();
Call
call
= (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
call.setOperationName( new QName("http://ej3_customdeployment", "serviceMethod") );
call.addParameter( "arg1", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
String ret = (String) call.invoke( new Object[] { textToSend } );
System.out.println("You typed : " + ret);
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
deploy.wsdd/undeploy.wsd
d
deploy.wsdd
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/ja
va">
<service name="MyService" provider="java:RPC">
<parameter name="className"
value="ej3customdeployment.MyService"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
undeploy.wsdd
<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
<service name="MyService"/>
</undeployment>
byte[]
xsd:boolean
boolean
xsd:byte
byte
xsd:dateTime
java.util.Calendar
xsd:decimal
java.math.BigDecimal
xsd:double
double
xsd:float
float
xsd:hexBinary
byte[]
xsd:int
int
xsd:integer
java.math.BigInteger
xsd:long
long
xsd:QName
javax.xml.namespace.QName
xsd:short
short
xsd:string
java.lang.String
Pasando Objetos en
Servicios Web
Revisar ejemplo:
samples/userguide/example5/BeanService.java
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/ja
va">
<service name="OrderProcessor" provider="java:RPC">
<parameter name="className"
value="samples.userguide.example5.BeanService"/>
<parameter name="allowedMethods"
value="processOrder"/>
<beanMapping qname="myNS:Order"
xmlns:myNS="urn:BeanService"
languageSpecificType="java:samples.userguide.example5.Or
der"/>
</service>
</deployment>
Pasando Objetos en
Servicios Web
La interfaz al servicio
Los parmetros que acepta
La localizacin del servicio
Su uso sera:
java org.apache.axis.wsdl.WSDL2Java
(WSDL-file-URL)
WSDL2Java
WSDL clause
A java class
A java interface
A stub class
A service interface
Mapeo Tipos
<xsd:complexType name="phone">
<xsd:all>
<xsd:element name="areaCode" type="xsd:int"/>
<xsd:element name="exchange" type="xsd:string"/>
<xsd:element name="number" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
Mapeara a:
public class Phone implements java.io.Serializable {
public Phone() {...}
public int getAreaCode() {...}
public void setAreaCode(int areaCode) {...}
public java.lang.String getExchange() {...}
public void setExchange(java.lang.String exchange) {...}
public java.lang.String getNumber() {...}
public void setNumber(java.lang.String number) {...}
public boolean equals(Object obj) {...}
public int hashCode() {...}
}
Mapeo Parmetros de
Entrada/Salida
package samples.addr.holders;
public final class PhoneHolder implements
javax.xml.rpc.holders.Holder {
public samples.addr.Phone value;
public PhoneHolder()
{
}
public PhoneHolder(samples.addr.Phone value) {
this.value = value;
}
}
Mapeo PortTypes
<message name="empty">
<message name="AddEntryRequest">
<part name="name" type="xsd:string"/>
<part name="address" type="typens:address"/>
</message>
<portType name="AddressBook">
<operation name="addEntry">
<input message="tns:AddEntryRequest"/>
<output message="tns:empty"/>
</operation>
</portType>
Mapeara a:
public interface AddressBook extends java.rmi.Remote {
public void addEntry(String name, Address address) throws
java.rmi.RemoteException;
}
Mapeo Bindings
Lo siguiente:
public class AddressBookSOAPBindingStub extends org.apache.axis.client.Stub
implements AddressBook {
public AddressBookSOAPBindingStub() throws org.apache.axis.AxisFault
{...}
Servicios
Como:
public interface AddressBookService extends javax.xml.rpc.Service {
public String getAddressBookAddress();
public AddressBook getAddressBook() throws javax.xml.rpc.ServiceException;
public AddressBook getAddressBook(URL portAddress) throws
javax.xml.rpc.ServiceException;
}
WSDL2Java will also generate the locator which implements this interface:
public class AddressBookServiceLocator extends org.apache.axis.client.Service
implements AddressBookService {
...
Bindings en la Parte
Servidora: Skeleton
Bindings en la Parte
Servidora: Skeleton
WSDL clause
For each binding
Los Skeleton
java
org.apache.axis.wsdl.WSDL2Java
--server-side AddressBook.wsdl
cd AddressFetcher2
javac *.java
java
org.apache.axis.client.AdminClie
nt deploy.wsdd
Herramienta Java2WSDL
1.
Herramienta Java2WSDL
2.
Java2WSDL
3.
El comando:
java org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -S
true -Nurn:Example6 ej5java2wsdl wp.wsdl
Generara:
Acceder a la url:
http://www.xmethods.net
Generar la parte cliente del
servicio web con el comando
WSDL2Java
<axis-wsdl2java>
<axis-java2wsdl>
<axis-admin>
Cliente Calculadora en
.NET
wsdl
http://localhost:8080/axis/Calculat
or.jws?wsdl
Escribimos fichero Calculadora.cs
csc CalculatorService.cs
Calculadora.cs
Ejecutamos: Calculadora.exe
Calculadora.cs
using System;
class Calculadora
{
public static void Main ()
{
CalculatorService calc = new CalculatorService ();
int sum = calc.add (2, 2);
Console.WriteLine ("2 + 2 = " + sum);
int resta = calc.subtract (2, 2);
Console.WriteLine ("2 - 2 = " + resta);
}
}
Cliente Calculadora en
Java
Pasos de desarrollo:
1.
2.
3.
4.
java
org.apache.axis.wsdl.WSDL2Java
http://localhost:8080/axis/Cal
culator.jws?wsdl
Escribir clase CalcClient
Compilarla: javac CalcClient
Ejecutarla: java CalcClient
Cliente Calculadora en
Java
import localhost.axis.Calculator_jws.*;
public class CalcClient
{
public static void main(String [] args) throws Exception {
// Make a service
CalculatorService service = new CalculatorServiceLocator();
// Now use the service to get a stub which implements the SDI.
Calculator port = service.getCalculator();
// Make the actual call
int sum = port.add(2,2);
System.out.printf("2+2=%d\n", sum);
int resta = port.subtract(2,2);
System.out.printf("2-2=%d\n", resta);
}
}