2015-08-10 10:58 1827人阅读 评论(0) 收藏 举报
 分类:
JAVA(275)  服务器(58) 
 Axis2 是 Apache 提供的一款第三方 Web Services 引擎,与其前身 Apache Axis 相比, axis2 更加高效、模块化,也更面向于 XML 的组织。经过精心的设计, axis2 提供了更加便利的模块添加功能。  基于新的体系结构进行了全新编写,而且没有采用  Axis 1.x  的常用代码。支持开发 Axis2  的动力是探寻模块化更强、灵活性更高和更有效的体系结构,这种体系结构可以很容易地插入到其他相关  Web  服务标准和协议(如 WS-Security 、 WS-ReliableMessaging  等)的实现中。 Apache Axis2  是 Axis 的后续版本,是新一代的 SOAP 引擎。  Web Service 是现在最适合实现 SOA 的技术,而 Axis2 是目前实现 Web Service 的一种相对比较成熟和流行的技术框架(架构)。下面我们就一起来看一下有关 axis2 在webservice 开发的主要流程步骤。

在使用之前当然需要先安装axis2相关的服务 ,安装axis2服务之前当然要先下载相关安装文件。下载地址:

http://www.apache.org/dist//axis/axis2/java/core/1.6.1/

在下载相关文件之前我们先来说一下有关于axis2的包 :

关于axis2,官方提供了四种类型的包,分别为二进制包、war包、文档包和源文件包。其中的二进制包包含了示例程序和一些jar包;war包是可以作为web应用部署到servlet Container中的axis2服务包,它是apache axis2提供的服务管理的工具类web应用,所谓的axis2的安装即指的是在servlet container中安装此包;文档包不再多说;源码包也不再多说。 

官方文档说使用axis2需要的资源:java5及以上、不小于11M的硬盘空间和随便一个操作系统。另外为了把二进制数据打包成war文件,需要安装不低于1.6.5的apache ant;为了构建源码包,需要安装不低于maven2.0.7的maven。

OK,下面我们就一起来安装一下axis2:

1.下载axis2 的war包。

2.解压所下载的war包到tomcat目录下的webapps下。

3.启动tomcat。在webapps目录下会生成axis2文件夹和相关文件。

访问http://localhost:8080/axis2/能看到以下页面表示axis2运行成功。

Ok,安装完毕,简单吧。

安装完axis2之后。下一步我们就可以借用它来开发我们的webservice程序了。

1.首先创建一个web project

2.创建服务类Helloworld

[java] view plain copy print ?
  1. package com.bzu.csh;
  2. public class HelloWorld {
  3. public String getHello(String name) {
  4. return "Hello, " + name + ".";
  5. }
  6. public String getWorld(String name) {
  7. return "World," + name + ".";
  8. }
  9. public String getHelloWorld() {
  10. return "Hello,World";
  11. }
  12. }
  1. package com.bzu.csh;
  2. public class HelloWorld {
  3. public String getHello(String name) {
  4. return "Hello, " + name + ".";
  5. }
  6. public String getWorld(String name) {
  7. return "World," + name + ".";
  8. }
  9. public String getHelloWorld() {
  10. return "Hello,World";
  11. }
  12. }

3.修改web.xml,内容如下:

