首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Axis2兑现WebService实例

2013-07-01 
Axis2实现WebService实例Web Service是实现SOA(Service-Oriented Architecture)面向服务架构的技术,而Axis

Axis2实现WebService实例
Web Service是实现SOA(Service-Oriented Architecture)面向服务架构的技术,而Axis2是实现Web Service的一种技术框架(架构)。

先去apache官网上下载axis2-1.6.2-bin和axis2-1.6.2-war
下载地址:http://axis.apache.org/axis2/java/core/download.cgi


配置AXIS2的环境变量
将axis2-1.6.2-bin.zip解压
在环境变量里面配置AXIS2_HOME指向你的axis路径就行了。

解压axis2-1.6.2-war并将解压出来的axis2.war解压到tomcat的webapps中

访问:http://localhost:8082/axis2/端口自己改成自己的tomcat的端口就行了,
看到Welcome!就说明成功了。

WebService发布方式
我们先打开axis2\WEB-INF\conf下的axis2.xml。
有一段配置:

 <parameter name="hotdeployment">true</parameter> <parameter name="hotupdate">false</parameter>


hotdeployment 是热发布,就是不需要重新启动Tomcat就可以自动发布WebService。
但不等于更新了该webService,如果你想更新,还得重新启动Tomcat,这对于我们程序员来说,非常不方便,下面这个配置都解决了这个问题:hotupdate热更新,默认为false 改为true即可。

1.无包路径的发布方式:
public class TestService {public String getName(String name){return name;}public String helloWorld(){return "hello world!";}}

将TestService 编译得到.class文件后,将class文件放到webapps\axis2\WEB-INF\pojo
中去,如果pojo不存在则创建它。
这样我们就将这个Service发布上去了。
在浏览器输入:http://localhost:8082/axis2/services/listServices 见下图:



红框中则是我们发布的Webservice。
输入以下url:
http://localhost:8082/axis2/services/TestService/getName?name=xxx

<ns:getNameResponse>  <return>xxx</return></ns:getNameResponse>


http://localhost:8082/axis2/services/TestService/helloWorld

<ns:helloWorldResponse>  <return>hello world!</return></ns:helloWorldResponse>


pojo是axis2默认的目录:
  <deployer extension=".class" directory="pojo" name="code">  <deployer extension=".class" directory="xxx" name="code">package com.jynine.webservice;public class AxisService {public String sayHello(){return "hello";}public String saygoodBye(String name){return "Good Bye "+name +"!";}public void updateName(String name){System.out.println("Update "+name+" !");}}


2)  编写一个services.xml,这个文件需要放在META-INF目录中。

<!-- axis 配置 -->
<service name="AxisService">      <description>          Web Service例子      </description>      <parameter name="ServiceClass">          com.jynine.webservice.AxisService      </parameter>      <messageReceivers>          <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"              />          <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"              />      </messageReceivers>  </service>  


在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。
  例如,sayHello方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,
  而updateName方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

  使用这种方式发布WebService,我们需要将这2个文件打包成.aar文件

目录结构:
- test   - META-INF     - services.xml   - com   - jynine     - webservice       - AxisService.class


在cmd中进入到test的目录,输入以下命令:
   jar cvf test.aar .
ps:注意上面命令中后面的.
最后将 test.aar文件复制到\webapps\axis2\WEB-INF\services目录中,
  启动Tomcat后,就可以调用这个WebService了。
如果你有多个service的话,则需要用<serviceGroup>
<serviceGroup>        <service name="AxisService">      <description>          Web Service例子      </description>      <parameter name="ServiceClass">          com.jynine.webservice.AxisService      </parameter>      <messageReceivers>          <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"              />          <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"              />      </messageReceivers>  </service>  <service name="SimpleAxisService">      <description>          简单的axis服务    </description>      <parameter name="ServiceClass">          com.jynine.webservice.SimpleAxisService      </parameter>      <messageReceivers>          <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"              />          <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"              />      </messageReceivers>  </service>  </serviceGroup>


客户端调用webservice

先建立一个简单的pojo类:
package com.jynine.webservice;import java.util.HashMap;import java.util.Map;/** * Axis webService 例子 * @author jynine * */public class EmployeeInfo {private Map<String, String> map = new HashMap<String, String>();/** * 初始化 */private void initEmployee(){map.put("1000", "Tom");map.put("1001", "Jim");map.put("1002", "Rose");map.put("1004", "Jack");}/** * 获取员工名称 * @param num 工号 * @return */public String getEmployeeName(String num){initEmployee();String name = "未知";if(map.get(num) != null){name = map.get(num);}return name;}/** * 更新员工信息 * @param num 工号 * @param name 员工姓名 */public void updateEmployee(String num,String name){initEmployee();map.put(num, name);}/** * 删除员工信息 * @param num 工号 */public void deleteEmployee(String num){initEmployee();map.remove(num);}}

发布该webService并能成功调用。编写客户端代码调用:
package com.jynine.webservice;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.axiom.om.OMNode;import org.apache.axis2.Constants;import org.apache.axis2.addressing.EndpointReference;import org.apache.axis2.client.Options;import org.apache.axis2.client.ServiceClient;public class AxisClient {/** * 指定调用WebService的URL   */    private static EndpointReference targetEPR =         new EndpointReference("http://localhost:8082/axis2/services/EmployeeInfo");    public static OMElement getNameByNum(String num){    OMFactory fac = OMAbstractFactory.getOMFactory();    OMNamespace namespace = fac.createOMNamespace("http://webservice.jynine.com", "tns");    OMElement method = fac.createOMElement("getEmployeeName", namespace);    OMElement value = fac.createOMElement("num", namespace);    OMNode omNode = fac.createOMText(value, num);    value.addChild(omNode);    method.addChild(value);    return method;    }    public static void main(String[] args) {//ServiceClient        try {        OMElement getName = getNameByNum("1000");        Options options = new Options();            options.setTo(targetEPR);            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);            ServiceClient sender = new ServiceClient();            sender.setOptions(options);        OMElement result = sender.sendReceive(getName);        String response = result.getFirstElement().getText();        System.out.println("员工名称为:"+response);        } catch (Exception e) {            e.printStackTrace();        }    }}

http://localhost:8082/axis2/services/EmployeeInfo是你的Service EPR路径。
http://webservice.jynine.com这个是你访问http://localhost:8082/axis2/services/EmployeeInfo?wsdl后的那个targetNamespace。

输出结果为:
员工名称为:Tom


也可以用RPC方式调用WebService

   public static void main(String[] args) throws AxisFault {     //  使用RPC方式调用WebService              RPCServiceClient serviceClient = new RPCServiceClient();      Options options = serviceClient.getOptions();      //  指定调用WebService的URL      options.setTo(targetEPR);      //  指定getEmployeeName方法的参数值      Object[] opAddEntryArgs = new Object[] {"1001"};      //  指定getEmployeeName方法返回值的数据类型的Class对象      Class[] classes = new Class[] {String.class};      //  指定要调用的getEmployeeName方法及WSDL文件的命名空间      QName opAddEntry = new QName("http://webservice.jynine.com", "getEmployeeName");      //  调用getEmployeeName方法并输出该方法的返回值      System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);      }


ps:当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

输出结果为:Jim
wsdl2java
也可以根据wsdl2java来简化我们客户端
在cmd中输入
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -s -o generator

则在你的当前目录下就会生成一个generator目录,在generator\src\com\jynine\webservice中就会找到一个EmployeeInfoStub.java
我们就可以用这个类来编写客户端:
  public static void main(String[] args) throws RemoteException {     EmployeeInfoStub stub = new EmployeeInfoStub();           EmployeeInfoStub.GetEmployeeName gg = new EmployeeInfoStub.GetEmployeeName();           gg.setNum("1002");         System.out.println( stub.getEmployeeName(gg).get_return());        }


输出结果为:Rose
代码是不是简单多了。
用adb生成客户端:
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d adb -s -o generator

同理还有xmlbeans:
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d xmlbeans -s -o generator

JiBX:

%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d jibx -s -uw -o  generator


axis2相关的包的maven配置http://jynine.iteye.com/blog/1893677。

热点排行