- 浏览: 215843 次
- 性别:
- 来自: 辽宁
最新评论
-
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用户指南的第二部分。
5.服务Styles---RPC,Document,Wrapped和消息
Axis支持四种样式的服务。
RPC服务使用SOAP RPC惯例和SOAP section 5的编码。Document服务部使用任何编码方式(所以,不会看到多饮用的对象序列化或者SOAP-style数组),但是使用XML<-->Java数据绑定。Wrapped服务和document服务相似,但是Wrapped服务不是将整个SOAPbody绑定到一个大的结构,而是将它分成很多个体参数。Message服务接受和返回任意SOAP Envelope中的XML,并不进行类型映射和数据绑定。
如果只想使用原始的XML作为SOAP Envelope的输入和输出,那么就是用message服务。
RFC服务
RFC服务是Axis的默认服务。它们在部署描述符中的定义为<service....provider=”java:RPC”>或者<service....style=”RPC”>。RPC服务遵循SOAP RPC和编码规则,这意味着RPC服务的XML就像上面的echoString例子一样,每个RPC调用都作为操作名,包含的内部元素对应操作的参数。Axis会将XML反序列化成Java对象来适应服务,然后再将返回的Java对象进行序列化成XML返回。由于RPC服务默认使用soap section 5比阿玛规则,对象会通过multi-ref序列化,允许对对象图表进行编码。
Document/Wrapped服务
这两种服务很类似,都不对数据进行SOAP编码,而只是简单的XML Schema。在这两种情况中,Axis仍然对java表示与XML进行绑定,所以只需要处理Java对象,而不是直接处理XML结构。
下面是一个关于购买顺序的SOAP消息,用来说明两者的区别:
<soap:Envelope xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<soap:Body>
<myNS:PurchaseOrder xmlns:myNS="http://commerce.com/PO">
<item>SK001</item>
<quantity>1</quantity>
<description>Sushi Knife</description>
</myNS:PurchaseOrder>
</soap:Body>
</soap:Envelope>
PurchaseOrder元素的Schema如下:
<schema targetNamespace="http://commerce.com/PO">
<complexType name="POType">
<sequence>
<element name="item" type="xsd:string"/>
<element name="quantity" type="xsd:int"/>
<element name="description" type="xsd:string"/>
</sequence>
</complexType>
<element name="PurchaseOrder" type="POType"/>
</deployment>
对于Document样式的服务,将会映射到一个如下的方法:
public void method(PurchaseOrder po)
也就是说,整个<PurchaseOrder>元素作为方法的一个单独的bean对象参数,这个Bean类应该有三个成员属性。而对于wrapped样式的服务来说,将会映射到如下的方法:
public void purchaseOrder(String item,int quality,String description)
注意在这种情况的大小写,<PurchaseOrder>元素是一个”wrapper”,只处理正确的操作。方法的参数就是unwrap外层元素后的每一个内层元素。
document或者wrapped样式的定义是在WSDD中定义的:
<service ... style="document"> for document style
<service ... style="wrapped"> for wrapped style
当使用WSDL文档创建Web Service的时候,就不需要担心到底是哪种服务了。
Message服务
最后是Message样式的服务,当需要使Axis无效,将代码作为实际的XML查看而不是java对象的时候,就使用这种服务。
下面是四的message-style服务的方法的合法信号
public Element [] method(Element [] bodies);
public SOAPBodyElement [] method (SOAPBodyElement [] bodies);
public Document method(Document body);
public void method(SOAPEnvelope req, SOAPEnvelope resp);
前两个将方法的数组传给方法DOM元素或者SOAPBody元素的数组-----这个数组包含<soap:body>中的每一个XML元素。
第三个方法传递一个DOM文档,这个文档表示<soap:body>,并期望同样的返回。
最后一个传递两个SOAPEnvelope对象来表示请求和响应消息,这意味着可以在服务方法中查看或者修改headers。
Message样例
在Axis的例子中,samples\message\MessageService.java就是一个Message服务的例子,服务的类是MessageService,包含一个公开方法,echoElement,符合上述中的第一个方法:
public Element[] echoElements(Element[] elems)
MsgProvider是一个handler,它调用echoElement()方法,传递一个org.w3c.dom.Element的数组作为参数,作为输入信息的SOAPbody的直接子元素。一般来说,这个数组会包含一个单独的Element(可能是一个XML文档的根元素),但是SOAP Body可以处理任意多个子元素。这个方法返回一个Element[]数组作为响应消息的SOAP Body。
package samples.message ;
import org.w3c.dom.Element;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPElement;
/**
* Simple message-style service sample.
*/
public class MessageService {
/**
* Service method, which simply echoes back any XML it receives.
*
* @param elems an array of DOM Elements, one for each SOAP body element
* @return an array of DOM Elements to be sent in the response body
*/
public Element[] echoElements(Element [] elems) {
return elems;
}
public void process(SOAPEnvelope req, SOAPEnvelope resp) throws javax.xml.soap.SOAPException {
SOAPBody body = resp.getBody();
Name ns0 = resp.createName("TestNS0", "ns0", "http://example.com");
Name ns1 = resp.createName("TestNS1", "ns1", "http://example.com");
SOAPElement bodyElmnt = body.addBodyElement(ns0);
SOAPElement el = bodyElmnt.addChildElement(ns1);
el.addTextNode("TEST RESPONSE");
}
}
MessageService的WSDD文件内容如下:
<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
<service name="MessageService" style="message">
<parameter name="className" value="samples.message.MessageService"/>
<parameter name="allowedMethods" value="echoElements"/>
</service>
</deployment>
注意这里使用的是style=”message”,而不是使用provider=”java:RPC”。message style告诉Axis本服务是由org.apache.axis.providers.java.MsgProvider来处理的,而不是org.apache.axis.providers.java.RPCProvider。
6.XML<---->Java数据映射
将Java类型映射到SOAP/XML类
互操作,或者叫interop,是各种SOAP实现之间的一个存在的挑战。如果期望服务在其他的平台和实现上也可以使用,需要理解这个概念。Axis中Java类型到WSDL/XSD/SOAP的映射由JAX-RPC规范确定。相关内容请参考JAX-RPC规范。
WSDL到Java的标准映射
xsd:base64Binary 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
如果在WSDL中声明了一个对象是nillable的,则调用者可以选择返回值为0,这样的话,原始数据类型可以使用它们的包装类代替,例如Byte、Double、Boolean。
SOAP编码数据类型
和XSD数据类型相对应的是SOAP ‘Section 5’数据类型,这些数据类型都是nillable的,所以总是可以和包装类映射。这些类型之所以存在是因为他们都支持ID和HREF属性,所以也用于当一个RPC编码的context来支持multi-ref序列化。
7.异常
一般来说,Axis将java.rmi.RemoteException映射成为SOAP Fault。这部分内容在笔者介绍的Axis2的文章中有比较详细的介绍,请参考。
8.Axis可以/不可以通过SOAP发送的内容
Java的集合框架元素,例如Hashtable,具有序列器,但是和其它的SOAP实现没有正式的交互操作能力,并且在SOAP规范中没有对应的复杂对象。最可靠的发送集合对象的办法就是使用数组。
没有预先注册的对象:不能发送任意的Java对象,并且期望它们可以被在服务器端被理解。在使用RMI的时候,可以发送和接受实现了Serializable接口的Java对象,那是由于双发都是使用Java。Axis值可以发送那么被Axis序列器注册的对象。文本后面会介绍如何使用BeanSerializer来序列化任何符合JavaBean规范的类。
远程引用:远程引用(Remote Reference)既不是SOAP规范的一部分,也不是JAX-RPC的一部分,所以不能返回对象的引用,然后期望调用者可以使用它作为SOAP调用的参数或者其他调用的参数。此时应该使用其他的方案,例如将他们存储在HashMap中,使用数字或者字符串键值来进行标识,这样就可以传递键值。
9.编码Beans---BeanSerializer
Axis具有序列化和反序列化的能力,不需要编写代码,任何Java类,主要它遵守标准JavaBean的模式,那么就只需要告诉Axis Java类与XML Schema类型之间的映射,配置方式如下:
<beanMapping qname=”ns:local” xmlns:ns=”someNamespace”
languageSecificType=”java:my.java.thingy”/>
<beanMapping>标签将一个Java类映射到一个XML QName。主要它包含两个重要的属性,qname和languageSpecificType。所以在上例中,将my.java.thingy类映射到XML QName:[someNamespace]:[local]。
下面看一个例子:BeanService.java
package samples.userguide.example5;
public class BeanService
{
public String processOrder(Order order)
{
String sep = System.getProperty("line.separator");
String response = "Hi, " + order.getCustomerName() + "!" + sep;
response += sep + "You seem to have ordered the following:" + sep;
String [] items = order.getItemCodes();
int [] quantities = order.getQuantities();
for (int i = 0; i < items.length; i++) {
response += sep + quantities[i] + " of item : " + items[i];
}
response += sep + sep +
"If this had been a real order processing system, "+
"we'd probably have charged you about now.";
return response;
}
}
上面的代码中,Order类是一个JavaBean类。由于Order类不是一个基本类型,这样Axis就不能识别它,所以一个错误的wsdd是下面这样的:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="OrderProcessor" provider="java:RPC">
<parameter name="className" value="samples.userguide.example5.BeanService"/>
<parameter name="allowedMethods" value="processOrder"/>
</service>
</deployment>
而正确的wsdd文件应该为下面的文件:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<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.Order"/>
</service>
</deployment>
运行的结果如下:
此时在Client类中需要添加如下的代码:
QName qn = new QName( "urn:BeanService", "Order" );
call.registerTypeMapping(Order.class, qn,new org.apache.axis.encoding.ser.BeanSerializerFactory(Order.class, qn), new org.apache.axis.encoding.ser.BeanDeserializerFactory(Order.class, qn));
Axis允许用户编写自定义的序列器和反序列器,并提供了实现序列器和反序列器的工具。现在只需要查看DataSer/DataDeser类、BeanSerializer/BeanDeserializer、ArraySerializer/ArrayDeserializer以及org.apache.axis.encoding.ser包中的其他类。
部署自定义的映射----<typeMapping>标签
在建立了自定义的序列器和反序列器后,需要告诉Axis这些序列器的应用范围,通过在WSDD中使用它:
<typeMapping qname="ns:local" xmlns:ns="someNamespace"
languageSpecificType="java:my.java.thingy"
serializer="my.java.Serializer"获取序列器的序列器工厂类
deserializer="my.java.DeserializerFactory" 、、
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
实际上<beanMapping>是<typeMapping>的一个简化,其中serializer=”org.apache.axis.encoding.ser.BeanSerializerFactory”,deserializer=”org.apache.axis.encoding.ser.BeanDeserializerFactory”,encodingStyle=”http://schemas.xmlsoa.org/soap/encoding”。
<arrayMapping qname="ns:ArrayOfthingy" xmlns:ns="someNamespaceURI"
languageSpecificType="java:my.java.array.thingy[]"
innerType="ns2:thingy" xmlns:ns2="anotherNamespaceURI" 数组的元素类型
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
发表评论
-
将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. 安全性实现 - **身份验证**:通过用户名/密码、证书等...
Axis2快速指南,一本不错的小书,英文,解压缩之后是PDF格式。
8. **LICENSE.txt**:这个文件包含了Apache Axis2的许可条款,它遵循Apache License Version 2.0,这是一种宽松的开源许可,允许用户自由地使用、修改和分发软件。 总之,这两个压缩包提供了Apache Axis2的两种部署...
本书《Packt - Quickstart Apache Axis2》是一本专为初学者设计的指南,旨在帮助读者快速掌握Apache Axis2的核心概念和技术。 在Web服务的世界中,Apache Axis2扮演着至关重要的角色,它提供了一个高效的执行引擎,...
`docs`目录则包含了相关的用户指南和技术文档,方便查阅。 8. **Web应用程序部署**:`webapps`目录包含了一个预配置的Axis Web应用,可以直接在Servlet容器如Tomcat中部署,以提供Web服务。 9. **XML配置**:Axis ...
2. **如何在Eclipse和Tomcat环境中使用Apache Axis**:这包括了如何设置开发环境,以及如何在Eclipse IDE中配置Tomcat服务器以支持Apache Axis项目。 3. **如何使用WSS4J加密和签名SOAP消息**:WSS4J(Web Services ...
### 开发Web服务使用Apache Axis2的...通过上述总结,我们可以看出《使用Apache Axis2开发Web服务》这本书是一本非常实用的指南,不仅提供了详细的步骤指导,还涵盖了多项高级技术的应用,适合不同层次的开发者阅读。
Apache Axis的快速启动指南是初学者进入Web服务开发领域的理想起点。 在本文中,我们将深入探讨Apache Axis的关键特性、安装过程、配置方法以及如何创建和部署Web服务。首先,让我们理解Web服务的基本概念。 **Web...
本书《Quickstart Apache Axis2》由Deepal Jayasinghe撰写,旨在为读者提供一个实用的指南,帮助读者快速掌握如何使用Apache Axis2创建高质量的Web服务。 #### 二、核心概念与术语 - **SOAP (Simple Object Access...
《Quickstart Apache Axis2》是一本非常实用的指南,适合希望了解并掌握Apache Axis2的开发者阅读。通过学习本书,读者不仅可以了解到Apache Axis2的核心特性和使用方法,还能深入理解如何利用该框架构建高效稳定的...
【标题】"myeclipse集成axis2"涉及的是在MyEclipse 6.5这个集成开发环境中整合Apache Axis2框架的过程。Axis2是Java平台上一个高效、可扩展且灵活的Web服务引擎,它用于创建和部署Web服务。MyEclipse作为Eclipse的...
Axis2是Apache软件基金会的一个用于构建和部署WebService的引擎,它基于Apache Axis项目,并且是Apache Web服务堆栈的最新版本。Axis2支持SOAP和REST风格的WebService,并且能够以最小的资源消耗和高性能来处理SOAP...
- 文档:包含API参考、用户指南和安装说明,帮助开发者理解和使用该框架。 - 配置文件:用于设置服务的行为和日志记录级别。 - 工具:可能包括编译和部署Web服务的辅助脚本或程序。 **使用Apache Axis的流程** 1. *...
eclipse axis2 插件安装指南 Axis2 是一个开源的 Web 服务引擎,由 Apache 软件基金会维护。它提供了一个灵活、可扩展、性能高效的 Web 服务解决方案。Eclipse 是一个流行的集成开发环境(IDE),Axis2 插件安装...
`Apache Axis初级教程---安装、应用.doc`是一个详细指南,涵盖了从安装到实际操作的所有步骤。它会指导你如何配置Axis,如何创建和发布Web服务,以及如何测试服务的有效性。这份文档对于初学者来说是非常宝贵的资源...
Apache Axis2遵循Apache Software License 2.0,这意味着用户可以自由地使用、修改和分发源代码,但需要保留版权和许可声明。 2. README.txt:这个文件通常包含项目的基本介绍、安装指南、使用说明、系统需求和其他...