Sunteți pe pagina 1din 38

Web Services with

JAX-RPC and Apache Axis


Sep. 18, 2002

Pankaj Kumar (pankaj_kumar@hp.com),


Software Architect,
Web Services Management Organization,
Hewlett Packard Co.
Session Objectives

• Web Services in Perspective


• Learn about Web Services, wire-level interoperability
standards and portable Java APIs.
• Get to know JAX-RPC and Apache Axis to consume
and produce Web Services.

Wednesday, December 3, 2008


Speaker Introduction
• More than 12 years of development and project
management experience
• Worked on Web Services product development at
HP
• Expert Group Member of JAX-RPC and JSR109
• Contributor to Apache Axis and Cocoon projects
• Author of open source project XPB4J (http://xpb4j.
sf.net)
• Frequent speaker at developer conferences
• Authoring a book on J2EE and Web Services
Security
Wednesday, December 3, 2008

• Architect with HP Web Services Mgmt. Operation


Outline of the Session

• Introduction to Web Services


• Web Services Standards
• Java support for Web Services
• Apache Axis
– Installing Apache Axis
– Invoking a service
– Deploying a service
– Handlers
– Serializers and Deserializers
• Where to find more information

Wednesday, December 3, 2008


Web Services Infrastructure

Language and platform independent


infrastructure for loosely-coupled, inter-
operable, app2app communication over the
Internet.

Wednesday, December 3, 2008


Web Services (Contd.)

Language and platform independent =>


separation of specification and
implementation
Loosely coupled =>
message based, synchronous and
asynchronous interactions.
Over the Internet =>
No centralized control, use of established
protocols, security considerations.
Inter-operable =>
Standards based. Wednesday, December 3, 2008
Early (Internet)
Technologies
• SMTP/MIME
– e-mail is still the killer app
• FTP, NNTP
• HTTP/HTTPS, HTML
– the protocol behind Internet’s popularity

Most of these facilitated app to human


interaction
over the Internet/intranet
Wednesday, December 3, 2008
Early (intranet)
Technologies
• DCE from OSF -- RPC based, procedural
• ORB -- object oriented, mostly synchronous
– CORBA, COM/DCOM from Microsoft, Java RMI/EJBs
• MOM -- message oriented, synchronous as
well as asynchronous
– JMS ( Java API standard )
– Many proprietary implementations

Most of these facilitated app2app interaction


within a
trusted intranet and without much consideration
to
Wednesday, December 3, 2008

interoperability across different implementations.


App2App Interaction -- the
Web Services Way
• Transport protocol
– HTTP/HTTPS
• Data Encoding
– SOAP (Simple Object Access Protocol), XML
Schema
• Interface Description
– WSDL (Web Services Description Language)
• Service Description and Discovery
– UDDI (Universal Description, Discovery and
Integration)
• Security
– WS-Security, XML-Signature, XML-Encryption, ...
Wednesday, December 3, 2008
The Web Services Way
Web Services standards (SOAP, WSDL,
… ): based on widely accepted Internet
friendly technologies (HTTP/HTTPS, XML, …),
are mostly orthogonal to each other and
enjoy broad support from vendors

Web Services: Network accessible programs,


expose functionality by receiving/sending
SOAP messages over HTTP/HTTPS, and
describe this interface as WSDL descriptions.

Wednesday, December 3, 2008


Additional Web Services
Infrastructure Components
• Key Management (Security)
– XKMS
• Web Services Management
– OMI (Open Management Interface)
• ...

Interesting thing to note is that


these
are Web Services in themselves
Wednesday, December 3, 2008
SOAP In One Slide
SOAP1.1 Message
• XML based protocol for
Structure
exchange of information SOAP
– Encoding rules for Envelope
datatype instances
Header
– Convention for Entries
representing RPC
invocations
[Header
• Designed for loosely- Element]
coupled distributed
computing Body
Element
– No remote references
• Used with XML Schema
[Fault
• Transport independent Element]
• SOAP with Attachments
allow arbitrary data to be
packaged.
Wednesday, December 3, 2008
WSDL in One Slide
WSDL1.1 Document
Structure
• A WSDL document WSDL
describes Document
– What the service can do
[Types]
– Where it resides
– How to invoke it {Messages}

• WSDL are like IDL but lot


more flexible and {Port Types}

extensible {Bindings}
• Defines binding for
SOAP1.1, HTTP {Services}
GET/POST and MIME
• WSDL descriptions can
be made available from
an UDDI registry Wednesday, December 3, 2008
Java APIs for Web Services

• SOAP messages as Java objects


– SAAJ ( SOAP with Attachments API for Java)
• Programming Model
– JAX-RPC ( JSR101), JSR109, EJB2.1
• Accessing WSDL descriptions
– JWSDL (JSR110)
• Accessing Web Services Registries
– JAXR (Java API for XML Registries)