[java] view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <!-- 加载Axis -->
  7. <servlet>
  8. <servlet-name>AxisServlet</servlet-name>
  9. <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
  10. <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>AxisServlet</servlet-name>
  14. <url-pattern>/services/*</url-pattern>
  15. </servlet-mapping>
  16. </web-app>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <!-- 加载Axis -->
  7. <servlet>
  8. <servlet-name>AxisServlet</servlet-name>
  9. <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
  10. <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>AxisServlet</servlet-name>
  14. <url-pattern>/services/*</url-pattern>
  15. </servlet-mapping>
  16. </web-app>

4.把tomcat安装目录下的webapps/axis2/WEB-INF下的modules、service和conf文件件拷至HelloWorld下的WEB-INF目录下。把lib下的如下jar包也拷过去。然后在services下新建HelloWorld/META-INF路径,META-INF下新建services.xml,内容如下:

[html] view plain copy print ?
  1. <service name="HelloWorld">
  2. <description>
  3. HelloWorld Service Example
  4. </description>
  5. <parameter name="ServiceClass">
  6. com.bzu.csh.HelloWorld
  7. </parameter>
  8. <operation name="getHello">
  9. <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  10. </operation>
  11. <operation name="getWorld">
  12. <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  13. </operation>
  14. <operation name="getHelloWorld">
  15. <!-- 这里要注意,当没有返回值时才用
  16. org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver,没有参数还是用RPCMessageReceiver-->
  17. <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  18. </operation>
  19. </service>
  1. <service name="HelloWorld">
  2. <description>
  3. HelloWorld Service Example
  4. </description>
  5. <parameter name="ServiceClass">
  6. com.bzu.csh.HelloWorld
  7. </parameter>
  8. <operation name="getHello">
  9. <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  10. </operation>
  11. <operation name="getWorld">
  12. <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  13. </operation>
  14. <operation name="getHelloWorld">
  15. <!-- 这里要注意,当没有返回值时才用
  16. org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver,没有参数还是用RPCMessageReceiver-->
  17. <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  18. </operation>
  19. </service>

下面我们来说一下这里service.xml的配置详解:

1.<service name="HelloWorld">  这里指定服务名称。

2. <description>服务描述

3.    <parameter name="ServiceClass">  服务级参数

在services.xml文件中,我们可以直接在service节点下定义参数,这些参数供消息上下文(在运行时)、AxisService或者AxisOperation访问。参数有一个必选参数和可选参数:参数名称是必选参数。这里的服务参数为指定服务类。

4. <operation name="sayHello">

服务级消息接收器

Axis2中消息接收器是特殊的处理器,是In路径(请求路径)中的最后一个处理器。Web服务中的每个操作都有他自己的消息接收器,而且不同的操作可以有不同的消息接收器。消息接收器是依赖于消息交换模式的,所以我们必须为不同的消息交换模式指定不同的消息接收器。

怎样才能给所有的操作指定相同的消息接收器呢?只要添加服务级消息接收器即可。如此我们就不必在操作级别指定消息接收器了。我们要做的是指定服务级消息接收器。而在部署时,Axis2会自动给操作选择正确的消息接收器。这里我们指定

Operation 级消息接收器

前文描述了如何指定服务级消息接收器。但是,我们也可以为不同的操作指定不同的消息接收器,这需要在operation中指定messageReceiver标签

最后说明一个编写用于部署服务组的services.xml文件的问题

要在单个服务包文件中部署多个服务,服务组是一个便捷方法。当然,这些服务之间应该存在逻辑关系。用于服务组的services.xml文件和用于单个服务的,它们之间唯一的区别就是根元素。用于服务组的,根元素是serviceGroup,我们可以在serviceGroup元素内部定义多个service元素。

<serviceGroup>

<service name=service1>

......

<service>

<service name=service2>

..........

</service>

</serviceGroup>

启动tomcat后访问http://127.0.0.1:8080/Axis2Demo/services/HelloWorld?wsdl

能看到服务信息了。

下面我们就可以写一个客户端来调用我们写的服务程序了。

[java] view plain copy print ?
  1. package com.bzu.client;
  2. import javax.xml.namespace.QName;
  3. import org.apache.axis2.addressing.EndpointReference;
  4. import org.apache.axis2.client.Options;
  5. import org.apache.axis2.rpc.client.RPCServiceClient;
  6. public class ClientTest {
  7. public static void main(String[] args) {
  8. String url = "http://127.0.0.1:8080/Axis2Demo/services/HelloWorld";
  9. String result = null;
  10. try {
  11. // 使用RPC方式调用WebService
  12. RPCServiceClient serviceClient = new RPCServiceClient();
  13. Options options = serviceClient.getOptions();
  14. // 指定调用WebService的URL
  15. EndpointReference targetEPR = new EndpointReference(url);
  16. options.setTo(targetEPR);
  17. // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值
  18. // // 指定要调用的getWorld方法及WSDL文件的命名空间.....
  19. QName opAddEntry = new QName("http://csh.bzu.com", "getWorld");
  20. //
  21. // 指定getGreeting方法的参数值,如果有多个,继续往后面增加即可,不用指定参数的名称
  22. Object[] opAddEntryArgs = new Object[] { "java" };
  23. // 返回参数类型,这个和axis1有点区别
  24. // invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;
  25. // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
  26. // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。
  27. // 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}
  28. // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,
  29. // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同
  30. // 指定getGreeting方法返回值的数据类型的Class对象.....
  31. Class[] classes = new Class[] { String.class };
  32. // 调用getGreeting方法并输出该方法的返回值.......
  33. result = (String) serviceClient.invokeBlocking(opAddEntry,
  34. opAddEntryArgs, classes)[0];
  35. System.out.println(result);
  36. // 下面是调用getHello方法的代码,这些代码与调用getWorld方法的代码类似
  37. // classes = new Class[] {String.class};
  38. opAddEntry = new QName("http://csh.bzu.com", "getHello");
  39. opAddEntryArgs = new Object[] { "曹胜欢" };
  40. System.out.println(serviceClient.invokeBlocking(opAddEntry,
  41. opAddEntryArgs, classes)[0]);
  42. // 下面是调用getHelloWorld方法的代码
  43. opAddEntry = new QName("http://csh.bzu.com", "getHelloWorld");
  44. System.out.println(serviceClient.invokeBlocking(opAddEntry,
  45. new Object[]{}, classes)[0]);
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  1. package com.bzu.client;
  2. import javax.xml.namespace.QName;
  3. import org.apache.axis2.addressing.EndpointReference;
  4. import org.apache.axis2.client.Options;
  5. import org.apache.axis2.rpc.client.RPCServiceClient;
  6. public class ClientTest {
  7. public static void main(String[] args) {
  8. String url = "http://127.0.0.1:8080/Axis2Demo/services/HelloWorld";
  9. String result = null;
  10. try {
  11. // 使用RPC方式调用WebService
  12. RPCServiceClient serviceClient = new RPCServiceClient();
  13. Options options = serviceClient.getOptions();
  14. // 指定调用WebService的URL
  15. EndpointReference targetEPR = new EndpointReference(url);
  16. options.setTo(targetEPR);
  17. // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值
  18. // // 指定要调用的getWorld方法及WSDL文件的命名空间.....
  19. QName opAddEntry = new QName("http://csh.bzu.com", "getWorld");
  20. //
  21. // 指定getGreeting方法的参数值,如果有多个,继续往后面增加即可,不用指定参数的名称
  22. Object[] opAddEntryArgs = new Object[] { "java" };
  23. // 返回参数类型,这个和axis1有点区别
  24. // invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;
  25. // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
  26. // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。
  27. // 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}
  28. // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,
  29. // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同
  30. // 指定getGreeting方法返回值的数据类型的Class对象.....
  31. Class[] classes = new Class[] { String.class };
  32. // 调用getGreeting方法并输出该方法的返回值.......
  33. result = (String) serviceClient.invokeBlocking(opAddEntry,
  34. opAddEntryArgs, classes)[0];
  35. System.out.println(result);
  36. // 下面是调用getHello方法的代码,这些代码与调用getWorld方法的代码类似
  37. // classes = new Class[] {String.class};
  38. opAddEntry = new QName("http://csh.bzu.com", "getHello");
  39. opAddEntryArgs = new Object[] { "曹胜欢" };
  40. System.out.println(serviceClient.invokeBlocking(opAddEntry,
  41. opAddEntryArgs, classes)[0]);
  42. // 下面是调用getHelloWorld方法的代码
  43. opAddEntry = new QName("http://csh.bzu.com", "getHelloWorld");
  44. System.out.println(serviceClient.invokeBlocking(opAddEntry,
  45. new Object[]{}, classes)[0]);
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }

运行结果:

各类的详细运用都在注释里面解释了。我想我就没必要在重复说了。注意参数不要配置错误

推荐优秀axis2讲解的博客:http://androidguy.blog.51cto.com/974126/215252

参考资料:http://blog.csdn.net/llhhyy1989/article/details/8312918

http://paggywong.iteye.com/blog/1350448

转自:http://blog.csdn.net/csh624366188/article/details/8362696

Axis2开发webservice详解的更多相关文章

  1. Java axis2.jar包详解及缺少jar包错误分析

    Java  axis2.jar包详解及缺少jar包错误分析 一.最小开发jar集 axis2 开发最小jar包集: activation-1.1.jar axiom-api-1.2.13.jar ax ...

  2. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

  3. 基础拾遗------webservice详解

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  4. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  5. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  6. Extjs MVC开发模式详解

    Extjs MVC开发模式详解   在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...

  7. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  8. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  9. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)

    最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...

随机推荐

  1. 对象不支持“assign”属性或方法

    1. 报错信息 vue项目打包部署后,ie11报错内容如下: 看到报错信息肯定是语法兼容问题了,经测试 Edge 无此情况,部分ie9也有此类问题. 2. 尝试方法 安装 create-react-a ...

  2. 第8.32节 Python中重写__delattr__方法捕获属性删除

    一. 引言 上节介绍了__delattr__方法在Python清除实例属性时被捕获执行,本节结合例子介绍重写__delattr__方法,并说明__delattr__方法执行的触发逻辑. 二. 重写__ ...

  3. c#如何取出指定的中间文本

    ///<summary> ///取出文本中间内容 ///<summary> ///<param name="left">左边文本</par ...

  4. Scrum 冲刺 第五篇

    Scrum 冲刺 第五篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成后台首页模块数据库的接口 钟俊豪 ...

  5. Norns.Urd 中的一些设计

    Norns.Urd 是什么? Norns.Urd 是一个基于emit实现动态代理的轻量级AOP框架. 版本基于 netstandard2.0. 所以哪些.net 版本能用你懂的. 完成这个框架的目的主 ...

  6. Python术语对照表

    >>> 交互式终端中默认的 Python 提示符.往往会显示于能以交互方式在解释器里执行的样例代码之前. ... 可以是指:交互式终端中输入特殊代码行时默认的 Python 提示符, ...

  7. WPF源代码分析系列一:剖析WPF模板机制的内部实现(一)

    众所周知,在WPF框架中,Visual类是可以提供渲染(render)支持的最顶层的类,所有可视化元素(包括UIElement.FrameworkElment.Control等)都直接或间接继承自Vi ...

  8. 【题解】「CF363A」Soroban

    哎呀呀,咕值要掉光了,赶快水篇题解( solution 这题就是个纯模拟,首先我们根据输出样例看一下输出算盘的规则. 看数最大的 720 ,我们发现,输出的算盘张这样(之所以我不用代码框而用 \(\K ...

  9. SQL实现_同时在线人数

    原始数据表结构如下: user_id login_time logout_time 12 2020-12-10 20:45:18 2020-12-10 21:45:18 只说下实现思路,SQL不太难, ...

  10. Day1 字符串格式化

    1.占位符方式:占位符: %d 整数 %012d 数字位数至少长度为12位,不足的前面加0填充. >>> 'Hello,%s,%012d' % ('a',12345678901234 ...