上一篇
目    录
下一篇
  Apache Axis2用户指南 - 搭建服务

现在你知道如何根据WSDL用Axis2来生成客户端了,这部分我们将再深入一些,向你展示如何建立服务,以及从无到有,白手起家建立服务和客户端。

  目录

  可选择的方法

Axis2提供了一些建立服务的方法,例如: 让我们来看看这三种方法。

  从无到有建立服务

白手起家建立服务不是最方便的方法,但是它能给你最多的控制。这个过程设计以下步骤。简要说明:
  1. 建立一个服务类,里面的所有操作都由一个方法表示,这些方法接受一个org.apache.axiom.om.OMElement对象作为它的参数。(OMElement是Axis2对象模型(AXIOM)表示的XML元素。)
  2. 建立服务描述文件services.xml,它定义了服务所用的类和相应的消息接收者。
  3. 建立一个aar文件,里面包括放置在正确位置的类文件和在META-INF目录下的services.xml文件。
  4. 用Web管理应用或者复制aar文件到services目录来部署服务。
详细说明:我们从建立服务类开始,这个普通Java类使用了Axis2库中的类(见代码列表8)。

代码列表8 – 建立服务类
package org.apache.axis2.axis2userguide;

import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;

public class SampleService {

    public OMElement sayHello(OMElement element) 
                             throws XMLStreamException {
            element.build();
            element.detach();

            String rootName = element.getLocalName();
            System.out.println("Reading "+rootName+" element");
            
            OMElement childElement = element.getFirstElement();
            String personToGreet = childElement.getText();

            OMFactory fac = OMAbstractFactory.getOMFactory();
            OMNamespace omNs = fac.createOMNamespace("http://example1.org/example1", "example1");
            OMElement method = fac.createOMElement("sayHelloResponse", omNs);
            OMElement value = fac.createOMElement("greeting", omNs);
            value.addChild(fac.createOMText(value, "Hello, " + personToGreet));
            method.addChild(value);

            return method;
        }

     private void ping(){
     }
    
}
在编译源码的时候确认Axis2库包含在你的classpath中。Axis2使用AXIOM,或者说AXIs对象模型,一个基于StAX API(Streaming API for XML)的类DOM (Document Object Model)结构。作为服务的方法必须接受一个OMElement对象作为它的参数,这个参数代表输入SOAP消息的负载内容。(OMElement是用AXIOM来表示XML元素的方式,就象一个DOM元素对象一样。)在这个例子里,你展开负载中第一个子元素的内容,加入文本,并将它作为返回OMElement的内容。除非这是一个“in only”服务。这些方法必须返回一个OMElement,因为它将会作为返回SOAP消息的负载内容。要将这个类转变为服务,建立服务描述文件services.xml,如代码列表9。

代码列表9 – 建立服务描述文件
<service name="UserGuideSampleService">
    <description>
        This is a sample service created in the Axis2 User's Guide
    </description>
    <parameter name="ServiceClass">org.apache.axis2.axis2userguide.SampleService</parameter>
    <operation name="sayHello">
        <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
	</operation>
    <operation name="ping">
        <messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
    </operation>