Wednesday, December 3, 2008


SAAJ Object Model
SOAPPart SOAPMessage AttachmentPart

Node

SOAPFault
SOAPElement

SOAPFaultElement
*
SOAPBody SOAPHeader

*SOAPBodyElement SOAPHeaderElement *

SOAPEnvelope
Wednesday, December 3, 2008
JAX-RPC

• WSDL/XML to Java Mapping


• Java to WSDL/XML Mapping
• SOAP Message with Attachments
• Client API
– Classes generated from WSDL
– Dynamic Proxy
– DII call Interface
• SOAP Message Handler
• Extensible Type Mapping

Wednesday, December 3, 2008


JAX-RPC Physical
Architecture
WSDL description

Service Client Service Endpoint

Stub
WSDL<->Java Mapping Container

Dispatch

JAX-RPC API JAX-RPC API


Client Side JAX-RPC Server Side JAX-RPC
Runtime System Runtime System
Protocol (SOAP)
Transport

Wednesday, December 3, 2008


Interoperability and JAX-RPC

WSDL description
Client Service
JAX-RPC impl. Vendor prod.
<Vendor A> <Vendor C>

Client Service
Vendor prod. J2EE Container
<Vendor B> WSDL description <Vendor D>

Wednesday, December 3, 2008


Apache Axis

• A SOAP Processing Engine


– JAX-RPC Client System
– JAX-RPC Server System ( Servlet based )
– SAAJ implementation
– Flexible and extensible architecture
– Tools, Examples, Documentation, …
– A great place to learn about Web Services !!
• Open-source, hosted by Apache Software
Foundation
• Ready for use ( RC1 released on Sep. 6)

Wednesday, December 3, 2008


Install & Deploy Apache Axis
• Make sure that you have
– J2SE SDK 1.3 or 1.4: We will use Direcotry Structure:
1.4
– A Servlet Container: We will use axis-1_0
Tomcat4.0.1
• Download xml-axis-rc1-bin.zip webapps lib docs samples
from http://xml.apache.org/axis
• Unzip it and look at the dir. tree. axis
Note that Axis runs as a Servlet.
WEB-INF
• Deploy Axis.
– Copy webapps\axis tree to lib
webapps directory of Tomcat. classes
– Alternatively, modify server.xml
of Tomcat. web.xml

• Run Tomcat: issue bin\startup from ……


Tomcat home.
Wednesday, December 3, 2008
Test the Deployment
• Point your browser to http://localhost:8080/axis

Wednesday, December 3, 2008


A Simple Example

•AddFunction: A simple
Java class with method to
add two integers. Notice the
filename extension – it is
.jws ( for Java Web // File: AddFunction.jws
public class AddFunction {
Service). int addInt(int a, int b){
return(a+b);
•Deploy it. Just copy the }
AddFunction.jws file to }

webapps/axis directory.
•Examine its WSDL Note: All sources with instructions
description. Point your to run are available at my web-site:
browser to http://www.pankaj-k.net
http://localhost:8080/axis/AddFunction.jws?wsdl
Wednesday, December 3, 2008
Writing the Client Program

• There are many ways to write a Client


program
– Using Dynamic Invocation Interface ( DII)
– Using generated Stubs from Service WSDL
description
– Using Dynamic Proxy
• We will look at each of these
Writing the client requires more work
than writing the service

Wednesday, December 3, 2008


AddFunctionClient – using
DII
// File: lesson1\client\dii\AddFunctionClient.java, edited for presentation
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.namespace.QName;

public class AddFunctionClient {


public static void main(String [] args) {
try {
String endpoint = "http://localhost:8080/axis/AddFunction.jws";
Service service = new Service();
Call call = (Call) service.createCall();
call.setOperationName(new QName(endpoint, "addInt"));
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
Integer ret = (Integer)call.invoke(new Object[]{new Integer(5), new Integer(6)});
System.out.println("addInt(5, 6) = " + ret);
} catch (Exception e) {
System.err.println("Execution failed. Exception: " + e);
}
}
}

Wednesday, December 3, 2008


Compiling and Running
the
DII Client

Wednesday, December 3, 2008


AddFunctionClient – using
Dynamic Proxy
// File: lesson1\client\dproxy\AddFunctionClient.java, edited for presentation
import javax.xml.namespace.QName;
import javax.xml.rpc.*;
public class AddFunctionClient {
public static void main(String [] args) {
try {
String wsdlUrl = "http://localhost:8080/axis/AddFunction.jws?wsdl";
String nameSpaceUri = "http://localhost:8080/axis/AddFunction.jws";
String serviceName = "AddFunctionService";
String portName = "AddFunction";
ServiceFactory serviceFactory = ServiceFactory.newInstance();
Service afs = serviceFactory.createService(new java.net.URL(wsdlUrl),
new QName(nameSpaceUri, serviceName));
AddFunctionServiceIntf afsIntf = (AddFunctionServiceIntf)afs.getPort(
new QName(nameSpaceUri, portName), AddFunctionServiceIntf.class);
System.out.println("addInt(5, 3) = " + afsIntf.addInt(5, 3));
} catch (Exception e) {
System.err.println("Execution failed. Exception: " + e);
}
}
} Wednesday, December 3, 2008
Compiling and Running the
Dynamic Proxy Client

