Axis 2 WebService 开发指南


Axis2.x WebService 开发指南 Axis 的简单准备 Axis 的入门实例 Axis 复杂对象类型的 WebService Axis 的辅助工具发布、调用 WebService Axis WebService 会话 Session 的管理 Axis 用控制台 Dos 命令发布 WebService Axis 跨多个 WebService 管理 Session Axis 用 Spring 的 JavaBean 发布 WebService Axis 异步调用 WebService Axis 的 Module 模块 Axis 使用 SoapMonitar 监视 WebService 的请求和响应信息 Version1.0 2011-03-15 IT 达人 自由 IT 职业 blog.csdn.net/IBM_hoojo http://hoojo.cnblogs.com/ 506637315 2011- 3 - 15 hoojo 授之以鱼,不如授之以渔!希望能给广大 IT 朋友带 来一些帮助 1 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 Axis2.x WebService 上次介绍了 axis1.x 的用法,这次继续上次的,将叙述 axis2 的用法。 Axis1.x 在线博文:http://www.cnblogs.com/hoojo/archive/2010/12/20/1911349.html 一、 准备工作 1、开发准备 首先需要下载 axis2 的相关 jar 包,到 axis 的官方网站即可获得开发的依赖包。 下载地址:http://axis.apache.org/axis2/java/core/download.cgi 现在最高的版本是 1.5.4 的 然后你需要下载官方提供的 axis 的 eclipse 插件工具,可以帮助我们打包(aar)及其生产 客户端调用代码。 下载页面:http://axis.apache.org/axis2/java/core/tools/index.html Service Archive Wizard - Eclipse Plug-in Code Generator Wizard - Eclipse Plug-in 2、安装 eclipse 插件 如果你的 eclipse 插件安装成功后,会看到如下效果: 3、分析 axis2-bin 文件目录结构 下载下来的 axis2 的依赖库,其中有一个 axis2-1.5.3-bin.zip 的库文件,目录结构如下: bin 文件夹是 axis2 的常用工具,其中有将 wsdl 文件转换成客户端调用的 wsdl2java 工具 及将 java 转换成 wsdl 文件的工具 conf 是 axis2 的配置文件 lib 运行所要的依赖库 repository 是发布过的 axis 服务和文件 sample 是示例 2 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 webapp 是 web 文件和 jsp 页面等 4、我们需要将下载下来的 axis2-1.5.3-war.zip 中的 axis2.war 这个文件放在我们的 tomcat 目录下,启动 tomcat 就会把 war 文件转成一个可以跑起来的 axis2 的项目。 Tomcat 启动后,在浏览器中输入:http://localhost:8080/axis2/你可以看到 二、 Axis2 的简单 WebService 示例 1、编写一个简单的 WebService 的服务器端代码,代码如下: import java.util.Random; /** * function: WebService HelloWorld服务示例 * @author hoojo * @createDate 2011-1-5 下午03:35:06 * @file HelloWorldService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class HelloWorldService { public String sayHello(String name) { return name + " say: hello [axis2]"; } public int getAge(int i) { return i + new Random().nextInt(100); } } 注意,上面的 HelloWorldService 是没有 package 的。Copy 这个类的 class 文件,放到 tomcat 目录下的 webapps 的 axis2 的 WEB-INF 目录的 pojo 文件夹下。如果没有 pojo 这个目录就手 动创建一个一个文件夹。然后在浏览器输入:http://localhost:8080/axis2/ 点击 Services 的链接就可以看到我们手动发布的 HelloWorldService 了,或者是浏览器地址栏 输入:http://localhost:8080/axis2/services/listServices 你就可以看到你刚才粘贴过去的这个 WebService 了。 3 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 点击链接就可以看到 wsdl 文件的内容了。内容很多,如果你看过 axis1.x 的介绍就知道 wsdl 文件的大致结构了。 下面讲解下为什么要将 class 放在 pojo 文件夹下。首先我们看看 [tomcat_home]/webapps/axis2/WEB-INF/conf/axis2.xml 该文件中有这样一行代码: .class 的后缀文件放在目录 pojo 目录下。 2、测试这个 WebService 的方法 复制上面的 HelloWorldService 的链接地址,然后带上方法名称和参数值即可测试调用是否 成功。如下: http://localhost:8080/axis2/services/HelloWorldService/sayHello?name=jack http://localhost:8080/axis2/services/HelloWorldService 这个是 WebService 的地址 /sayHello 是方法名称,?name=jack 是参数名称和值 在浏览器中输入上面的地址后,可以看到如下效果: 可以看到返回值,和方法名称。ns:sayHelloResponse 是方法名称,所有的方法名称后都会 带上 Response,后面的 ns 当然是当前方法所在的类的包名了,这里没有 package 就是默认 的 axis2 的域名。 同样,getAge 方法,也是一样的调用方法。 4 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 http://localhost:8080/axis2/services/HelloWorldService/getAge?i=22 结果如下: 3、下面我们看下客户端调用代码的编写,代码如下: package com.hoo.service; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; /** * function:HelloWorldService 客户端调用代码 * @author hoojo * @createDate 2011-1-7 下午03:55:05 * @file HelloWorldClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class HelloWorldClient { public static void main(String[] args) throws AxisFault { //RPCServiceClient是RPC方式调用 RPCServiceClient client = new RPCServiceClient(); Options options = client.getOptions(); //设置调用WebService的URL String address = "http://localhost:8080/axis2/services/HelloWorldService"; EndpointReference epf = new EndpointReference(address); options.setTo(epf); /** * 设置将调用的方法,http://ws.apache.org/axis2是方法 * 默认(没有package)命名空间,如果有包名 * 就是http://service.hoo.com 包名倒过来即可 * sayHello就是方法名称了 */ 5 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 QName qname = new QName("http://ws.apache.org/axis2", "sayHello"); //指定调用的方法和传递参数数据,及设置返回值的类型 Object[] result = client.invokeBlocking(qname, new Object[] { "jack" }, new Class[] { String.class }); System.out.println(result[0]); qname = new QName("http://ws.apache.org/axis2", "getAge"); result = client.invokeBlocking(qname, new Object[] { new Integer(22) }, new Class[] { int.class }); System.out.println(result[0]); } } 如果你了解或是看过 axis1.x 的 WebService,这里的客户端调用代码比较简单,有部分关 键注释,这里就不多加赘述。值得注意的是 axis2 的 WebService 客户端调用的返回对象是 一个 Object 的数组,这点和 axis1.x 有很大不同。我们一般拿数组的第一个值,转换强转 即可。 三、 复杂对象类型的 WebService 1、这次我们编写复杂点的 WebService 方法,返回的数据是我们定义属性带 getter、 setter 方法 JavaBean,一维数组、二维数组等。 看代码: import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Random; import data.User; /** * function:复杂类型数据的WebService:字节数组、返回一维int数组、 二维String数组及自定义JavaBean对象等 * @author hoojo * @createDate 2011-1-13 下午03:34:52 * @file ComplexTypeService.java * @package * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class ComplexTypeService { public String upload4Byte(byte[] b, int len) { String path = ""; 6 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 FileOutputStream fos = null; try { String dir = System.getProperty("user.dir"); File file = new File(dir + "/" + new Random().nextInt(100) + ".jsp"); fos = new FileOutputStream(file); fos.write(b, 0, len); path = file.getAbsolutePath(); System.out.println("File path: " + file.getAbsolutePath()); } catch (Exception e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } return path; } public int[] getArray(int i) { int[] arr = new int[i]; for (int j = 0; j < i; j++) { arr[j] = new Random().nextInt(1000); } return arr; } public String[][] getTwoArray() { return new String[][] { { "中国", "北京" }, { "日本", "东京 " }, { "中国", "上海", "南京" } }; } public User getUser() { User user = new User(); user.setAddress("china"); user.setEmail("jack@223.com"); user.setName("jack"); user.setId(22); return user; } } 7 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 上面的 WebService 服务分别是传递字节完成数据上传,返回一维 int 数组和二维字 符串数组,以及返回 User JavaBean 对象。 下面看看 User Bean 代码: package data; import java.io.Serializable; /** * function:User Entity * @author hoojo * @createDate Dec 16, 2010 10:20:02 PM * @file User.java * @package com.hoo.entity * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class User implements Serializable { private static final long serialVersionUID = 677484458789332877L; private int id; private String name; private String email; private String address; //getter/setter @Override public String toString() { return this.id + "#" + this.name + "#" + this.email + "#" + this.address; } } 值得注意的是这个 User 对象的 package 是 data,如果是其它的 package,你就需要 在 tomcat 目录下的 webapps 中的 axis2 的 WEB-INF 目录下创建一个 data 目录,和 你的 User 对象的目录保持一致。否则你的 WebService 将会出现 ClassNotFontException 异常。然后重启你的 tomcat,虽然 axis2 支持热部署。 2、编写调用上面 WebService 的客户端代码,代码如下: package com.hoo.service; import java.io.File; import java.io.FileInputStream; import java.io.IOException; 8 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 import javax.xml.namespace.QName; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; import com.hoo.entity.User; /** * function:复杂类型数据WebService客户端调用代码 * @author hoojo * @createDate 2011-1-13 下午03:36:38 * @file ComplexTypeServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class ComplexTypeServiceClient { public static void main(String[] args) throws IOException { RPCServiceClient client = new RPCServiceClient(); Options options = client.getOptions(); String address = "http://localhost:8080/axis2/services/ComplexTypeService"; EndpointReference epr = new EndpointReference(address); options.setTo(epr); QName qname = new QName("http://ws.apache.org/axis2", "upload4Byte"); String path = System.getProperty("user.dir"); File file = new File(path + "/WebRoot/index.jsp"); FileInputStream fis = new FileInputStream(file); int len = (int) file.length(); byte[] b = new byte[len]; int read = fis.read(b); //System.out.println(read + "#" + len + "#" + new String(b)); fis.close(); Object[] result = client.invokeBlocking(qname, new Object[] { b, len }, new Class[] { String.class }); System.out.println("upload:" + result[0]); qname = new QName("http://ws.apache.org/axis2", "getArray"); result = client.invokeBlocking(qname, new Object[] { 3 }, 9 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 new Class[] { int[].class }); int[] arr = (int[]) result[0]; for (Integer i : arr) { System.out.println("int[] :" + i); } qname = new QName("http://ws.apache.org/axis2", "getTwoArray"); result = client.invokeBlocking(qname, new Object[] {}, new Class[] { String[][].class }); String[][] arrStr = (String[][]) result[0]; for (String[] s : arrStr) { for (String str : s) { System.out.println("String[][]: " + str); } } qname = new QName("http://ws.apache.org/axis2", "getUser"); result = client.invokeBlocking(qname, new Object[] {}, new Class[] { User.class }); User user = (User) result[0]; System.out.println("User: " + user); } } 上面的代码运行后的结果是: upload:D:\tomcat-6.0.28\bin\28.jsp int[] :548 int[] :201 int[] :759 String[][]: 中国 String[][]: 北京 String[][]: 日本 String[][]: 东京 String[][]: 中国 String[][]: 上海 String[][]: 南京 User: 22#jack#jack@223.com#china 四、 用 axis2 的辅助工具发布、调用 WebService 这次我们编辑一个返回 User 对象、List、Map、User[]的形 式,并且用 axis2 的工具完成发布 WebService。不再复制 class 到 axis2 的工程目 录下。 下面看看服务器端 WebService 代码: 10 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 package com.hoo.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import com.hoo.entity.User; /** * function:传递User对象类型的List、Map、User、Array等数据方法 的WebService * @author hoojo * @createDate 2011-1-13 下午03:50:06 * @file ManagerUserService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class ManagerUserService { /** * function:传递User对象,返回User对象 * @author hoojo * @createDate 2011-1-13 下午03:54:36 * @param user * @return User */ public User editUser(User user) { user.setId(new Random().nextInt(100)); return user; } /** * function:返回List<User>的数据类型 * @author hoojo * @createDate 2011-1-13 下午03:57:19 * @param j * @return List<User> */ public List getUsers(int j) { List users = new ArrayList(); 11 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 for (int i = 0; i < j; i++) { User user = new User(); user.setAddress("china"); user.setEmail("hoojo_@126.com"); user.setName("hoojo"); user.setId(22 + i); users.add(user); } return users; } /** * function:返回Map<String, User>类型的数据 * @author hoojo * @createDate 2011-1-13 下午04:03:41 * @param j * @return Map<String, User> */ public Map getUser4Map(int j) { Map users = new HashMap(); for (int i = 0; i < j; i++) { User user = new User(); user.setAddress("china"); user.setEmail("amy@223.com"); user.setName("amy"); user.setId(22 + i); users.put("user#"+ i, user); } return users; } /** * function:返回User的数组数据 * @author hoojo * @createDate 2011-1-13 下午04:05:23 * @param j * @return User[] */ public User[] getUser4Array(int j) { User[] users = new User[j]; for (int i = 0; i < j; i++) { User user = new User(); user.setAddress("china"); user.setEmail("tom@223.com"); 12 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 user.setName("tom"); user.setId(22 + i); users[i] = user; } return users; } } A、下面用 axis2 的工具生成 aar 文件,然后完成发布 WebService。 1、 点击工作空间 WorkSpace,右键 New 选择 Other 2、 选择 Axis2 Service Archiver,点击 Next 13 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 3、 然后点击 Browser 选择你当前的工程的 classes 目录 点击 Next 4、 没有 WSDL,选择第一项,点击 Next,然后再 Next 一次 5、 不用设置 service.xml,直接 Next 6、 最关键一步,填写 WebService 的 Name,设置 class 路径点击 Load 你就可以看 到当前 class 的方法 14 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 勾中的方法表示将会被暴露到客户端可以调用的方法,然后点击 Next 7、 设置 aar 文件的名称和保持的目录 点击 Finish 你可以看到提示 successfully 的提示。 8、 刷新当前工程可以看到 ManangerUserService.aar 文件了 9、 下面我们在浏览器中访问这个地址:http://localhost:8080/axis2/ 点击 Admin 这个链接,可以看到要输入用户名和密码,用户名和密码在 Tomcat_Home\webapps\axis2\WEB-INF\conf 下的 axis2.xml 中可以找到 admin axis2 10、 输入密码进入管理页面后可以看到 15 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 下面介绍下上面常用的功能 Upload Service 当然是上传 aar 的文件,完成发布 WebService 的工具了 Available Service 是查看当前发布的 Service 详细信息 Available Service Groups 是 Service 组 Global Chains 是可以用的全局的 Chain Operation Specific Chains 是某个具体操作的 chain Deactivate Service 是取消某个 Service Activate Service 是将取消发布的 Service 再发布出去 Edit Parameters 是修改 WebService 类的参数 11、 我们这里用 Upload Service 这个工具,然后选择我们刚才用 axis2 的工具生 成 aar 文件。 其实这一步我们可以直接将 ManagerUserService.aar 文件 copy 到 tomcat-home\webapps\axis2\WEB-INF\services 这个目录下。 12、 然后点击 Available Service 就可以看到 ManagerUserService 这个 Service 了 16 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 B、现在我们要用 axis2 的工具生成 wsdl 文件 1、点击 WorkSpace,右键 New 选择 Other。然后选择客户端代码生成工具 2、点击 Next,你可以看到让你选择 wsdl。选择第一个,然后点击 Next 上面是根据 Java class 代码生成 wsdl 文件 3、填写你的 WebService 的 classpath,然后选择你当前 class 所在工程的 class 目录 然后点击 Add Folder 选择你的工程的 classes 或 bin 目录,也就是你填写的 class 所在的 目录,然后点击 Test 测试是否正确。 17 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 点击 Next 继续下一步 4、可以看到即将发布的 WebService 名称和命名空间 5、继续 Next,选择 wsdl 文件保存目录 这样 services.wsdl 文件就生成了。 C、用 axis2 的工具生成客户端调用的代码 1、右键 workspace,点击 New 选择 Other,然后选择 aixs2 的生成代码工具 2、选择第一项,根据 wsdl 文件生成 Java 代码,然后 Next 18 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 3、然后选择刚才上面生成好的 wsdl 文件 如果你有向 tomcat 中发布过你的 WebService,那么你可以通过 WebBrowser 访问 http://localhost:8080/axis2/ 点击 Services 链接,就可以看到你的 WebService。点击你的 WebService 样你也可以看到 wsdl 内容 19 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 这样你也可以在上面的 WSDL file location 中填写: http://localhost:8080/axis2/services/ManagerUser?wsdl 这个地址也是可以的 4、点击 Next,就可以看到你要生成指定方法的代码的选项了 注意的是在选择 PortName 的时候,不同的选项将会生产不同的调用代码。其调用方式 也略有不同。但你可以看生成的源代码进行详细的了解。 5、点击 Next,选择代码输出保存的目录,然后点击 Finish 刷新目录后发现多了 2 个文件 D、 编写客户端代码 package com.hoo.service; import java.rmi.RemoteException; import com.hoo.service.ManagerUserStub.EditUserResponse; 20 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 /** * function:ManagerUserService客户端调用代码 * @author hoojo * @createDate 2011-1-14 下午03:17:31 * @file ManagerUserServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class ManagerUserServiceClient { public static void main(String[] args) throws RemoteException { String target = "http://localhost:8080/axis2/services/ManagerUser"; ManagerUserStub stub = new ManagerUserStub(target); /** * 调用User Bean模式: * EditUser、User是内部静态类,axis2会帮我们进行参数封装 */ ManagerUserStub.EditUser editUser = new ManagerUserStub.EditUser(); ManagerUserStub.User u = new ManagerUserStub.User(); u.setAddress("china"); u.setEmail("axis2@axis2.com"); u.setName("axis2"); u.setId(222); editUser.setUser(u); //返回值也被封装 EditUserResponse eur = stub.editUser(editUser); ManagerUserStub.User returnUser = eur.get_return(); //returnUser.getId()在服务器端动态重置过 System.out.println(returnUser.getId() + "#" + returnUser.getName() + "#" + returnUser.getEmail() + "#" + returnUser.getAddress()); /** * User数组模式 */ ManagerUserStub.GetUser4Array userArray = new 21 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 ManagerUserStub.GetUser4Array(); userArray.setJ(3); ManagerUserStub.GetUser4ArrayResponse userArrResponse = stub.getUser4Array(userArray); ManagerUserStub.User[] userArr = userArrResponse.get_return(); for (ManagerUserStub.User user : userArr) { System.out.println(user.getId() + "#" + user.getName() + "#" + user.getEmail() + "#" + user.getAddress()); } /** * Map User模式,不支持Map、List */ /*ManagerUserStub.GetUser4Map userMap = new ManagerUserStub.GetUser4Map(); userMap.setJ(3); ManagerUserStub.GetUser4MapResponse userMapResponse = stub.getUser4Map(userMap); ManagerUserStub.Map map = userMapResponse.get_return(); System.out.println(map);*/ /** * GetUsers是ManagerUserStub的内部类,axis2的代码生成工具会帮 我们把参数更具wsdl文件的内容进行封装 */ /*ManagerUserStub.GetUsers getUsers = new ManagerUserStub.GetUsers(); getUsers.setJ(3);//服务器的参数int j ManagerUserStub.GetUsersResponse usersResponse = stub.getUsers(getUsers); System.out.println(usersResponse.get_return());*/ } } 运行后发现不支持 Map、List,不能读取数据类型。Wsdl 文件中是 anyType,可能 需要自己用配置描述返回类型。【有待跟进、解决】 E、 下面用 MyEclipse 的 WebService 工具生成代码 四、 WebService 会话 Session 的管理 1、新建 Session 的 WebService 测试代码,代码很简单。就是记录用户登录的状态 信息,放在 MessageContext 的 ServiceContext 中。代码如下: package com.hoo.service; 22 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 import org.apache.axis2.context.MessageContext; import org.apache.axis2.context.ServiceContext; /** * function:WebService Session会话消息 * @author hoojo * @createDate 2011-3-8 下午04:11:27 * @file LoginService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class LoginService { public boolean login(String userName, String password) { MessageContext context = MessageContext.getCurrentMessageContext(); ServiceContext ctx = context.getServiceContext(); if ("admin".equals(userName) && "123456".equals(password)) { ctx.setProperty("userName", userName); ctx.setProperty("password", password); ctx.setProperty("msg", "登陆成功"); return true; } ctx.setProperty("msg", "登陆失败"); return false; } public String getLoginMessage() { MessageContext context = MessageContext.getCurrentMessageContext(); ServiceContext ctx = context.getServiceContext(); return ctx.getProperty("userName") + "#" + ctx.getProperty("msg"); } } 这 里 保 存 Session 信 息 的 主 要 是 通 过 MessageContext 这 个 上 下 文 来 获 取 ServiceContext 的上下文,然后通过 setProperty 来保存 session 的信息,通过 getProperty 来获取 session 信息。 Session 的作用可以在使用 WebService 登录的时候,保存用户的登录状态或是会话 消息。但是使用 session 需要设置发布 Service 的时候,设置 WebService 的作用域。 23 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 作用域默认是 request,它还有另外三个值,分别是:application、soapsession、 transportsession;我们可以选择使用 transportsession 和 application 分别实现 同一个 WebService 类和跨 WebService 类的会话管理。 2、使用 axis2 的工具生成 aar 文件,并发布 LoginService 服务。 关于这里发布 LoginService 的步骤就不一一介绍,上面已经有说过了。当你用这 个步骤发布 WebService 的时候,你可以打开压缩文件的方式 aar 文件(其实不一 定要用 aar 文件,只是官方推荐的 aar,jar 文件也是可以的),在 META-INF 目录 下有一个services.xml文件,看到它的这个标签,没有设置scope属性。 scope 默认的是 request,我们得修改 services.xml 的内容。 修改后 services.xml 内容如下: Please Type your service description here com.hoo.service.LoginService 这个地方的 scope 是关键,如果这里不设置的话 session 是无法存放信息。 3、用控制台 Dos 命令发布 WebService 这个是手工打包,也就是我们经常用的 jar 命令 首先我们得需要一个 services.xml 文件,文件内容如上面的。 name 是当前发布 WebService 的名称,scope 是会话作用域。保存在 Session 中就 24 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 要用这个 transportsession 这个作用域。 com.hoo.service.LoginService 这个是当前 Service 的类路径,包名+类名 这个应该是参数和返回值信息的解析类,in-only 是输入也就是参数,in-out 是输 出也就是返回值。 A、 首先, 我们 在 C 盘 下新 建一 个 sessionService 的目录 ,然 后将 上面的 services.xml 文件中的 ServiceClass 的类的 class 文件 copy 到这个目录下, 注意要带上 package 目录,然后在 sessionService 目录下新建一个 META-INF 将上面的 services.xml 文件放到这个目录下 B、 然后运行 cmd 进入控制台,进入 sessionService 这个目录,键入命令如下: jar cvf service.aar service.aar 是打包后的文件名称,.是指代当前目录 如果你不懂 jar 命令,你可以输入 jar 会有命令语法的提示 进入 sessionService 这个目录中,你可以看到 service.aar 文件就有了。然 后将这个文件 copy 到 axis2 的 WEB-INF 目录下的 services 目录中,也就是 25 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 [tomcat-home]\webapps\axis2\WEB-INF\services 然后可以通过:http://localhost:8080/axis2/services/listServices 就可以查看刚才发布的服务了。 这样就完成手工发布打包发布 WebService 了 C、 编写 WebService 客户端的请求代码 package com.hoo.service; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; /** * function:LoginService Session客户端代码 * @author hoojo * @createDate 2011-3-9 上午11:21:59 * @file LoginServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class LoginServiceClient { public static void main(String[] args) throws AxisFault { String target = "http://localhost:8080/axis2/services/LoginService"; //target = "http://localhost:8080/axis2/services/MyLoginService"; RPCServiceClient client = new RPCServiceClient(); Options options = client.getOptions(); options.setManageSession(true); EndpointReference epr = new EndpointReference(target); options.setTo(epr); QName qname = new QName("http://service.hoo.com", "login"); //指定调用的方法和传递参数数据,及设置返回值的类型 Object[] result = client.invokeBlocking(qname, new Object[] { "admin", "123456" }, new Class[] { boolean.class }); System.out.println(result[0]); 26 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 qname = new QName("http://service.hoo.com", "getLoginMessage"); result = client.invokeBlocking(qname, new Object[] { null }, new Class[] { String.class }); System.out.println(result[0]); } } 执行后,结果如下: true admin#登陆成功 上面要说明的是 options.setManageSession(true);是开启对 Session 管理的支持 五、 跨多个 WebService 管理 Session 当多个 WebService 的时候,我们要管理它的 Session。这 个时候我 们得依靠 ServiceGroupContext 保存 session 信息 ;然 后在 发布 WebService 的 时候, services.xml 文 件 的 的 service 表 情 的 scope 就 不 再 说 request 或是 transportsession 了,而是 application;最后同样要开启对 session 的管理,即 options.setManageSession(true); 1、 首先多个 WebService 的 session 管理的代码如下: package com.hoo.service; import org.apache.axis2.context.MessageContext; import org.apache.axis2.context.ServiceGroupContext; /** * function:管理多个会话Session信息 * @author hoojo * @createDate 2011-3-9 下午05:11:07 * @file LoginSessionService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class LoginSessionService { public boolean login(String userName, String password) { MessageContext context = MessageContext.getCurrentMessageContext(); ServiceGroupContext ctx = context.getServiceGroupContext(); if ("admin".equals(userName) && "123456".equals(password)) { 27 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 ctx.setProperty("userName", userName); ctx.setProperty("password", password); ctx.setProperty("msg", "登陆成功"); return true; } ctx.setProperty("msg", "登陆失败"); return false; } public String getLoginMessage() { MessageContext context = MessageContext.getCurrentMessageContext(); ServiceGroupContext ctx = context.getServiceGroupContext(); return ctx.getProperty("userName") + "#" + ctx.getProperty("msg"); } } 和上面的 Session 一样的操作,只不过是用 ServiceGroupContext 上下文 来存取 session 信息 另外还需要用一个 Service 来查询 session 的信息,SearchService 的代 码如下: package com.hoo.service; import org.apache.axis2.context.MessageContext; import org.apache.axis2.context.ServiceGroupContext; /** * function:查找多服务Session会话中的消息 * @author hoojo * @createDate 2011-3-9 下午05:22:39 * @file SearchSessionServcie.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class SearchSessionServcie { public String findSessionMessage(String key) { MessageContext mc = MessageContext.getCurrentMessageContext(); ServiceGroupContext ctx = mc.getServiceGroupContext(); if (ctx.getProperty(key) != null) { 28 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 return "找到的数据<" + key + ", " + ctx.getProperty(key) + ">"; } else { return "没有找到<" + key + ">的数据"; } } } 2、 编写 services.xml 来发布这 2 个服务,还以前不一样的。这一次是用一个 services.xml 文件配置 2 个 service,同时发布 2 个服务。Xml 代码如下: Web Service Session例子 com.hoo.service.LoginSessionService Web Service Search Session例子 com.hoo.service.SearchSessionServcie 29 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 3、 发布完成后,可以通过 http://localhost:8080/axis2/services/listServices 查看发布的 WebService 服务,编写客户端的测试代码,code 如下: package com.hoo.service; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; /** * function:多会话Session管理,WebService客户端请求代码 * @author hoojo * @createDate 2011-3-9 下午05:17:15 * @file LoginSessionServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class LoginSessionServiceClient { public static void main(String[] args) throws AxisFault { String target = "http://localhost:8080/axis2/services/LoginSessionService"; RPCServiceClient client = new RPCServiceClient(); Options options = client.getOptions(); options.setManageSession(true); EndpointReference epr = new EndpointReference(target); options.setTo(epr); QName qname = new QName("http://service.hoo.com", "login"); //指定调用的方法和传递参数数据,及设置返回值的类型 30 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 Object[] result = client.invokeBlocking(qname, new Object[] { "admin", "123456" }, new Class[] { boolean.class }); System.out.println(result[0]); qname = new QName("http://service.hoo.com", "getLoginMessage"); result = client.invokeBlocking(qname, new Object[] { null }, new Class[] { String.class }); System.out.println(result[0]); target = "http://localhost:8080/axis2/services/SearchSessionService"; epr = new EndpointReference(target); options.setTo(epr); qname = new QName("http://service.hoo.com", "findSessionMessage"); result = client.invokeBlocking(qname, new Object[] { "userName" }, new Class[] { String.class }); System.out.println(result[0]); qname = new QName("http://service.hoo.com", "findSessionMessage"); result = client.invokeBlocking(qname, new Object[] { "msg" }, new Class[] { String.class }); System.out.println(result[0]); qname = new QName("http://service.hoo.com", "findSessionMessage"); result = client.invokeBlocking(qname, new Object[] { "password" }, new Class[] { String.class }); System.out.println(result[0]); } } 运行后结果如下: true admin#登陆成功 找到的数据 找到的数据 找到的数据 4、 如果将 services.xml 文件的内容改成 scope=transportsession,看看什么情况。 是不是找不到 session 中的内容。 六、 用 Spring 创建的 JavaBean 发布成 WebService 1、首先,看看这个简单的类代码: 31 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 package com.hoo.service; /** * function:Spring的装载Bean的Service * @author hoojo * @createDate 2011-3-9 下午06:30:26 * @file SpringService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class SpringService { private String name; private int number; public void setName(String name) { this.name = name; } public void setNumber(int number) { this.number = number; } public String getMessage() { return this.number + "#" + this.name; } } 将这个类编译后的 class,放到[tomcat-home]\webapps\axis2\WEB-INF\classes 中, 注意带上 package 类路径的目录。 2、在\webapps\axis2\WEB-INF\web.xml 文件中加入下面的内容: org.springframework.web.context.ContextLoaderLi stener contextConfigLocation classpath*:applicationContext.xml 这段配置会 Spring 的朋友肯定知道,这个是加载 spring 容器和设置 spring 的配置 文件的。 32 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 3 、在[tomcat-home]\webapps\axis2\WEB-INF\classes 中 新 建 一 个 applicationContext.xml 文件,文件中的内容如下: 上面配置了 SpringService,利用 Spring 的容器帮我们设置 name、number 这 2 个 属性的值。 5、 在 tomcat-home\webapps\axis2\WEB-INF\lib 目录中有一个 axis2-spring-1.5.3.jar 文件,该文件用于将被装配 JavaBean 的发 布 成 WebService。同样这里我们采用手动打包发布的模式,在 C 盘 建立 一 个 axis2-spring-ws 的目录,然后在此目录中新建一个 META-INF 的目录,目录中 添加一个 services.xml 文件,内容如下: Spring aware org.apache.axis2.extensions.spring.receivers.SpringServletCo ntextObjectSupplier SpringBeanService 在 文件中需要通过 ServiceObjectSupplier 参数指定 33 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 SpringServletContextObjectSupplier 类 来 获 得 Spring 的 ApplicationContext 对象; 然后用 jar 命令创建 aar 文件 然 后 将 生 产 的 aar 文 件 , 复 制 到 [tomcat_home]\webapps\axis2\WEB-INF\services 目录中 6、 然后重启 tomcat,访问: http://localhost:8080/axis2/services/listServices 就可以看到刚才发布的 springService 了 7、 编写客户端测试代码 package com.hoo.service; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; /** * function:SpringService客户端代码 * @author hoojo * @createDate 2011-3-14 上午14:21:59 * @file LoginServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class SpringServiceClient { 34 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 public static void main(String[] args) throws AxisFault { String target = "http://localhost:8080/axis2/services/springService"; RPCServiceClient client = new RPCServiceClient(); Options options = client.getOptions(); options.setManageSession(true); EndpointReference epr = new EndpointReference(target); options.setTo(epr); QName qname = new QName("http://service.hoo.com", "getMessage"); Object[] result = client.invokeBlocking(qname, new Object[] { null }, new Class[] { String.class }); System.out.println(result[0]); } } 运行后,看到 bean 注入的值有输出。 1#hoojo 七、 异步调用 WebService 异步,说到异步需要首先将以下同步。同步就是代码按照顺序执行,当前面的代码 的请求没有正常返回结果的情况下,后面的代码是不能运行。而异步正好和这点不 同,异步是代码运行后,不管当前的请求是否返回结果,后面的代码都会继续运行。 关于异步在此就不再赘述了,有兴趣的可以去网上查查这方面的资料。 1、 编写服务器端的代码。 package com.hoo.service; /** * function:异步WebService服务器端代码 * @author hoojo * @createDate 2011-3-14 上午08:16:59 * @file AsynchronousService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class AsynchronousService { public String execute() { System.out.println("正在执行此代码……"); //延迟5秒后,返回结果 35 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return "完成"; } } 2、 services.xml 文 件 , 创 建 aar 文 件 , 然 后 复 制 aar 文件到 [tomcat-home]\webapps\axis2\WEB-INF\services 目录下 services.xml AsyncService com.hoo.service.AsynchronousService 3、 编写客户端测试代码 package com.hoo.service; import java.io.IOException; import javax.xml.namespace.QName; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.async.AxisCallback; import org.apache.axis2.context.MessageContext; import org.apache.axis2.rpc.client.RPCServiceClient; /** * function:异步WebService客户端代码 36 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 * @author hoojo * @createDate 2011-3-14 上午09:00:03 * @file AsynchronousServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class AsynchronousServiceClient { public static void main(String[] args) throws IOException { String target = "http://localhost:8080/axis2/services/AsyncService?wsdl"; RPCServiceClient client = new RPCServiceClient(); Options options = client.getOptions(); options.setManageSession(true); EndpointReference epr = new EndpointReference(target); options.setTo(epr); QName qname = new QName("http://service.hoo.com", "execute"); //指定调用的方法和传递参数数据,及设置返回值的类型 client.invokeNonBlocking(qname, new Object[] {}, new AxisCallback() { public void onMessage(MessageContext ctx) { System.out.println(ctx.getEnvelope()); System.out.println("Message:" + ctx.getEnvelope().getFirstElement().getFirstElement().getFir stElement().getText()); } public void onFault(MessageContext ctx) { } public void onError(Exception ex) { } public void onComplete() { } }); 37 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 System.out.println("异步WebService"); //阻止程序退出 System.in.read(); } } 上 面 是 异 步 调 用 WebService 的 代 码 , 调 用 的 方 法 是 client.invokeNonBlocking,这个方法有三个参数,参数一是执行的方法签 名,参数二是执行该方法的参数,参数三是异步回调,这里隐式实现 AxiaCallback 接口 注意的是运行程序的时候要用 Debug 方式运行。 八、 编写 Module 模块 Axis 可以通过 Module 模块进行扩展,用户可以编写定制自己的 Module 模块。编写 一个 Module 的模块至少需要实现两个接口,分别是 Handler 和 Module 接口。开发 axis2 的 Module 模块需要如下步骤: 1、 实现 Module 接口的实现类,这个类要完成基本的初始化、销毁等操作 2、 实现 Handler 接口的实现类,这个类主要是完成业务处理 3、 在 META-INF 目录下,创建 module.xml 配置文件 4、 在 axis2.xml 中增加配置 module 的模块 5、 在 services.xml 中增加 module 的模块配置 6、 最后发表 axis2 的 module 模块,需要用 jar 命令将工程打包成 mar,然后将 mar 文件发布到[tomcat_home]/webapps/axis2/WEB-INF/modules 目录下; 首先编写一个简单的 WebService,代码如下: package com.hoo.module; import java.util.Random; /** * function:编写一个简单的WebService服务器端代码 * @author hoojo * @createDate 2011-3-15 上午06:19:15 * @file SimpleWebService.java * @package com.hoo.module * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class SimpleWebService { public int randInt() { return new Random().nextInt(100); } } 38 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 编写 Module 接口的实现类,代码如下: package com.hoo.module; import org.apache.axis2.AxisFault; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.description.AxisDescription; import org.apache.axis2.description.AxisModule; import org.apache.axis2.modules.Module; import org.apache.neethi.Assertion; import org.apache.neethi.Policy; /** * function:axis2模块,实现Module接口实现类 * @author hoojo * @createDate 2011-3-15 上午03:22:24 * @file CustomModule.java * @package com.hoo.module * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class CustomModule implements Module { public void applyPolicy(Policy policy, AxisDescription axisDescription) throws AxisFault { System.out.println("###############applyPolicy############# #"); } public boolean canSupportAssertion(Assertion assertion) { System.out.println("##############canSupportAssertion###### ########"); return true; } public void engageNotify(AxisDescription axisDescription) throws AxisFault { System.out.println("##############engageNotify############# "); } 39 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 public void init(ConfigurationContext ctx, AxisModule module) throws AxisFault { System.out.println("##############init##############"); } public void shutdown(ConfigurationContext ctx) throws AxisFault { System.out.println("##############shutdown#############"); } } 编写实现 Handler 接口的实现类,代码如下: package com.hoo.module; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.description.HandlerDescription; import org.apache.axis2.description.Parameter; import org.apache.axis2.engine.Handler; /** * function:axis2模块Handler接口实现 * @author hoojo * @createDate 2011-3-15 上午03:37:43 * @file CustomHandler.java * @package com.hoo.module * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class CustomHandler implements Handler { private String name; public void setName(String name) { this.name = name; } public String getName() { return this.name; } 40 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 public void cleanup() { System.out.println("###########cleanup###########"); } public void flowComplete(MessageContext ctx) { System.out.println("###########flowComplete###########"); System.out.println(ctx.getEnvelope().toString()); } public HandlerDescription getHandlerDesc() { System.out.println("###########getHandlerDesc###########"); return null; } public Parameter getParameter(String name) { System.out.println("###########getParameter###########"); return null; } public void init(HandlerDescription handlerDescription) { System.out.println("###########init###########"); } public InvocationResponse invoke(MessageContext ctx) throws AxisFault { System.out.println(ctx.getEnvelope().toString()); return InvocationResponse.CONTINUE; } } 编写 module.xml 文件 41 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 编写 services.xml 文件 使用CustomModule SimpleWebService模块 com.hoo.module.SimpleWebService 在[tomcat_home]\webapps\axis2\WEB-INF\conf 中 axis2.xml 文件中加入内容,在 所有的标签中加入 打包发布 module,在 c 盘建立 CustomModuleService,然后将 CustomModule.class 和 CustomHandler.class 以及类路径目录复制到该目录。然后将 module.xml 文件放 到 META-INF(没有新建)目录。 运行 jar 命令:jar cvf custom-module.mar . 42 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 将生成的 custom-module.mar 文 件 粘 贴 到 [tomcat_home] \webapps\axis2\WEB-INF\modules 目录中 发布 WebService,建立目录 simpleWebService,将 SimpleWebService.xml 和类路 径复制到该目录下,将 services.xml 复制到 META-INF 目录。 运行 jar 命令:jar cvf simple-service.aar . 将生成的 simple-service.aar 文件复制到[tomcat_home] \webapps\axis2\WEB-INF\services 目录下 然后重启 tomcat 服务。 客户端访问 WebService 代码 package com.hoo.service; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; /** * function:访问SimpleWebService * @author hoojo * @createDate 2011-3-15 上午07:26:08 * @file SimpleWebServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class SimpleWebServiceClient { public static void main(String[] args) throws AxisFault { String target = "http://localhost:8080/axis2/services/CustomModuleService"; RPCServiceClient client = new RPCServiceClient(); Options options = client.getOptions(); options.setManageSession(true); EndpointReference epr = new EndpointReference(target); options.setTo(epr); QName qname = new QName("http://module.hoo.com", "randInt"); Object[] result = client.invokeBlocking(qname, new Object[] { null }, new Class[] { int.class }); 43 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 System.out.println(result[0]); } } 九、 使用 SoapMonitar 监视 WebService 的请求和响应信息 使用 soapmonitar 可以监视到请求和响应的 WebService 的基本信息,可以讲响应在 控制台的信息显示在 applet 控件上。 步骤如下: 1、 部署相关的 applet 和 servlet Axis2 有 自 带 的 monitor 模块,这里就不需要单独安装。在 [tomcat_home]\webapps\axis2\WEB-INF\lib 目录中,找到 axis2-soapmonitor-servlet-1.5.3.jar 这个文件,将这个文件解压后,将里面 的 servlet 的 class 文件放到[tomcat_home]\webapps\axis2\WEB-INF\classes 目录下。将 applet 的 class 放到[tomcat_home]\webapps\axis2 这个目录下即 可。 2、 配置 Servlet,这里配置的 Servlet 就包含上一步复制的 servlet-class 在 web.xml 中增加如下配置 SOAPMonitorService org.apache.axis2.soapmonitor.servlet.SOAP MonitorService SOAPMonitorPort 5001 1 SOAPMonitorService /SOAPMonitor 3、 在 要 监 视 的 WebService 的 services.xml 文 件 中 关 联 soapmonitor , services.xml 配置文件如下: 使用soapmonitor SimpleWebService模块 com.hoo.module.SimpleWebService 44 Axis WebService 技术指南 欢迎转载 请保留原文作者信息 不得未经作者允许用于商业用途 将上次的 WebService 关联 soapmonitor 这个 module,然后重新打包 aar 发布。 4、 请求 http://localhost:8080/axis2/SOAPMonitor 可以看到 Java 的 Applet,界面如下: 然后运行请求执行 CustomModuleService 这个 service 的时候,你就可一看到 上面出现 xml 的内容。上面的内容是和控制台的同步输出的。
还剩44页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

631865666

贡献于2015-01-20

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf