将应用发布成Web Service,有很多种方法,这里只介绍使用Axis提供的最简单的方式,有两种:JWS(Java Web Service) File和WSDD(Web ServiceDeployment Descriptor)。
1.JWS File-即时部署
1.1步骤
1.1.1拷贝 A.java文件到webapp-root目录下,重命名为A.jws
1.1.2等待一分钟左右,访问webapp-root下的A.jws
前提条件:该应用已经配置了Axis和引入相应的jar
访问地址示例:http://localhost:8080/axis_test/Calculator.jws
1.2测试
首先修改axis/samples.userguide.example2.CalcClient.java文件中的地址为你应用访问地址,接着将生成的CalcClient .class覆盖掉原来的。
进入axis目录下:
% java -cp %AXISCLASSPATH% samples.userguide.example2.CalcClient-p8080 add 2 5
Got result : 7
% java -cp %AXISCLASSPATH% samples.userguide.example2.CalcClient-p8080 subtract 10 9
Got result : 1
%
1.3总结
JWSFile部署方式,适合于非常简单的Web Service,你不能在jws中使用包,而且它是在运行时进行编译,所以你只能在部署之后发现错误,产品化的Web Service应该使用自定义class的方式进行部署。
2.WSDD-自定义部署
2.1WSDD文件
使用Web Service部署描述格式,一个部署描述文件包含很多需要部署的东西,一个简单的wsdd文件如下:
<deploymentxmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<servicename="MyService" provider="java:RPC">
<parametername="className"value="samples.userguide.example3.MyService"/>
<parametername="allowedMethods" value="*"/>
</service>
</deployment>
分析:
1最外层的元素deployment告诉引擎这是一个WSDD部署并且定义java命名空间
2service元素定义对外的服务,子元素包含:requestflow, pivot Handler,response flow.上述例子的provider是”java:RPC”,这意味着这是一个JavaRPC service,真正处理的类是org.apache.axis.providers.RPCPRovider.
3我们需要告诉RPCProvider实例化哪个类,并允许哪些方法能作为可被访问的方法。
2.1.1WSDD配置项
1 <parameter name=”scope” value=”[request,session.application]”>
Axis支持服务对象的三种作用域:
Request作用域:默认的作用域,在每次SOAP请求时创建新的服务对象;
Application作用域:创建一个单例共享的服务对象去服务所有请求;
Session作用域:对每一个session可用的客户端创建一个服务对象。
2 Handler和Chains
你可以自定义Handler来进行一些其它处理,如访问日志记录等,通过定义<handler>并在<service>下定义<requestFlow>来调用自定义的Handler
示例:
<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>
Handler在service调用之前被执行。
3 远程管理员设置
默认情况下,Axis服务配置成只允许本地访问,如果你希望可以远程管理,设置
AdminService服务下的参数enableRemoteAdmin为true
<service name="AdminService" provider="java:MSG"> <parameter name="className" value="org.apache.axis.util.Admin"/> <parameter name="allowedMethods" value="*"/> <parameter name="enableRemoteAdmin" value="true"/> </service>
警告:开启远程管理员可能会使不授权的请求访问你的机器,如果你这样做了,那么请确认添加了安全配置。
2.2部署
使用org.apache.axis.client.AdminClient进行部署
进入相应的应用deploy.wsdd的目录下:
执行:
% java -cp%AXISCLASSPATH% org.apache.axis.client.AdminClient –lhttp://localhost:8080/axis_test/services/AdminServicedeploy.wsdd
访问http://localhost:8080/axis_test/servlet/AxisServlet,即可看到刚部署的服务
2.3Service Style
在Axis中有四种ServiceStyle:
RPC Service使用SOAP RPC转换,实现java对象与xml的转换;
Document: 不使用任何编码(对象序列化),但是也做了XML<->Java;
Wrapped:与Document类似,只不过不对参数进行封装,而是单独作为参 数传递;
Message:接收和返回任意的XML,不进行任何的映射/数据绑定,适合于想 要获取原生XML的服务。
2.3.1 RPC Service
RPC Service是Axis的默认ServiceStyle,配置<service … provider=”java:RPC”>or
<service … style=”RPC”>发布成RPCService。
大致过程如下:
Document/ Wrapped Service
Document和Wrapped 相似之处在于都不使用SOAP对数据进行编码,仅仅只是简单的XML schema。但是Axis还是使用了Java对象来表示XML,所以你使用的还是Java对象,而不是直接对XML结构进行操作。
下面给出一个例子说明Document和Wrapped Service的不同。
SOAP message:
<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>
相关的schema 描述PurchaseOrder 如下所示:
<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"/> </schema>
对于Document Style Service,映射的函数类似:
public void method(PurchaseOrder po)
换句话说,实体PurchaseOrder封装三个字段作为函数的参数进行处理
而对于WrappedStyle Service,映射的函数类似:
public void purchaseOrder(String item, int quantity, String description)
函数中的每个参数单独对应请求的参数,不对参数进行封装处理。
Message Service
如果你想换取原始的XML而不是封装的Java 对象,那么你可以使用Message Service。这里有4个可用的函数规范:
public Element [] method(Element [] bodies); public SOAPBodyElement [] method (SOAPBodyElement [] bodies); public Document method(Document body); public void method(SOAPEnvelope req, SOAPEnvelope resp);
第1个和第2个函数允许接收DOM Element或SOAPBodyElement数组-这个数组包括一个或多个在 <soap:body>中定义的XML元素。
第3个函数允许使用DOM Document表示<soap:body>,而且返回也是如此。
第4个函数允许使用连个SOAPEnvelope 对象表示请求和响应消息,当你需要查看或修改头部信息时可以使用。传入responseenvelope的信息将自动返回给调用者,response envelope 可能已经包含通过其它Handlers插入的头部信息。
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>
Message Style 通过org.apache.axis.providers.java.MsgProvider进行处理。