Wednesday, December 3, 2008


AddFunctionClient – using
Generated Stubs
Generate the stubs:
java org.apache.axis.wsdl.WSDL2Java \
http://localhost:8080/axis/AddFunction.jws?wsdl

// File: lesson1\client\stub\AddFunctionClient.java, edited for


presentation
Import localhost.*;
public class AddFunctionClient{
public static void main(String [] args) {
try {
AddFunctionService afs = new AddFunctionServiceLocator();
AddFunction af = afs.getAddFunction();
System.out.println("addInt(5, 3) = " + af.addInt(5, 3));
} catch (Exception e) {
System.err.println("Execution failed. Exception: " + e);
}
}
}

Wednesday, December 3, 2008


Generating Stubs, Compiling
and Running the Stub Client

Wednesday, December 3, 2008


Deployment Descriptors

• JWS deployment is simple, but has


limitations:
– You must have the source code
– Can’t specify custom type mappings, handlers etc.
• WSDD (Web Services Deployment
Descriptors) allow more flexible deployments
– Handlers in request or response path
– Custom type mappings
– Different transports – HTTP/S, TCP/IP, DIME
– Different Dispatchers – Java Class, EJB, Servlet
– …
Wednesday, December 3, 2008
Adding complexitiy to the
Simple Example
•AddFunction1: A simple
// File: Complex.java
Java class with method to public class Complex {
add two Complex numbers. public Complex(){}
public double getR(){ … }
Complex is user defined public void setR(double r){ … }
Java class. …
public Complex add(Complex c){ … }
•Deploy it.
•Compile sources
•Copy .class files.
// File: AddFunction1.java
•Write deployment public class AddFunction1 {
descriptor public Complex addComplex
•Run AdminClient. (Complex a, Complex b){
return a.add(b);
•Examine its WSDL }
}
description. Point your
browser to
http://localhost:8080/axis/services/AddFunction1Service?wsdl
Wednesday, December 3, 2008
The Deployment Descriptor
// File: lesson2\service\deploy.wsdd
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<handler name="print" type="java:LogHandler"/>


<service name="AddFunction1Service" provider="java:RPC">
<requestFlow>
<handler type="print"/>
</requestFlow>
<parameter name="className" value="AddFunction1"/>
<parameter name="allowedMethods" value="*"/>
<beanMapping qname="myNS:Complex" xmlns:myNS="urn:BeanService"
languageSpecificType="java:Complex"/>
</service>
</deployment>
Note:
(1) xmlns:java
(2) A handler in the request path
(3) Dispatch to RPC provider
(4) Bean type mapping
Wednesday, December 3, 2008
Deploying the Service

Wednesday, December 3, 2008


AddFunction1Client – using
Generated Stubs
Generate the stubs:
java org.apache.axis.wsdlWSDL2Java \
http://localhost:8080/axis/services/AddFunction1Service?wsdl

// File: lesson2\client\stub\AddFunction1Client.java, edited


import localhost.*;
import BeanService.*;
public class AddFunction1Client {
public static void main(String [] args) throws Exception {
Complex a = new Complex();
Complex b = new Complex(); Generated
a.setR(10.0); a.setI(5.0);
class
b.setR(3.0); b.setI(2.0);
AddFunction1Service afs = new AddFunction1ServiceLocator();
AddFunction1 af = afs.getAddFunction1Service();
Complex ret = af.addComplex(a, b);
System.out.println("addComplex(a + b) = ("
+ ret.getR() + ", " + ret.getI() + ")");
}
}
Wednesday, December 3, 2008
Running the Client

Wednesday, December 3, 2008


Additional (Advanced!)
Features
• SOAP with Attachments
• Custom type mappings (Pluggable
Serializers)
• One-way invocations
• Document exchange
• Dispatch to EJBs
• HTTPS transport and mutual authentication
• Username and password based
authentication
• …
Wednesday, December 3, 2008
Where to find more
information?
• Apache Axis Home:
http://xml.apache.org/axis
• Sun’s Web Services Developer Pack Home:
http://java.sun.com/webservices/webservicespack.ht

• W3C’s Web Services Activity Home Page:


http://www.w3.org/2002/ws/
• My Home Page: http://www.pankaj-k.net

Wednesday, December 3, 2008


Thank
You

Wednesday, December 3, 2008

S-ar putea să vă placă și