</service>
这个文档定义了服务,这些服务会被Web管理应用调用,这些类将用来为请求服务。对于每一个操作,它定义了合适的消息接收类。在存放这些类的主目录中建立一个新目录META-INF(在这个例子中,主目录是包含org目录的那个),并将services.xml文件放在里面。输入命令:jar cvf SampleService.aar ./*来建立aar文件。用Web管理应用或者复制该文件到Axis2的services目录来部署 SampleService.aar文件。现在可以建立一个直接访问服务的客户端类(见代码列表10)。

代码列表10 – 建立直接访问服务的客户端类
package org.apache.axis2.axis2userguide;

import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.Constants;
import org.apache.axis2.client.ServiceClient;

public class SampleClient {

       private static EndpointReference targetEPR = 
             new EndpointReference(
               "http://localhost:8080/axis2/services/UserGuideSampleService");

        public static OMElement greetUserPayload(String personToGreet) {
            OMFactory fac = OMAbstractFactory.getOMFactory();
            OMNamespace omNs = fac.createOMNamespace(
                    "http://example1.org/example1", "example1");
            OMElement method = fac.createOMElement("sayHello", omNs);
            OMElement value = fac.createOMElement("personToGreet", omNs);
            value.addChild(fac.createOMText(value, personToGreet));
            method.addChild(value);
            return method;
        }

        public static void main(String[] args) {
            try {
                OMElement payload = SampleClient.greetUserPayload("John");
                Options options = new Options();
                options.setTo(targetEPR);
                
				options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

                ServiceClient sender = new ServiceClient();
                sender.setOptions(options);
                OMElement result = sender.sendReceive(payload);

                String response = result.getFirstElement().getText();
                System.out.println(response);

            } catch (Exception e) { //(XMLStreamException e) {
                System.out.println(e.toString());
            }
        }    
}
这个类使用了发送和接收OMElements的相同技术,但是要着重指出的是Options类的使用。这个类可以让你决定例如返回消息传输者之类的参数(用来输出消息的传输者可以在目的地址的URL中指定)以及使用的SOAP版本。除了提供影响客户端和服务交互的特定属性的set和get方法外,Options类还能让你在Options对象间建立继承关系。所以,如果在当前使用的Options对象中没有发现某个属性,客户端可以检查该对象的父类对象。编译执行上述SampleClient.java文件。确认所有的axis2库在classpath中。如果一切运行正常,‘Hello, John’将在控制台上输出。

  部署Plain Old Java Objects (POJOs)

建立Web service的最容易的方法是部署代表服务的Java对象。从这个类开始,如代码列表11。

代码列表11 – 建立类SampleService
package org.apache.axis2.axis2userguide; 

public class SampleService { 
    public void doInOnly(){
     return;
    }

    public String noParameters(){
      return "Hello";
    }

    public String twoWayOneParameterEcho(String toEcho){
      return toEcho;
    }

    public boolean multipleParametersAdd(float price, int itemId,
                             String description, String itemName){
      //Code to handle the logic
                return true;
    }
}
接着,你需要告诉Axis2哪个类对应于哪个Web service调用。建立services.xml文件并加入代码列表12中的内容就可以做到这一点。

代码列表12 – 建立services.xml
<service name="SampleService" scope="application">
    <description>
        Sample Service
    </description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
    class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">
        org.apache.axis2.axis2userguide.SampleService
    </parameter>
</service>
这个文件为服务设置了InOnly和InOut两种MEP,并告诉Axis2调用哪个类;操作和方法名必须匹配。换句话说,Axis2自动发送一个multipleParametersAdd调用到org.apache.axis2.axis2userguide.SampleService.multipleParametersAdd()方法。现在可以建立发行包了,将你的文件按照如下目录结构安排好(见代码列表13)。

代码列表13 – 建立发行包的目录结构
- SampleService
   - META-INF
     - services.xml
   - org
     - apache
       - axis2
         - axis2userguide
           - SampleService.class
最后,将SampleService 目录复制到servlet引擎的webapps/axis2/WEB-INF/services 目录,这样服务就部署好了。如果你要确认服务被正确部署,可以查看http://<host>:<port>/axis2/services/listServices。

  部署和运行根据WSDL建立的Axis2服务

如果你有一个WSDL文件,你可以根据这个文件轻松的建立和部署服务。例如,要建立基于同一个WSDL文件(见本文的客户端部分),照以下步骤进行。简要说明:
  1. 如果你还没做的话,下载Axis2标准发行包。
  2. 象下面这样用WSDL2Java功能生成框架:
  3. java org.apache.axis2.wsdl.WSDL2Java -uri file:///C:/apps/axis2/samples/zSample/Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -d adb -s -wv 1.1 -ss -sd -ssi
  4. 打开*Skeleton.java文件并加入服务的相关功能到生成的方法中。
  5. 输入ant jar.server来使用Ant搭建服务
  6. 复制build/lib/*.aar文件到<J2EE_HOME>/webapps/axis2/WEB-INF/services目录来部署服务。
  7. 检查http://<server>:<port>/axis2/services/listServices来确保服务被正确部署。
详细说明:象生成客户端一样,你将需要Axis2标准发行包,因为Axis2 WAR发行包不包括WSDL2Java工具。一旦你获得下载包并解压后,确认你将AXIS2_HOME变量指向你解压的位置。现在你准备生成服务了。为了保持干净,建立一个新目录并将其变为当前目录。在生成客户端中用到同一个WSDL文件包括四个操作:NoParameters,TwoWayOneParameterEcho,MultipleParametersAddItem,和DoInOnly。要生成服务,使用WSDL2Java工具,如代码列表14。

代码列表14 – 使用WSDL2Java工具生成服务
代码列表14.1:
java org.apache.axis2.wsdl.WSDL2Java -uri
file:///C:/apps/axis2/samples/zSample/Axis2UserGuide.wsdl -p
org.apache.axis2.axis2userguide -d adb -s -wv 1.3 -ss –sd

注意:在运行上述代码前,确认Axis2 lib目录下的所有jar文件都包含在CLASSPATH中。这个语句告诉该工具你要用Axis2UserGuide.wsdl中的操作建立服务,生成的Java类应该包含在org.apache.axis2.axis2userguide包中(-p)。 (你可以看一下建立的相关的目录。)它还指出了你要用Axis2 DataBinding Framework或者说ADB (-d)来生成同步或者阻塞代码(-s),生成相对于客户端的服务端代码(-ss),包含服务描述文件services.xml(-sd)。它还指定了WSDL文件的版本1.3(-wv)。代码列表14.2:你也可以用下面的脚本文件达到同样目的。在本例中你不必手工设置CLASSPATH。Linux平台:

$AXIS2_HOME/bin/wsdl2java.sh -uri file:///C:/apps/axis2/samples/zSample/Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -o target_directory_name -d adb -s -wv 1.3 -ss -sd

MS Windows平台:

%AXIS2_HOME%\bin\wsdl2java.bat -uri file:\\\C:\apps\axis2\samples\zSample\Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -o target_directory_name -d adb -s -wv 1.3 -ss –sd

这时,在这两种不同的平台上,你都将在你选择的目录中看到四个新项目:build.xml文件,它包括了Ant的指令,src目录,它包括了所有生成的类和功能组,resources目录,包括了再次生成的WSDL文件,services.xml文件,它最终控制服务的行为。现在你可以编译你的服务了,但是它不会做任何事情。你需要打开src\org\apache\axis2\axis2userguide\Axis2UserGuideServiceSkeleton.java 文件,编辑粗体表示的代码—确认你使用的那些参数数字—或者用代码列表15中的内容全部将其替换。

代码列表15 – 编译服务
/**
 * Axis2UserGuideServiceSkeleton.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: SNAPSHOT Oct 15, 2006 (11:23:18 
GMT+00:00)
 */
