Java Webservice 接口开发


Webservice 接口开发 Author:Geloin 目 录 1 准备工作................................................................................................................. 1 2 服务器端................................................................................................................. 1 2.1 主程序 .......................................................................................................... 1 2.2 services.xml .................................................................................................. 2 2.3 传值方式 ...................................................................................................... 3 2.4 打包 .............................................................................................................. 4 2.5 发布 .............................................................................................................. 6 3 客户端..................................................................................................................... 8 3.1 导入包 .......................................................................................................... 8 3.2 示例代码 ...................................................................................................... 8 3.3 代码解析 .................................................................................................... 10 3.3.1 设定服务器地址.............................................................................. 10 3.3.2 设定 action ...................................................................................... 10 3.3.3 设定要调用的方法名...................................................................... 11 3.3.4 设定客户端控件.............................................................................. 11 3.3.5 设定命名空间.................................................................................. 11 3.3.6 设定需要传送的值.......................................................................... 11 3.3.7 设定返回数据类型.......................................................................... 11 3.3.8 获取返回结果.................................................................................. 12 1 / 15 1 准备工作 至 http://axis.apache.org/axis2/下载 axis2 的 bin 及 war 包,分别解压之,在 环境变量中添加 AXIS2_HOM,将 axis2.war 放置到 tomcat/webapps 目录下,启动 tomcat,用浏览器打开 http://localhost:8080/axis2,如下图所示: 2 服务器端 2.1 主程序 服务器端可以是任何一个程序,例如下面的例子: public class Test { // 此程序返回一个字符串 public String test1(String arg) { return arg + “测试”; } // 此程序返回一个一维数组 public String[] test2(String arg) { String[] result = new String[]{arg}; return result; 2 / 15 } // 当返回值为多维数组时,将之转化为一维数组返回 public String[] test3(String arg) { String[] result = new String[]{“测试,” + arg}; return result; } // 当返回值为其它类型,例如自定义类型、Map、List 等时,将其序列 化(冷冻或腌成咸菜)后返回 public byte[] test4(String arg) { Map map = new HashMap(); map.put(“测试”, arg); java.io.ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(map); return baos.toByteArray(); } } 2.2 services.xml 需要在根目录下建立 META-INF 文件夹,文件夹下放置 MANIFEST.MF 和 services.xml 文件,最好自己写好 MANIFEST.MF 文件,不然导出的时候可能会出 错。 services.xml 文件的内容如下: test.Test 3 / 15 2.3 传值方式 上文中提及到传值方式,即:片段,在 AXIS2 中有 两种传值方式,分别为: org.apache.axis2.rpc.receivers.RPCMessageReceiver:即需要客户端传参数过来, 又返回值。 org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver:需要客户端传参数过 来,但不返回值。 4 / 15 2.4 打包 在 Eclipse 下右键点击项目名,Export..,JAR file,在 JAR File Specification 进 行如下勾选: 注意,文件名的后缀为 aar,Next 后进行如下勾选: 5 / 15 Next 后进行如下勾选: 6 / 15 注意,请写好 MANIFEST.MF 文件,如下所示: Manifest-Version: 1.0 Class-Path: lib/mysql-connector-java-5.1.12-bin.jar 2.5 发布 用浏览器打开 http://localhost:8080/axis2,如下图所示: 7 / 15 点击 Administration,登录,用户名为 admin,密码为 axis2,如下图所示: 点击 upload Service,如下图所示: 8 / 15 按照提示上传 aar 文件即可,其中,aar 文件是 2.4 中打包时得到的文件。 3 客户端 3.1 导入包 需要使用的包如下图所示: 3.2 示例代码 import 的包如下图所示: 9 / 15 代码如下图所示: // 服务器地址 String serviceAddress = "http://localhost:8888/axis2/services/testService"; // 服务器对应的 action,如果不知道的话随便写,系统运行时会提示你的 String action = "http://license.test.jetsum.com"; // 方法名 String methodName = "test1"; // 客户端控件 RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); EndpointReference targetEPR = new EndpointReference(serviceAddress); options.setTo(targetEPR); // 命名空间 QName qName = new QName(action, methodName); // 需要传递给服务器的值 Object[] values = new Object[]{license}; // 返回值的类型,基本类型为 Class[] returnType = new Class[]{String.class}; // 返回结果 Object[] result = serviceClient.invokeBlocking(qName, values, returnType); 10 / 15 return result[0].toString(); 3.3 代码解析 3.3.1 设定服务器地址 首先,你需要设定 webservice 服务器的地址,即: String serviceAddress = "http://localhost:8888/axis2/services/testService"; 登际 http://localhost:8080/axis2,点击 Services,如下图所示: 如上图所示,会列出所有 webservice 服务的地址及能够使用的方法。 3.3.2 设定 action 如以下代码所示: 11 / 15 String action = "http://license.test.jetsum.com"; action 的值可以随便写,如有错误,程序在执行过程中会给予提示。 3.3.3 设定要调用的方法名 如以下代码所示: String methodName = "test1"; 这里指的是要调用服务器上的哪个方法。 3.3.4 设定客户端控件 如以下代码所示: RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); EndpointReference targetEPR = new EndpointReference(serviceAddress); options.setTo(targetEPR); 这一部分为公用代码,直接拷贝即可。 3.3.5 设定命名空间 如以下代码所示: QName qName = new QName(action, methodName); 这一部分为公用代码,直接拷贝即可。 3.3.6 设定需要传送的值 如以下代码所示: Object[] values = new Object[]{license}; 这里设定的是要传递给服务器的参数。 3.3.7 设定返回数据类型 如以下代码所示: Class[] returnType = new Class[]{String.class}; 这里设定的是服务器返回给客户端的值的类型,分为以下几种: 12 / 15 (1) 简单类型的参数,如 String、int、long、double 等待,使用以下代码: Class[] returnType = new Class[]{String.class }; Class[] returnType = new Class[]{Integer.class }; Class[] returnType = new Class[]{Long.class}; (2) 一维数组和二维数组,使用以下代码: Class[] returnType = new Class[]{String[].class}; (3) 复杂数据类型,即通过序列化的数据类型,使用以下代码: Class[] returnType = new Class[]{byte[].class}; 3.3.8 获取返回结果 如以下代码所示: Object[] result = serviceClient.invokeBlocking(qName, values, returnType); return result[0].toString(); 获取服务器返回的结果,有以下几种情况: (1) 简单数据类型,使用以下代码: Object[] result = serviceClient.invokeBlocking(qName, values, returnType); String result = ""; if (null != obj && obj.length > 0) { result = obj[0].toString(); } else { result = null; } (2) 一维数组,使用以下代码: Object[] obj = serviceClient.invokeBlocking(opQName, values, returnType); String[] result = null; if (null != obj && obj.length > 0) { result = (String[]) obj[0]; } else { result = null; } 13 / 15 (3) 多维数组,使用以下代码: Object[] obj = serviceClient.invokeBlocking(qName, values, returnType); String[] result = null; if (null != obj && obj.length > 0) { result = (String[]) obj[0]; // 分解多维数组 for (String s : result) { String[] array = s.split(","); for (String ss : array) { System.out.print("<" + ss + "> "); } System.out.println(); } } else { result = null; } (4) 复杂对象,传递序列化后的值,需要解冻(回鲜): Object[] obj = serviceClient.invokeBlocking(qName, values, returnType); Map result = null; if (null != obj && obj.length > 0) { byte[] buffer = (byte[]) obj[0]; ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer)); result = (Map) ois.readObject(); } else { result = null; }
还剩14页未读

继续阅读

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

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

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

下载pdf

pdf贡献者

lflh_2008

贡献于2012-08-31

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