使用Axis发布Web Service

将应用发布成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进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值