WSDL Peter
Komisar © Conestoga College v.1.1 / 2005
references: Web Services Description
Language (WSDL) 1.1 W3C Note, http://www.w3.org/TR/wsdl, '
Web Service Description Language (WSDL) Version 2.0 Part 2: Message
Exchange Patterns',
http://www.w3.org/TR/2004/WD-wsdl20-patterns-20040326
''First Look at WSDL 2.0', Canyang
Kevin Liu, SAP, Building Web
Services with Java,S.Graham et.al, Sam's Publishing,'Web Services
Description Language (WSDL) Version 2.0 Part 0: Primer, W3C Working
Draft'
'http://www.w3.org/TR/wsdl20-primer, Web
Services Description Language (WSDL) Version 2.0
Part 1: Core Language, W3C Working Draft, http://www.w3.org/TR/wsdl20 'Apache
Axis Installation
& User Guides'. http:www.apache.org // would seem shorter if the
w3 WSDL docs had shorter names!
Introduction
"As communications protocols and message formats are
standardized in the web
community, it becomes increasingly
possible and important to be able to describe
the communications
in some structured way. WSDL addresses this need by defining
an XML grammar for describing network services as collections of
communication
endpoints capable of exchanging
messages."
"WSDL is an XML format for describing network services as a set
of endpoints
operating on messages containing either document-oriented
or procedure-oriented
information."
- W3C WSDL 1.1 Note
WSDL, an abbreviation of Web Services Description Language, specifies a
set
of XML tags that can be used to describe web services in a standard
format.
WSDL is widely accepted and is supported by Microsoft, IBM, BEA and
Sun.
Popular implementation of SOAP engines such as Apache's Axis support
WSDL
as well as do commercial web servers such as IBM's Websphere,
Microsoft's
IIS, Sun's iPlanet and BEA's WebLogic. Java supports
The Current State of WSDL Specification
WSDL is a standard which, as of early 2005 is in a state of flux. The
WSDL 1.1
W3C note formed the basis for wide scale adoption of WSDL by
most industrial
heavyweights. The W3C has formed W3C Working Group
who are currently
working on a final drafts of WSDL version 2.0. The WSDL
2.0 primer working
draft was recently published in December 2004. The
draft will finally be proposed
as a W3C recommendation.
The WSDL 2.0 documents have received some criticism. On first glance
they are
not very inviting reads. As an example of a reaction, you might
enjoy looking at
O'Reilly XML author, Rich Salz's article <>'WSDL
2: Just Say No',
http://webservices.xml.com/pub/a/ws/2004/11/17/salz.html
The Working Group is sensitive to criticism (as is indicated by
their response to
Salz's article) it can be assumed that the recommendations that follows
will be
thoroughly worked over to make it as clear and user friendly as
possible.
At this time, there is no WSDL 2.0 support in any
implementations, but plenty
of WSDL 1.1 support so we have to put the emphasis on WSDL 1.1 while
where
possible carrying forward a comparison with WSDL 2.0.
A WSDL 1.1
Summary
A WSDL document is essentially a service 'definition'.
"A WSDL document defines services
as
collections of network endpoints, or
ports . . messages . . are
abstract descriptions of the
data being exchanged,
and port
types . . . are
abstract collections of operations.
The concrete protocol
and data format specifications for
a particular port type constitutes a reusable
binding. "
-W3C WSDL 1.1
Note
The WSDL 2.0
View
A WSDL document is essentially a service 'description'.
A WSDL 2 describes services as a collection of endpoints (dropping the
term
ports). Operations act on messages implicitly ( with message and parts
elements
omitted.) Interfaces rather than portTypes are abstract
collections of operations.
The concrete protocol and data format for a particluar interface
constitutes a
reusable binding.
WSDL Reference Sources
WSDL Reference Sources
The W3C WSDL 1.1 is located at the following URL.
- Web Service Description Language (WSDL) 1.1
http://www.w3.org/TR/wsdl
WSDL Version 2 is a W3C working draft at this time ( 02-2005 )
described in three parts:
WSDL Architecture
If you studied CORBA you would recall the trick
that was used to achieve
cross platform portability was first defining services in IDL or
Interface
Definition Language. IDL interfaces were essentially a collection of
'C'
function prototypes that described abstractly what would eventually be
translated and implemented in a programming language running natively
on a given platform. The 'magic' of CORBA was that it never lost sight
of the language neutral definitions that were defined in IDL. An ORB
would
translate the function calls and return types in and out of the native
language all the while communicated with other ORBs in a neutral
dialect. This might enable a machine running Java on an Mac communicate
with an IBM PC perhaps running C++.
WSDL also defines such an abstraction, only instead of using IDL
interfaces,
an equivalent form is defined in XML elements supplied by WSDL. The top
layer of the following diagram defines the interfaces of the service
and is
abstract. The binding and service layer dictate concrete details of how
and
where the service can be found. The actual implementation of the service
is left to the application operating at the endpoint of the service.
WSDL is similar to CORBA's neutral definition layer in that it supplies
a
commonly defined 'neutral' carrier which only needs to execute natively
at the endpoints of the message exchange.
WSDL Architectural Layers // Service
is a set of portTypes or interfaces
Interface
< interface >
// defines the abstract interface(s),
operations, parameter and return types
|
Binding
< binding >
// dictates the protocol over which
the message will be sent
|
Service < service >
// The endpoint describes where the service will be found. The address
// is dependent on the underlying protocol being used. i.e
.in HTTP the
// endpoint will be a URL while over SMTP it will be email
address.
|
Changes made in WSDL 2.0
WSDL 2.0 seeks to clarify the
language of WSDL 1.1, provide stronger support
of other W3C Recommendations such as the XML Information Set and to
features that are causing interoperability problems or are unnecessary.
For
instance, support for operation overloading has been removed from WSDL
2.0.
Associated
Technologies
Both WSDL versions and rely heavily on the XML
Schema Definition Language,
now frequently referred to by the abbreviation XSD. While XSD is WSDL
canonical
form, WSDL allows the use of other type
definition languages ( via extensibility
mechanisms.) WSDL 1.1 supports specific 'binding extensions' for
SOAP 1.1,
HTTP GET/POST and MIME. WSDL extends support to all HTTP methods
and
uses MIME indirectly through a new attachements methodology called
MTOM.
Following are namespaces, currently defined for use in WSDL 1.1 and
WSDL 2.0.
Namespace URIs Used in WSDL 1.1 and Counterparts in WSDL 2.0
prefix |
WSDL
1.1
Namespace URI |
WSDL
2.0 Namespace URI
|
wsdl |
http://schemas.xmlsoap.org/wsdl/
WSDL
1.1 Document namespace
|
http://www.w3.org/2004/08/wsdl
WSDL 2..0 Document
namespace
|
soap / wsoap
|
http://schemas.xmlsoap.org/wsdl/soap/
// WSDL 1.1 uses SOAP 1.1
|
http://www.w3.org/2004/08/wsdl/soap12
// WSDL 2.0 uses SOAP 1.2
|
http /
whttp
|
http://schemas.xmlsoap.org/wsdl/http/
//
Namespace for WSDL HTTP GET & POST binding
|
http://www.w3.org/2004/08/wsdl/http |
mime |
http://schemas.xmlsoap.org/wsdl/mime/
// WSDL
1.1 attachment support based on
SOAP with Attachment |
The WSDL 1.1 MIME
binding is deprecated
//
WSDL
2.0 attachment support based on MTOM,
// which is a
SOAP 1.2-based solution provided by
// the W3C.
|
soapenc /
|
http://schemas.xmlsoap.org/soap/encoding/
//
SOAP 1.1 Encoding namespace
|
http://www.w3.org/2004/08/wsdl/soap12
// SOAP 1.2
Encoding namespace |
soapenv /
|
http://schemas.xmlsoap.org/soap/envelope/
// SOAP
1.1 Envelope namespace
|
|
xsi |
http://www.w3.org/2000/10/XMLSchema-instance
// XML Schema Instance namespace
|
"http://www.w3.org/2001/XMLSchema-instance" |
xsd |
http://www.w3.org/2000/10/XMLSchema
// XML Schema namespace
|
"http://www.w3.org/2001/XMLSchema" |
tns |
(various) The
“this namespace”
(tns) prefix is used as a convention to refer to the current document. |
Additional WSDL 2.0 Types
wsdli //
Schema for WSDL instance
http://www.w3.org/2004/08/wsdl-instance
wsdls // WSDL Simple Types namespace
http://www.w3.org/2004/08/wsdl-simple-types
wrpc // WSDL RPC style document schema
http://www.w3.org/2004/08/wsdl/rpc |
// The XML Schema Namespaces
for WSDL 1.1 are as were stated in the W3C WSDL 1.1 Note.
Name Changes
The WSDL 2.0 draft adopt some reasonable changes. WSDL is 'Web Services
Description
Language' so it is logical that the languages supplies 'descriptions'
rather than 'definitions'
thus the change in the root element. Also the term 'interface' is
popularly understood to
mean a 'collection of abstract operations' so changing the
<portType> element to the
<interface> element is reasonable. The WSDL 1.1 Note themselves
describe endpoints
as 'ports' or 'endpoints' with 'endpoint' providing a clearer
description. The <message>
elements are dropped in WSDL 2.0 in favour of an 'inline'
description
that is contained
inside the <operation element.>
//
at least if your not a sailor or TCP/IP specialist.
Major Elements of WSDL 1.1 & Counterparts in WSDL 2.0
WSDL
1.1
|
WSDL
1.2
|
Description
|
definitions
|
descriptions
|
The WSDL root
element
|
types
|
//
same |
"a container for
data type
definitions using
some type system (such as XSD) " |
message
|
//
dropped becomes
// part of operation semantics
|
" an abstract,
typed
definition of data being communicated
|
operation
|
//
same
|
"abstract
description of
an action supported by a service
|
portType
|
interface
|
"an abstract set of
operations supported by one or more endpoints"
|
port
|
endpoint
|
" an single
endpoint
defined as a combination of a binding
and a network address."
|
service
|
//
same |
" a collection of
related
endpoints"
|
binding
|
//
same
|
" a concrete
protocol and
data format specification for a
particular port type"
|
import
|
import
|
" the import
element is used to modularize a WSDL document
|
WSDL 1.1 Sample
In practice, WSDL comes down
to specifying a service in the form of a WSDL
document. Following is an example in WSDL 1.1 from the WSDL 1.1 Note.
You'll notice the authors do not use SOAP 1.1 encoding for typing,
instead
supplying their own "fixed XML format" to render element types ( i.e.
type="string").
WSDL 1.1 Request/Response via
HTTP Example // from the WSDL 1.1 Note
<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace="http://example.com/stockquote.xsd"
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
</types>
<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>
WSDL Major Elements
Since it will be some time before WSDL 2.0 support is widespread we
will focus on describing WSDL 1.1 elements and note where WSDL 2.0
differs from WSDL 1.1.
The <definitions> Element
The 'definitions' element is the root element of a WSDL document. It holds
all other WSDL elements. The element has a 'name' attribute that normally
corresponds to the name of the WebService. It has a 'targetNamespace'
attribute for the document. The definitions element will also contain a number
of related namespaces such as those for SOAP and WSDL. An XML schema
namespace may appear in the 'definitions' element or locally in the 'types'
element, (as observed in various examples).
The following set of namespaces from the Apache Axis WSDL example
shows an interesting variation where a URNs are used in a couple of
namespace declarations. Also note that SOAP 1.1 is being targeted
as is the 1.1 version of WSDL.
The following is a skeleton representation of a <definitions> element
with it's potential constituent parts.
A <definitions> element Skeleton Diagram
<definitions name="UsuallyNameOfWebService"
targetNamespace = "http://www.example.com/services/ServiceNamespace"
<!-- also normally includes SOAP, WSDL and optionally XML Schema namespaces>
>
<!-- All the following elements may appear zero or more times
except for the 'types' element which appears zero or one times >
<documentation/>
<import />
<types />
<message>
<portTypes />
<binding />
<service />
<binding />
<service />
</definitions>
WSDL 2. Differences
The <definitions> element of WSDL1.1 is replaced by the <descriptions>
element and it's sub-elements in WSDL 2.0.
The <document> Element
WSDL uses the 'document' element to provide readable documentation
for human use. The document is a mixed type allows arbitrary text and
element mixing and is allowed inside any WSDL language element.
The <import> Element
The original authors of WSDL promoted 'modularity', supplying the 'import'
element to allow defining different aspects of an overall WSDL description
in separate documents. These documents could then be imported into larger
WSDL document. You can imagine this would be handy for a schema
document for instance. The 'import' element has the following form.
The folloiwng form as described in the W3C WSDL 1.1 Note shows that
the import element allows a namespace and a location to be specified
for a document via URIs.
The <import> element Form
<import namespace="uri" location="uri"/> *
WSDL 1.1 Note Example
<import namespace="http://example.com/stockquote/schemas"
location="http://example.com/stockquote/stockquote.xsd"/>
The <types> Element
The types element stores data type
definitions used in
messaging.
These commonly will be defined XML Schema Language. WSDL
endorses XSD but allows other typing systems to be used. The
types element acts as a container for a schema definitions that are
used inside messages.
A nice feature of WSDL is that it allows us to use schema definition
language directly in the WSDL document in it's native form. We can
drop our schema element that contains our type definitions directly
inside the <types> element. The following example is the
<types>
element that is found in the Apache Axis WSDL address book
example. Though it is legal, it is not recommended you have more
than one root <schema> element contained in the <types>
element.
Apache Axis WSDL <types>
Element Example
<!-- type defs -->
<types>
<xsd:schema targetNamespace="urn:AddressFetcher2"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:simpleType name="stateType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="TX"/>
<xsd:enumeration value="IN"/>
<xsd:enumeration value="OH"/>
</xsd:restriction>
</xsd:simpleType>
<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>
<xsd:complexType name="address">
<xsd:all>
<xsd:element name="streetNum" type="xsd:int"/>
<xsd:element name="streetName" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="typens:stateType"/>
<xsd:element name="zip" type="xsd:int"/>
<xsd:element name="phoneNumber" type="typens:phone"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</types>
The
<message> Element
The message element acts as a container for 'parts' elements.
Each part element is typed, typically using XSD, (XML Schema
Definition Language) Each message has a 'name' attribute which
takes a unique identifier.
The messsage defines the part of the
communication that is sent
over the 'wire'. This might be an input, output or a fault message.
If defined for 'message oriented' system, the message will be an
XML document. If the message is used in 'RPC style' communications,
an input message will represent input parameters. If there is a return
value, then an output message will represent the return types.
The W3C WSDL 1.1 Note shows the followng form of the message
element. The form shows that there may be any number of messages
each containing any number of part elements. Each part element
has a name and an optional 'element' and optional 'type' attribute.
Both of these attributes are used to indicate type. Only one or the
other of these attributes to indicate type.
W3C
WSDL 1.1 Note
// The
message-typing attributes (which may vary depending
// on the type
system used) are shown in bold. - WSDL 1.1 Note
<definitions .... >
<message name="nmtoken"> *
<part name="nmtoken" element="qname"? type="qname"?/>
*
</message>
</definitions>
//
Either the 'element' atttribute or the 'type' attribute is used but not
both
If the type is set to using the 'element' attribute, then this element
type
will become the specifically named contents of the SOAP envelope. This
element will be defined globally in the document or inside the
document's
schema definitions (whether inside the <types> element or by
import).
If the type is set using the 'type' attribute, the message name may be
generic and is only required to have that type.
Apache Axis
Example of
Four Messages
//The
first two are used in combination to form a method that returns void
<message name="empty"/>
<message name="AddEntryRequest">
<part name="name" type="xsd:string"/>
<part name="address" type="typens:address"/>
</message>
// The mext
two messages are used in an RPC with a return value
<message name="GetAddressFromNameRequest">
<part name="name" type="xsd:string"/>
</message>
<message name="GetAddressFromNameResponse">
<part name="address" type="typens:address"/>
</message>
// The
'typens' abbreviates 'type namespace' and is
// associated with the target namespace of the schema
// element inside the 'types' element
The
<part> Sub-Element
The <part> subelements, you can see
represent the parameters
or return types of the messages. The above examples shows
two 'part' elements that are typed to XML Schema built in
xsd:string types. Two other elements are complex types that
are defined in the <types> element of the associated
WSDL document.
//
The 'typens' prefix is defined globally in the WSDL document
// and points to the document's
target namespace. The
//'targetNamespace' attribute
of the <schema> element that is
// nested inside the <types>
element of the WSDL document
// also points to this same target
namespace. */
WSDL 2.0
Differences
In WSDL 2.0 the <message> element
and it's <parts> are omitted
and defined inside the context of Operation elements. The following
examples are excerpts from 'First Look at WSDL 2.0' by Canyang
Kevin Liu at SAP.
WSDL 1.1 Example of a
<message> and <portType> Elements
exerpt from 'First Look at WSDL 2.0' by
Canyang Kevin Liu, from SAP
<><message
name="GetLastTradePriceInput">
<part name="body"
element="xsd1:TradePriceRequest"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input
message="tns:GetLastTradePriceInput"/>
<output
message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
Corresponding WSDL 2.0 Code Omits
<message> and <part> Elements
excerpt from 'First Look at WSDL 2.0' by
Canyang Kevin Liu, from SAP
<><interface name="StockQuote">
<operation name="GetLastTradePrice"
pattern="http://www.w3.org/2004/03/wsdl/in-out">
<input messageLable = “In
element="xsd1:TradePriceRequest"/>
<output messageLable = “Out
element="xsd1:TradePrice"/>
</operation>
</interface>
The
<portType> Element
The <portType> element(s) provides
the key description of what a service
does, as each portType element defines the set of operations that a web
service supplies.
The <portType> element is used to
house a set of operation definitions. It is
similar to a Java interface. The following
example from the W3C WSDL Note
shows that a 'portType' element that
might house zero or more <operation>
elements however one portType element is typical and represent a good
form in that there is one WSDL document per portType.
The portType and operation names
will all need to be unique with respect
to their containing
scopes.
W3C Form of the <portType> Element
<wsdl:definitions .... >
<wsdl:portType name="nmtoken">
<wsdl:operation name="nmtoken" .... /> *
</wsdl:portType>
</wsdl:definitions>
WSDL 2.0
Differences
The <portType> element is replaced by the <interface> in
WSDL 2.0.
The
<operation> Element
Operations define methods or
functions in terms of XML Elements. The
<operation> element holds <input> and <output>
elements which in turn
reference <message> elements that supply details relating to
input
parameters and return values.
Apache Axis WSDL Example
<operation name="addEntry">
<input
message="tns:AddEntryRequest"/>
<output message="tns:empty"/>
</operation>
WSDL defines four types of operations which are termed 'transmission
primitives'which
we look at when we finish surveying the WSDL element
set.
The
<binding> Element
The <binding> element
carries information that describes message formats
and details regarding the protocol over which the messages are sent.
The
'type' attribute is used to associate the binding being defined to a
specific
'portType' element. There may be more than one binding specified per
portType, however each binding element is used to describe only one
protocol.
Following is the W3C description of the
grammar used for the binding
element.
W3C
Grammar for the <binding> Element
<wsdl:definitions .... >
<wsdl:binding name="nmtoken" type="qname"> *
<-- extensibility element (1) --> *
<wsdl:operation name="nmtoken"> *
<-- extensibility element (2) --> *
<wsdl:input name="nmtoken"? > ?
<-- extensibility element (3) -->
</wsdl:input>
<wsdl:output name="nmtoken"? > ?
<-- extensibility element (4) --> *
</wsdl:output>
<wsdl:fault name="nmtoken"> *
<-- extensibility element (5) --> *
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions>
You'll notice what seems to be a little redundancy as the binding element
maps information to each of the operations and their parts. The 'binding'
element supplies protocol-specific information for each of the elements
of a 'portType' definition.
There is one other element that is added to the binding element that is specific
to SOAP. In the case of SOAP it is the <soap:binding> element. The style
attribute can hold either the value "rpc" or "document to describe the messaging
format. In the following example, "rpc", and the transport protocol, in the following
example it is HTTP.
First Few Lines of the <binding> Element in the Apache Axis WSDL Example
<binding name="AddressBookSOAPBinding" type="tns:AddressBook">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
The 'style' attribute is important as it decides what format the SOAP messaging
will take. If the 'style' is 'document' type then the message goes 'as is' in the
SOAP envelope. If the "rpc" value is specified then messages are nested in
the context of operation elements.
Following is the <binding> element from the W3C WSDL 1.1 Note. It
describes
a document style SOAP communication over HTTP. The input and output in
this example uses a 'literal' form of communication. The
"literal" value is
generally used with the 'document; form as there is no
conversion of types
between Java and XML
The <binding> element
from the W3C WSDL 1.1 Note
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
Following is the <binding> element from the Apache Axis WSDL
Example
abridged to a single operation. It shows it is an RPC type of
communication
over SOAP over HTTP. Each of the input and output messages will use
SOAP encoding.
An Example of an Abridged
<binding> element from the Apache Axis WSDL
<binding name="AddressBookSOAPBinding"
type="tns:AddressBook">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="addEntry">
<soap:operation soapAction=""/>
<input>
<soap:body use="encoded"
namespace="urn:AddressFetcher2"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded"
namespace="urn:AddressFetcher2"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<!-- abridged leaves out a second
method description -->
</binding>
//
The SOAP Action Header is a mandatory field for SOAP requests that
// are sent via HTTP. One
source states that it's corresponding 'soapAction'
// attribute should at least
be assigned an empty
string, "". We see samples
// from the W3C WSDL 1.1 Note
where these attribute are left out.
The
<service> Element
A service
encapsulates a group of zero or more related ports. Ports
defined in a service are restricted from inter-communicating. Ports
may be supplied
that are the same port type but use different bindings
or addresses. In this case these ports are considered alternatives,
supplying the same service over different transport protocols and
message formats.
W3C Grammar for the
<service> Element
<wsdl:definitions .... >
<wsdl:service name="nmtoken"> *
<wsdl:port .... />*
</wsdl:service>
</wsdl:definitions>
The <port> Element
The port element is used supply an address for a web service. It does
this by defining an endpoint. For a given binding, a single address is
specified. Following is the W3C description of the grammar used for
the 'port' element.
W3C Grammar for
the <port> Element
<wsdl:definitions .... >
<wsdl:service .... > *
<wsdl:port name="nmtoken" binding="qname"> *
<-- extensibility element
(1) -->
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
W3C Example for Service & Port
Element
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
// the binding attribute references the WSDL documents <binding> element
WSDL Messaging Formats
WSDL Transmission Primitives
WSDL defines four types of operations which are termed 'transmission
primitives' that parallel the messaging formats that are described in
SOAP. They are 'one-way', 'request-response', 'solicit-response' and
'notification'. The WSDL 1.1 note only defines the first two bindings.
The latter two are described but not implemented.
WSDL Transmission Primitives
- One-way //
endpoint receives a message
- Request-Response. //
receiving and sending a message
- Solicit-Response. //
an endpoint sends a message and receives a response
- Notification. //
endpoint sends a message
Operation Naming
Convention
The 'name'
attribute may be used to supply <input> and <output>
elements
with identifiers. WSDL supplies a
default behaviour for naming operations.
'One-way'
Operation
In a 'One-way' operation the 'input' element
adopts the name of the operation.
Request-Response' &
'Solicit-Response'
operations
The input and output elements are
named after the operation followed by
the appropriate suffix appended,
either 'Request', 'Solicit' or 'Response'.
Apache Axis WSDL Example of a Request-Response Naming Pattern
<operation name="getAddressFromName">
<input
message="tns:GetAddressFromNameRequest"/>
<output
message="tns:GetAddressFromNameResponse"/>
</operation>
Operation Forms For Each Type of
Transmission Primitive
// called MEPs or Message Exchange
Patterns in later specifications
Following are the W3C Examples for each sort of operation.
One-way Operation
The one-way
operation is characterized by a single input element.
W3C
'One-way' Operation Grammar
<wsdl:definitions .... > <wsdl:portType .... > *
<wsdl:operation name="nmtoken">
<wsdl:input name="nmtoken"? message="qname"/>
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>
The input
element specifies the abstract message format
for the one-way operation.
Request-response Operation
The
request-response operation adds an output element and a fault element
to report
if an
error occurs in attempting to generate a response.
W3C 'Request-response' Operation
Grammar
<wsdl:definitions .... >
<wsdl:portType .... > *
<wsdl:operation name="nmtoken" parameterOrder="nmtokens">
<wsdl:input name="nmtoken"? message="qname"/>
<wsdl:output name="nmtoken"? message="qname"/>
<wsdl:fault name="nmtoken" message="qname"/>*
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>
Solicit-Response
Operation
The grammar
for a solicit-response operation is:
W3C 'Solicit-response' Operation
Grammar
The solicit-response operation is like the request response
operation except
that the input and output order are reversed. Recall that this format
would
issue from an endpoint to a subscriber or
client.
W3C 'Solicit-Response' Operation
Grammar
<wsdl:definitions .... >
<wsdl:portType .... > *
<wsdl:operation name="nmtoken" parameterOrder="nmtokens">
<wsdl:output name="nmtoken"? message="qname"/>
<wsdl:input name="nmtoken"? message="qname"/>
<wsdl:fault name="nmtoken" message="qname"/>*
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>
Notification
Operation
The grammar
of the notification operation mirrors the one-way operation similar in
that
it has a single but opposite 'output' element nested.
W3C 'Notification' Operation Grammar
<wsdl:definitions .... >
<wsdl:portType .... > *
<wsdl:operation name="nmtoken">
<wsdl:output name="nmtoken"? message="qname"/>
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>
Parameter
Order
The
'parameterOrder' attribute is supplied allowing an operation to
describe
parameter names in a space-separated list where the order is the same
as
the parameters in the RPC signature. The return value cannot be part of
this
list. (The
paramaterOrder attribute is NMTOKENS type, plural of NMTOKEN
type. (NMTOKEN is the XML name token type and can be part
of any legal
XML name.)
// If
a part name appears in only the input message, it is an 'in' parameter.
// If a part name appears in only the
output
message, it is an 'out' parameter
// A part name that appears in both
the
input
and output message, it is named an 'in/out' parameter
WSDL 2.0
Defines 8
Message Patterns
// WSDL Version 2.0 Part
2: Message
Exchange Patterns
//
http://www.w3.org/TR/2004/WD-wsdl20-patterns-20040326
WSDL 2.0 Describes
the
Following Messaga Exchange Patterns (MEPs)
Grouped as 'in' or 'out' types.
- In-Only //
one message, no fault
- Robust In-Only //
one message, triggers fault
- In-Out //
two messages, 'in' and 'out' fault
replaces message
- In-Optional-Out //
one message 'in', optional 'out',
message triggers fault
//
out types mirror the 'in' patterns
- Out-Only //
one message, no fault
- Robust Out-Only //
one message, triggers fault
- Out-In //
two messages, 'out' and 'in'', fault
replaces message
- Out-Optional-In //
one message 'out', optional 'in',
message triggers fault
|
Authoring
and Portability
WSDL Use of the
'import' Element
The <import> element allows service descriptions to be contained
in separate documents that can then be imported as needed. This
makes reuse of WSDL descriptions easy and also allows the WSDL
documents to be more readable.
The W3C
WSDL note supplies an example based on it's first example
to show how
the data type definitions, the abstract definitions and the
specific
bindings can be separated into separate documents.
WSDL
1.1 Note Schema Definition Example
// has the URL,
http://example.com/stockquote/stockquote.xsd
<?xml version="1.0"?>
<schema targetNamespace="http://example.com/stockquote/schemas"
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
The
above schema is imported into the following WSDL document
that focuses on defining the abstract aspects of a WSDL definition,
the description of the interface (portType), operations and messages.
WSDL 1.1 Note Defining the Abstract Aspects
of the Service
//
http://example.com/stockquote/stockquote.wsdl
<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote/definitions"
xmlns:tns="http://example.com/stockquote/definitions"
xmlns:xsd1="http://example.com/stockquote/schemas"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<import namespace="http://example.com/stockquote/schemas"
location="http://example.com/stockquote/stockquote.xsd"/>
<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
</definitions>
Finally, the Interface WSDL document is imported into a WSDL
document that supplies the concrete implementation details, in
the <binding> and <service> elements.
W3C WSDL 1.1 Note Example Importing PortType into a WSDL
Document Defining The Bindings and Service
//
http://example.com/stockquote/stockquoteservice.wsdl
<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote/service"
xmlns:tns="http://example.com/stockquote/service"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:defs="http://example.com/stockquote/definitions"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<import namespace="http://example.com/stockquote/definitions"
location="http://example.com/stockquote/stockquote.wsdl"/>
<binding name="StockQuoteSoapBinding" type="defs:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>
WSDL
SOAP
Bindings Examples
The following points are quoted from the W3C WSDL note primarily to
show the parts of the WSDL document that are involved in binding the
message to the underlying protocol. The examples are easy to view
as the pertinent sections are highlighted.
The first example shows a document style communication over SMTP.
You can see the style is assigned the "document" value and the use
attributes are assigned "literal" values. In this case the 'transport'
attribute is assigned the URL representing SMTP, "
Example transport="http://example.com/smtp"
Also
you will notice the address in the <port> element is an e-mail
address.
//
In the document form 'soapAction' has not been assigned.
W3C Example SOAP binding of
one-way
operation over SMTP using a SOAP Header
// from the W3C WSDL note
<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="SubscribeToQuotes">
<part name="body" element="xsd1:SubscribeToQuotes"/>
<!-- an example of a Header Definition -->
<part name="subscribeheader" element="xsd1:SubscriptionHeader"/>
</message>
<portType name="StockQuotePortType">
<operation name="SubscribeToQuotes">
<input message="tns:SubscribeToQuotes"/>
</operation>
</portType>
<binding name="StockQuoteSoap" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://example.com/smtp"/>
<operation name="SubscribeToQuotes">
<input message="tns:SubscribeToQuotes">
<soap:body parts="body" use="literal"/>
<soap:header message="tns:SubscribeToQuotes" part="subscribeheader" use="literal"/>
</input>
</operation>
</binding>
<service name="StockQuoteService">
<port name="StockQuotePort" binding="tns:StockQuoteSoap">
<soap:address location="mailto:subscribe@example.com"/>
</port>
</service>
<types>
<schema targetNamespace="http://example.com/stockquote.xsd"
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="SubscribeToQuotes">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="SubscriptionHeader" type="uriReference"/>
</schema>
</types>
</definitions>
The second example from the WSDL note shows a request-response RPC type
operation
that communicates over
HTTP. The following line communicates that the messaging will
be
an RPC type over HTTP. Noticing the bolded script, the style is
"rpc" and the transport
is designated with the SOAP URL for HTTP. The 'use' attributes of the
<soap:body>
elements have been assigned the "encoded" value. The port address is an
HTT P URL.
// The
'soapAction' attribute has been assigned a URL representing the
operation call.
Example 4. SOAP
binding of request-response
RPC operation over HTTP
<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="GetTradePriceInput">
<part name="tickerSymbol" element="xsd:string"/>
<part name="time" element="xsd:timeInstant"/>
</message>
<message name="GetTradePriceOutput">
<part name="result" type="xsd:float"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetTradePrice">
<input message="tns:GetTradePriceInput"/>
<output message="tns:GetTradePriceOutput"/>
</operation>
</portType>
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetTradePrice">
<soap:operation soapAction="http://example.com/GetTradePrice"/>
<input>
<soap:body use="encoded" namespace="http://example.com/stockquote"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="http://example.com/stockquote"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>>
</binding>
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>
Apache WSDL Support
// the following and related
material is practical and not covered on the final
If you return to the Apache Axis User Guide, and continue from page 15
you will see how Axis supplies practical support for WSDL. Axis
supports
WSDL by supplying 'discovery' support and WSDL tools.
Web Browser
Service Discovery
A user may access a service URL with a web browser by appending "?WSDL"
to the end of the URL. A WSDL document is automatically generated to
describe
the service.
Tool
Support // WSDL2Java
Axis supplies the WSDL2Java tool which build Java
interfaces, implementation
classes, accessory classes and stubs and skeletons that correspond to a
WSDL document description. This set of classes can then be implemented
and
deployed to create a service corresponding to the WSDL description.
Following is an example of how this utility is used.
Invocation of Apache WSDL2Java
Tool at the Command Line
java org.apache.axis.wsdl.WSDLJava (WSDL-file-URL)
Example
java org.apache.axis.wsdl.WSDLJava
file:///home/peter/axis-1_2RC2/samples/addr/AddressBook.wsdl
//
Java2WSDL
Axis also supplies the reverse tool, Java2WSDL which facilitates the
creation
of a WSDL document from a supplied Java interface. The WSDL file
generated
can then be passed into WSDL2Java to generate the Java classes needed to
deploy the service on Apache Axis.
Following is the example supplied in the Apache Axis User Guide showing
how
this utility is invoked.
Apache Axis Java2WSDL Example
% java org.apache.axis.wsdl.Java2WSDL -o wp.wsdl
-l"http://localhost:8080/axis/services/WidgetPrice" -n "urn:Example6"
-p"samples.userguide.example6" "urn:Example6" samples.userguide.example6.WidgetPrice
Where:
- -o indicates the name of the output
WSDL file
- -l indicates the location
of the service
- -n is the target namespace of the WSDL file
- -p indicates a mapping from the package to a namespace.
There may be multiple mappings.
- the class specified contains the interface of the webservice.
An Example
Showing the Use of the Apache Axis WSDL Utilities
Consider the following simple Java interface whose service might be
described
as getting and setting a clubhouse password.
Java Interface Example
package clubhouse;
public interface Password{
public void setPassword(String string);
public String getPassword( );
}
Compile the above interface. Create a clubhouse directory and move the
compiled interface class into this directory. This interface class can
become
the argument to the Java2WSDL tool.
Example of Command Line
Invocation of Java2WSDL
[peter@localhost java]$ java org.apache.axis.wsdl.Java2WSDL -o
password.wsdl
-l"http://localhost:8080/axis/services/Password" -n "urn:Example"
-p"clubhouse"
"urn:Example" clubhouse.Password
//
notice no space between the flag character and the quotation marks
where applicabl
With a little luck, the following, Password.wsdl file appears in the
current directory.
//
white space edited for presentation
WSDL Generated By Apache Axis
Utility
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:Example"
xmlns:impl="urn:Example" xmlns:intf="urn:Example"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<!--WSDL
created by Apache Axis version: 1.2RC2
Built on Nov
16, 2004 (12:19:44 EST)-->
<wsdl:message name="getPasswordRequest">
</wsdl:message>
<wsdl:message name="getPasswordResponse">
<wsdl:part
name="getPasswordReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="setPasswordResponse">
</wsdl:message>
<wsdl:message name="setPasswordRequest">
<wsdl:part name="in0"
type="xsd:string"/>
</wsdl:message>
<wsdl:portType name="Password">
<wsdl:operation name="setPassword"
parameterOrder="in0">
<wsdl:input
name="setPasswordRequest" message="impl:setPasswordRequest"/>
<wsdl:output
name="setPasswordResponse" message="impl:setPasswordResponse"/>
</wsdl:operation>
<wsdl:operation name="getPassword">
<wsdl:input
name="getPasswordRequest" message="impl:getPasswordRequest"/>
<wsdl:output
name="getPasswordResponse" message="impl:getPasswordResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PasswordSoapBinding"
type="impl:Password">
<wsdlsoap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="setPassword">
<wsdlsoap:operation
soapAction=""/>
<wsdl:input
name="setPasswordRequest">
<wsdlsoap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:Example"/>
</wsdl:input>
<wsdl:output
name="setPasswordResponse">
<wsdlsoap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:Example"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getPassword">
<wsdlsoap:operation
soapAction=""/>
<wsdl:input
name="getPasswordRequest">
<wsdlsoap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:Example"/>
</wsdl:input>
<wsdl:output
name="getPasswordResponse">
<wsdlsoap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:Example"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PasswordService">
<wsdl:port name="Password"
binding="impl:PasswordSoapBinding">
<wsdlsoap:address
location="http://localhost:8080/axis/services/Password"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
This WSDL file can then be processed by the WSDL2Java tool.
Example
java org.apache.axis.wsdl.WSDL2Java /home/peter/java/password.wsdl
The Example Directory
This generates the the Example directory with the following Java Source
files listed. The "--skeletonDeploy true" option needs to be deployed
to
create a skeleton class.
the "--skeletonDeploy true" option, a skeleton
Directory and classes Created
Without the -skeletonDeploy flag Turned On
[peter@localhost Example]$ ls
Password.java
PasswordServiceLocator.java
PasswordService.java PasswordSoapBindingStub.java
The Java
Interface Corresponding To PortType
Following is the Password.java class 're-invented' as an RMI inteface
This is a Java class that represents the <portType> element.
The Inteface Reinvented as a RMI
Interface
/**
* Password.java
*
* This file was auto-generated from WSDL
* by the Apache Axis 1.2RC2 Nov 16, 2004 (12:19:44 EST) WSDL2Java
emitter.
*/
package Example;
public interface Password extends java.rmi.Remote {
public void setPassword(java.lang.String in0) throws
java.rmi.RemoteException;
public java.lang.String getPassword() throws
java.rmi.RemoteException;
}
The Java Service
Interface
The PasswordService.java class is an interface dedicated to
representing
the service that is defined. It is couched in terms of the Java RPC
API.
This class represents the <service> element.
JAX-RPC Form of the Interface
/**
* PasswordService.java
*
* This file was auto-generated from WSDL
* by the Apache Axis 1.2RC2 Nov 16, 2004 (12:19:44 EST) WSDL2Java
emitter.
*/
package Example;
public interface PasswordService extends javax.xml.rpc.Service {
public java.lang.String getPasswordAddress();
public Example.Password getPassword() throws
javax.xml.rpc.ServiceException;
public Example.Password getPassword(java.net.URL
portAddress) throws javax.xml.rpc.ServiceException;
}
The SOAP
Binding Stub
The PasswordSoapBindingStub.java does the heavy lifting and is
quite complex. It communicates with Service and Call objects which
are involved with sending the messaging over the wire. ( This
class
is too big and would 'sink' the note at this point. You can look at
your own version in the exercise.
The
ServiceLocator Class
"The service interface defines a get method for each port listed
in the
service element of the WSDL. The locator is the implementation of this
service interface. It implements these get methods. " -Apache
Axis User Guide
The methods of the
Service Locator would be overridden to supply the
serivce.
Other classes such as the Skeleton, and Holder classes were not
generated as special 'out' or 'in/out' methods were not used.
Exercise
// note if you are having trouble getting
Axis going reports
// of what trouble you have will
suffice for the previous
// assignment. See end of note for a
tip on Axis installation
// Axis should be available in the lab this week to do the
// basic parts of the following assignment
1) a) Using any of the examples provided as guides, create a
WSDL file for a service that will supply methods to
return
a GST, a PST value a total with tax value for any
value
passed into it. The XML schema decimal type could be
used to represent the dollar and cents amounts.
// GST
& PST are Federal & Provincial taxes of 8% and 7%.
b) Run the WSDL2Java translator supplied with
Apache
Axis on the file in order to create the Java classes that
would be used to deploy this service.
c) Briefly itemize the Java files that were created and
in a table correlate the classes
to the different parts
of the WSDL file.
c) Optional
Investigation: You may wish to proceed
to an implementation of the service on Axis.
It might
be worth waiting until next week when we study
JAX-RPC which will give us a better
understanding
of how Axis works.
AND / OR // PS You could use the Java2WSDL tool to
assist you in #1
2 ) a) Create a Java Inteface that defines two methods.
It can be something as simple as divide and multiply.
Remember the interface will define two abstract
methods.
b) Run it through the Apache Axis Java2WSDL command
supplying appropriate parameters.
c) Run the WSDL2Java command on the generated
WSDL file to create the collection of Java classes
needed to create a service.
c) Optional
Investigation
// as above
Note on associating JSWSDP with Tomcat After Installation
The Java Development Kit link to get version 5.
http://java.sun.com/j2se/1.5.0/download.jsp
Install as usual.
2 ) Install Apache Tomcat as usual. http://jakarta.apache.org/site/binindex.cgi#Release%20Builds
3) The JWSDP package expands in typical Sun fashion. You will encounter that there are two ways of installing the java web services package. This will come at you as the JWSDP wizard proceeds.
If you have Apache Tomcat already installed, the Java Web Services package wizard can be directed to automatically use it as it's web server. On my home machine, I had trouble getting the wizard to accept the location I had for Tomcat so I elected to make the connection between Tomcat and Java Web Services after the fact using the script described below. Following is the JWSDP download.
*To Test:* Before you install the JWSDP, and you open on Tomcat at http://localhost:8080 you will see the regular Tomcat Welcome page. After installing the JWSDP. (either connecting JWSDP to Tomcat at running the wizard or after using the script) you will see a different Welcome page when opening on localhost:8080. This tells you the install is successful and Apache Tomcat is ready to run the web services stuff.
Java Web Services Developer Pack 1.5 Download
http://java.sun.com/webservices/downloads/webservicespack.html
*Joining Java Web Services to Tomcat After Installation Using the Script*
To join the Web Services stuff to Tomcat after you have JWSDP installed you need to run a Web Services Script.
After the JWSDP is expanded, you will find a 'jwsdpontomcat' script under the following directories.
jwsdp-1.5 \ jwsdp-shared \ bin \ jwsdpontomcat.bat / // windows/
jwsdp-1.5 / jwsdp-shared / bin / jwsdpontomcat.sh /// solaris/ linux /
Run and if things go well it ends saying BUILD SUCCESSFUL. .
|