- 浏览: 215837 次
- 性别:
- 来自: 辽宁
最新评论
-
bill200711022:
实测结果:就算把父类声明放在子类声明之后,也不会报错“Stri ...
PHP Strict Standards问题 -
congjl2002:
niuzk 写道我在office 2003下运行楼主的Exce ...
Java程序员的第一个VBA程序 -
Liv:
[i][/i]引用[img][/img][ ...
MyEclipse下部署Roller4.0 -
hyt5926:
神解决!!谢了.
Apache的443端口被占用解决方法 -
congjl2002:
ligongxiang 写道请问在JDK1.5上使用class ...
Oracle 10.2.0 最新的JDBC驱动ojdbc14.jar
本部分是apache axis用户指南的第三部分。在Axis中使用WSDL文件。
10.使用WSDL
Web Service Description Language是由IBM和Microsoft完成的规范,并且被很多其他的组织所支持。WSDK用于结构化的描述Web Services。Web服务的WSDL是由程序来使用的,它包含了服务的接口,服务使用的数据类型以及服务的位置。更多的内容,可以参考W3C的WSDL规范。
Axis通过以下三宗方式来支持WSDL
¨ 在Axis中发布一个服务后,用户可以通过标准的web浏览器来访问服务的URL,在后面添加一个?WSDL,这样就可以获得自动生成的服务的WSDL文件。
¨ 提供了一个WSDL2Java工具,用于根据WSDL文件生成Java代理类和框架类。
¨ 提供了一个Java2WSDL工具,用于根据Java类构建WSDL文件。
?WSDL:获取服务的WSDL文件
当通过Axis成功发布一个服务后,这个服务和唯一的一个URL相关联。对于JWS文件来说,URL就是JWS文件本身的路径;对于非JWS服务来说,一般情况下URL的格式如下:
http://<host>[:port]/axis/services/<service-name>
如果可以通过浏览器访问服务的URL,那么就会看到一个提示消息,提示终端节点是一个Axis服务,那么你应该通过SOAP来访问。提示信息如下:
<service-name>
Hi there, this is an AXIS service!
Perhaps there will be a form for invoking the service here...
然而,如果在URL后面添加一个”?wsdl”,那么Axis会自动生成一个服务的WSDL文件,并在浏览器中以XML格式显示,如下图所示:
WSDL2Java:根据WSDL文件创建Stubs、Skeletons和数据类型
客户端绑定
Axis的WSDL-to-Java工具的类为org.apache.axis.wsdl.WSDL2Java,基本调用方式如下:
java org.apache.axis.wsdl.WSDL2Java (WSDL-file-URL)
这会为客户端生成必要的绑定,这个过程中Axis遵守JAX-RPC规范。假设执行以下命令:
cm %AXIS_HOME%\samples\addr
java org.apache.axis.wsdl.WSDL2Java AddressBook.wsdl
这会在%AXIS_HOME%\samples\addr\AddressFetcher2目录生成很多类。他们之所以在这里生成,是由于这是WSDL中声明的targetNamespace,并且是映射到Java的包名。名称空间会在下面进行说明:
类型
根据WSDL类型生成的Java类根据WSDL的类型进行命名。一般来说(不是绝对的),这个java类会是一个bean。例如下面的WSDL类型:
<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>
WSDL2Java会生成如下的Java类:
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() {...}
}
XML-->Java的映射:元数据
上面例子中的XML类型名为phone,而生成的Java类名为Phone,第一个字母为大写,以适应Java编码规范。这种映射经常发生,因为对于XML的名称或者标志符的限制要比Java少得多。例如,如果phone的子元素的名字为new,那么由于new是Java中的保留字,所以不能生成这样的成员属性。为了支持这种类型的映射,同时支持XML属性的序列化与反序列化,通过类型元数据系统来关联Java数据类和描述符。
当WSDL2Java工具生成了一个数据bean,例如上面的Phone类,它会观察是否schema中包含一些没有直接映射到Java的成员变量的属性或者名字。如果有的话,就会生成一个静态的代码片断并为这个类提供一个类型描述符。类型描述符是一个变量描述符的集合,每一个变量描述符将Java的变量映射到XML元素或者属性。
// Type metadata
private static TypeDesc typeDesc;
static {
typeDesc = new TypeDesc(AttributeBean.class);
FieldDesc field;
// An attribute with a specified QName
field = new AttributeDesc();
field.setFieldName("name");
field.setXmlName(new QName("foo", "nameAttr"));
typeDesc.addFieldDesc(field);
// An attribute with a default QName
field = new AttributeDesc();
field.setFieldName("male");
typeDesc.addFieldDesc(field);
// An element with a specified QName
field = new ElementDesc();
field.setFieldName("age");
field.setXmlName(new QName("foo", "ageElement"));
typeDesc.addFieldDesc(field);
}
Holders
这种类型作为输入输出或者输出参数使用。Java没有输入输出/输出参数的概念。为了实现这种行为,JAX-RPC指定使用holder类。一个Holder类似一个简单的java类,包含了它的一个类型。例如上面例子中的Phone类的holder类如下:
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;
}
}
holder类只有在类型被作为输入输出或者输出参数的时候才被生成。Holder类实在类名后面加上后缀Holder来命名,并且生成到包名为holders下面。
PortTypes
服务定义接口(Service Definition Interface,SDI)是继承了WSDL的portType的接口,可以通过这个接口访问服务操作。例如下面的WSDL:
<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>
WSDL2Java会生成如下的接口:
public interface AddressBook extends java.rmi.Remote {
public void addEntry(String name, Address address) throws java.rmi.RemoteException;
}
SDI接口的名字就是portType得名字。为了构造SDI,WSDL2Java需要从portType何binding种同时获取信息。
JAX-RPC规范对这部分的说明是:
"The name of the Java interface is mapped from the name attribute of the wsdl:portType element. ... If the mapping to a service definition interface uses elements of the wsdl:binding ..., then the name of the service definition interface is mapped from the name of the wsdl:binding element."
这个规范是JAX-RPC,这意味着只适用于portType是一个RPC接口。如果绑定的信息不是RPC,那么将使用绑定的名称。
可以有一个portType—pt和两个绑定bRPC和bDoc,这样的话就不能为两个绑定使用一个接口,此时需要使用两个接口,一个叫pt,另一个叫bDoc,同时还要生成两个stubs,一个叫bRPCStub(实现了pt),另一个叫bDocStub(实现了bDoc)。
document/literal改变了接口的形式。
绑定
Stub类实现了SDI,Stub的名字是绑定的名字+Stub。它包含将方法调用转换成SOAP调用的代码,通过使用Axis的Service和Call对象。它作为远程服务的代理,使调用时就像调用本地对象一样。也就是说,不需要处理endpoing的URL,名称空间或者参数数组,这些需要通过Service和Call对象动态调用。Stub隐藏了所有这些的具体实现。
根据下面的WSDL片段:
<binding name="AddressBookSOAPBinding" type="tns:AddressBook">
...
</binding>
WSDL2Java会生成如下的Stub:
public class AddressBookSOAPBindingStub extends org.apache.axis.client.Stub
implements AddressBook {
public AddressBookSOAPBindingStub() throws org.apache.axis.AxisFault
{...}
public AddressBookSOAPBindingStub(URL endpointURL,
javax.xml.rpc.Service service)
throws org.apache.axis.AxisFault
{...}
public AddressBookSOAPBindingStub(javax.xml.rpc.Service service)
throws org.apache.axis.AxisFault
{...}
public void addEntry(String name, Address address) throws RemoteException
{...}
}
Services服务
正常来讲,客户端应用程序不会直接实例化一个stub,而是实例化一个service locator,然后调用一个方法来返回stub。这个locator是根据WSDL中的服务元素来指定的。WSDL2Java根据service元素生成两个独享,例如:
<service name="AddressBookService">
<port name="AddressBook" binding="tns:AddressBookSOAPBinding">
<soap:address location="http://localhost:8080/axis/services/AddressBook"/>
</port>
</service>
WSDL2Java会生成如下接口和类:
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;
}
实现了AddressBookServie的类:
public class AddressBookServiceLocator extends org.apache.axis.client.Service
implements AddressBookService {
...
}
Service接口定义了WSDL中定义的每个接口的get方法。locator实现了service接口,也就是说它实现了get方法。它用来获取Stub实例。Service类会默认的创建一个指向endpoint URL的Stub,但是当请求PortType的时候,可能需要指定一个不同的URL。
一个典型的stub类的应用如下:
public class Tester
{
public static void main(String [] args) throws Exception {
// Make a service
AddressBookService service = new AddressBookServiceLocator();
// Now use the service to get a stub which implements the SDI.
AddressBook port = service.getAddressBook();
// Make the actual call
Address address = new Address(...);
port.addEntry("Russell Butek", address);
}
}
服务器端的绑定
就像在客户端有一个Web Service的Java stub一样,一个Java 框架的skeleton在服务器端使用。为了生成Skeleton类,需要使用WSDL2Java的—server-side –skeletonDeploy true选项。例如,仍旧使用AddressBook.wsdl文件:
java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true AddressBook.wsdl
可以看到WSDL2Java生成了所有在之前生成的client端的类,但是又声称了一些新的文件:
如果不指定—skeletonDeploy true选项,那么不会生成skeleton,而是生成的deploy.wsdd文件指示实现类已经直接部署了。在这种情况下,deploy.wsdd文件包含了额外的元数据来描述实现类的操作和参数。通过下面的方法可以直接部署服务:
java org.apache.axis.wsdl.WSDL2Java --server-side AddressBook.wsdl
下面是在服务器端生成的文件:
绑定
Skeleton描述
Skeleton类是介于Axis engine和实际的服务实现之间的类。它的名字就是绑定的名字+Skeleton。例如对于AddressBook绑定,WSDL2Java会生成如下的Skeleton:
public class AddressBookSOAPBindingSkeleton implements AddressBook,
org.apache.axis.wsdl.Skeleton {
private AddressBook impl;
public AddressBookSOAPBindingSkeleton() {
this.impl = new AddressBookSOAPBindingImpl();
}
public AddressBookSOAPBindingSkeleton(AddressBook impl) {
this.impl = impl;
}
public void addEntry(java.lang.String name, Address address)
throws java.rmi.RemoteException
{
impl.addEntry(name, address);
}
}
实际的Skeleton类可能内容还有很多,这里只拷贝了基本的框架。
skeleton类包含一个AddressBook服务的实现。这个实现要么通过构造器传递给skeleton,要么是一个生成的实现的实例。当Axis engine调用skeleton的addEntry的方法时,它只需要简单的将调用分配给实际的实现的addEntry方法。
实现模板描述
WSDL还根据绑定生成了一个实现模板:
public class AddressBookSOAPBindingImpl implements AddressBook {
public void addEntry(String name, Address address)
throws java.rmi.RemoteException {
}
}
这个类实际上只是一个实现的测试,并没有做任何事,它预想服务的编程人员来根据这个模板完成具体的实现。
服务
这个工具同时生成了deploy.wsdd和undeploy.wsdd文件,可以供AdminClient食用。这些文件只有当填充了实现类的具体方法后,编译类文件,然后将类文件放到Axis engine可以访问的位置后,才可以调用AdminClient方法来发布服务。
11.Java2WSDL
这个工具笔者就不介绍了
笔者认为使用WSDL2Java工具生成的代码中冗余的代码太多,并且编码规范有一些ApacheAxis-Specific,所以觉得还是自己手写代码比较好一些。
一旦写完了Java代码,可以通过Web浏览器访问,获取WSDL文件,没有必要使用Java2WSDL了。
12.公开的Axis接口
Axis公开的接口相对稳定,可以使用,即使Axis重构的话,这部分也应该不会修改。或者做一些兼容性的修改。
可以实现的一些Apache Axis的接口如下:
JAX-RPC的一些接口,这些接口是针对JAX-RPC规范1.0的,会根据新的规范进行修改。
Axis接口:这些相对不稳定。
12.重要的类
org.apache.axis.MessageContext
Axis所知道的关于请求/响应的所有的信息都是通过MessageContext来获取的。Axis将下面的内容存储在MessageContext中:
AxisEngine的引用
请求和响应的消息(org.apache.axis.Message对象可以通过Getter和Setter方法存取)
无状态以及服务范围的信息(服务是否维持session信息)
当前处理状态
认证信息(用户名和密码,可以由servlet服务器提供或者其他方式)
丰富的属性。几乎所有关于属性的信息都可以通过MessageContext.getProperty()方法获取。只需要知道属性的名称,通常是一个常量,定义在例如org.apache.axis.transport.http.HTTPConstants这样的类中。例如,可以获取Axis Servlet的ServletContext,通过(HttpServlet)msgC.getProperty(HTTPConstants.MC_HTTP_SERVLET).getServletContext()。
在服务中,当前的MessageContext总是可以通过静态的方法MessageContext.getCurrentContext()获取。
org.apache.axis.Message
org.apache.axis.Message对象是Axis对SOAP消息的一种表示。请求和响应消息可以从MessageContext中获取(如上所述)。Message包括:
MIME头(如果message本身包含MIME信息)
附件(如果message本身包含附件)
SOAPPart(快速获取SOAPPart的SOAPEnvelope),可以通过SOAPPart访问SOAP的任意信息(<soap:Envelope>标签内的任意信息)
org.apache.axis.SOAPEnvelope
一个MessageContext有两个Message,每个都包含一个SOAPPart,SOAPPart包含SOAPEnvelope。SOAPEnvelope包含SOAP信封的所有内容。可以从SOAPEnvelope中获取SOAP Header和SAOP Body。
更多内容,参考具体的API。
发表评论
-
将oracle用户密码设置为永不过期
2016-02-28 20:40 945修改oracle用户密码永不过期。为了测试 ... -
SQL Server 因为正在使用 无法还原解决方法
2016-02-26 12:00 870有时候我们需要还原数据库,但是由于程序或者其他人正在操作数据 ... -
SQL Server Management Studio连接服务器时指定端口号
2016-02-25 15:40 1233今天想连接SQL Server服务器,需要指定端口号。 各 ... -
Fixing SVN Edge Database after failed upgrade to 5.x
2015-08-08 22:55 2407问题:Cannot login to console aft ... -
Oracle管理员代理普通用户操作
2014-10-15 16:11 843-- 1. 以DBA身份连接至数据库,创建一个代 ... -
Linux tar压缩时排除某个目录或文件的参数
2012-05-03 08:58 1288在对某个目录进行压缩的时候,有时候想排除掉某个目录,例如: ... -
ubuntu 11.10 安装 java环境
2012-04-07 15:07 1042声明:一下内容主要来自网络,本来在此基础上根据自己的成功经验做 ... -
Xml转CSV的小工具
2012-02-09 17:59 2953这个挺好用,而且不需要预定义模板 -
Oracle好文章
2012-02-09 16:18 770Oracle IO http://blog.163.com/ ... -
c# sqlite好文章
2011-11-15 23:28 811http://www.dreamincode.net/foru ... -
eclipse或者myeclipse的Help菜单下找不到SoftWare Updates菜单的解决
2011-10-25 13:34 1711In some situations you may not ... -
VirtualBox问题汇总
2011-10-25 10:12 8171.windows共享文件夹 映射网络驱动\\vboxsvr ... -
Word页眉插入章节名
2011-09-20 10:29 1673一篇长的Word文档中保存了多篇文章,通过域功能,可以把文章的 ... -
Access restriction: The type FtpClient is not accessible due to restriction on r
2011-06-27 15:31 2798在做ftp,代码中引用import sun.net.ftp.F ... -
iTunes备份目录
2011-06-16 23:26 1440iTunes 将备份文件存放在以下位置:Windows XP: ... -
bash中获得文件名和文件路径
2011-06-10 17:15 920[root@mail /]# dirname /root/ ... -
VirtualBox3.2.12在CentOS中共享Windows文件夹
2011-05-01 23:04 3980http://www.51testing.com/?uid-1 ... -
java中判断字符串是否为数字的三种方法
2010-09-27 11:06 10791用JAVA自带的函数public static ... -
win7右键新建为空解决办法
2010-06-27 20:53 3660环境:win7 Ultimate 问题:右键的新建菜单为空 ... -
gbk, gb2312,big5,unicode,utf-8,utf-16的区别
2010-05-05 23:52 1360以前收藏的一篇 标题 谈谈Unicode编码,简要解释UCS、 ...
相关推荐
本部分的用户指南主要关注如何在Axis中利用WSDL(Web Service Description Language)文件来操作Web服务。 WSDL是一种XML格式的语言,由IBM和Microsoft共同开发,并得到了广泛的行业支持。它定义了Web服务的接口、...
6. **开源社区支持**:作为Apache项目的一部分,Axis2拥有一个活跃的开发者和用户社区,可以提供技术支持和资源。 ### 三、创建安全可靠的Web服务 #### 1. 安全性实现 - **身份验证**:通过用户名/密码、证书等...
`docs`目录则包含了相关的用户指南和技术文档,方便查阅。 8. **Web应用程序部署**:`webapps`目录包含了一个预配置的Axis Web应用,可以直接在Servlet容器如Tomcat中部署,以提供Web服务。 9. **XML配置**:Axis ...
Axis2快速指南,一本不错的小书,英文,解压缩之后是PDF格式。
总而言之,《使用Apache Axis开发Web服务》不仅是一本实用性极强的技术手册,更是一部引导初学者快速掌握Web服务开发技能的指南。无论是对于刚接触Web服务的新手还是寻求提升技术水平的开发者来说,这本书都是...
本书《Packt - Quickstart Apache Axis2》是一本专为初学者设计的指南,旨在帮助读者快速掌握Apache Axis2的核心概念和技术。 在Web服务的世界中,Apache Axis2扮演着至关重要的角色,它提供了一个高效的执行引擎,...
8. **LICENSE.txt**:这个文件包含了Apache Axis2的许可条款,它遵循Apache License Version 2.0,这是一种宽松的开源许可,允许用户自由地使用、修改和分发软件。 总之,这两个压缩包提供了Apache Axis2的两种部署...
Apache Axis的快速启动指南是初学者进入Web服务开发领域的理想起点。 在本文中,我们将深入探讨Apache Axis的关键特性、安装过程、配置方法以及如何创建和部署Web服务。首先,让我们理解Web服务的基本概念。 **Web...
### 开发Web服务使用Apache Axis2的...通过上述总结,我们可以看出《使用Apache Axis2开发Web服务》这本书是一本非常实用的指南,不仅提供了详细的步骤指导,还涵盖了多项高级技术的应用,适合不同层次的开发者阅读。
`Apache Axis初级教程---安装、应用.doc`是一个详细指南,涵盖了从安装到实际操作的所有步骤。它会指导你如何配置Axis,如何创建和发布Web服务,以及如何测试服务的有效性。这份文档对于初学者来说是非常宝贵的资源...
- 文档:包含API参考、用户指南和安装说明,帮助开发者理解和使用该框架。 - 配置文件:用于设置服务的行为和日志记录级别。 - 工具:可能包括编译和部署Web服务的辅助脚本或程序。 **使用Apache Axis的流程** 1. *...
由于Apache官方网站已不再提供Axis1.3的下载,用户可能需要从镜像站点或第三方仓库获取这些资源。虽然较新的版本如Axis2提供了更多的功能和改进,但许多现有系统可能仍依赖于Axis1.3,因此理解和使用这个版本仍然是...
《Quickstart Apache Axis2》是一本非常实用的指南,适合希望了解并掌握Apache Axis2的开发者阅读。通过学习本书,读者不仅可以了解到Apache Axis2的核心特性和使用方法,还能深入理解如何利用该框架构建高效稳定的...
本书《Quickstart Apache Axis2》由Deepal Jayasinghe撰写,旨在为读者提供一个实用的指南,帮助读者快速掌握如何使用Apache Axis2创建高质量的Web服务。 #### 二、核心概念与术语 - **SOAP (Simple Object Access...
【AXIS入门指南-webservice】 本指南旨在为初学者提供AXIS框架下开发WebService的详细步骤,涵盖了从获取开发资源、生成 stub、编写服务器端代码到客户端测试的全过程。AXIS是一个开源的Java库,它提供了创建、部署...
Apache Axis1.4是Apache软件基金会的一个开源项目,旨在提供一个完整的SOAP协议实现,它支持Web服务的创建、部署和使用。Axis项目最早是作为Apache SOAP项目的后继者出现的,用于解决在旧版本中遇到的问题和限制。...