package org.apache.axis2.axis2userguide;
/**
 *  Axis2UserGuideServiceSkeleton java skeleton for the axisService
 */
public class Axis2UserGuideServiceSkeleton {
     
         
    /**
     * Auto generated method signature
         
     * @param param7
         
    */
    public  org.apache.axis2.axis2userguide.NoParametersResponse 
NoParameters
        (org.apache.axis2.axis2userguide.NoParametersRequest param7)
         
    {
        System.out.println(param7);

        NoParametersResponse res =
            new NoParametersResponse();

        return res;
    }
     
         
    /**
     * Auto generated method signature
         
     * @param param9
         
    */
    public  
org.apache.axis2.axis2userguide.TwoWayOneParameterEchoResponse 
TwoWayOneParameterEcho
        (
         org.apache.axis2.axis2userguide.TwoWayOneParameterEchoRequest 
param9
         )
         
    {
        System.out.println(param9.getEchoString());

        TwoWayOneParameterEchoResponse res =
            new TwoWayOneParameterEchoResponse();
        
        res.setEchoString(param9.getEchoString());

        return res;

    }
     
         
    /**
     * Auto generated method signature
         
     * @param param11
         
    */
    public  void DoInOnly
        (
         org.apache.axis2.axis2userguide.DoInOnlyRequest param11
         )
         
    {
        System.out.println(param11.getMessageString());
    }
     
         
    /**
     * Auto generated method signature
         
     * @param param12
         
    */
    public  
org.apache.axis2.axis2userguide.MultipleParametersAddItemResponse 
MultipleParametersAddItem
        (
         
org.apache.axis2.axis2userguide.MultipleParametersAddItemRequest 
param12
         )
         
    {
        System.out.println(param12.getPrice());
        System.out.println(param12.getItemId());
        System.out.println(param12.getDescription());
        System.out.println(param12.getItemName());

        MultipleParametersAddItemResponse res =
            new MultipleParametersAddItemResponse();
        
        res.setSuccessfulAdd(true);
        res.setItemId(param12.getItemId());

        return res;
    }
     
}
同生成客户端一样,所有这些类,例如MultipleParametersAddItemRequest和TwoWayOneParameterEchoResponse是用工具生成的,可以作为框架文件在同一个目录下被找到。它们包括许多方法,例如setSuccessfulAdd(),它设置反馈元素的内容值,getItemName(),它获取请求中的元素内容。

保存并编译文件:ant jar.server

如果一切运行正常,你将在你的窗口中看到BUILD SUCCESSFUL消息,以及在新建立的build/lib目录中看到Axis2UserGuideService.aar文件。



现在你需要将服务部署到服务器上。复制Axis2UserGuideService.aar 文件到应用服务器的WEB-INF/services目录。(你也可以使用管理工具来达到这个目的。要获得更多信息请查阅Web管理员指南。)

要验证服务已被正确部署,在http://<host>:<port>/axis2/services/listServices中检查服务列表。



现在你可以用在生成客户端部分中搭建的客户端来访问服务了。 见下一部分 – 示例

上一篇
目    录
下一篇