转载

使用axis开发webservice详解

摘要:本节主要用于介绍使用axis开发webservice,包括服务端的创建、webservice的部署、客户端的调用。

preparation:

说明:相关的可能要了解SOAP(简单对象访问协议)、WSDL(web服务描述语言)、XML(可扩展标记语言)、axis(阿帕奇可扩展交互系统)等相关知识。

1.下载axis的jar包,请到apache官网或者在百度自行下载,然后导入jar包,不清楚的话导入所有的jar包就好了。(本人用的是axis1的版本,因为项目中用的是axis1的版本)

2.webservice客户端生成工具genclient.bat(后面会对这个工具做一个简单的说明)

之前介绍没有说明本机的环境,现在把本机环境罗列一下:

系统:XP myeclipse:6.5 tomcat:5.X JDK:1.5

生成webservice的方式有XFire、Jax-WS、axis等,使用axis调用webservi有三种方式:动态调用接口、使用动态代理Dynamic Proxy、使用从WSDL生成的存根generated Stubs from Service WSDL description,由于本人工作中使用的是axis,调用webservice的方式用到的有动态调用接口、使用从WSDL生成的存根generated Stubs from Service WSDL description,故本节只介绍用axis调用webservice的这两种方式。后续的拓展部分根据需要再说。

start:

第一步:服务器端的开发

(1)开发java文件

代码如下:

接口文件:IBbossGroupInfoService.java

  1. package com.asiainfo.b2p.soap.interfaces;   
  2.   
  3. import java.rmi.RemoteException;  
  4. public interface IBbossGroupInfoService {  
  5.   
  6.     // 根据集团编号查询集团基本信息  
  7.     /**  
  8.      * 集团编号 GROUP_NUM 集团名称 GROUP_NAME 公司地址 CO_ADDR 集团状态 GROUP_STATE 集团开户时间  
  9.      * START_TIME 传真 FAX 企业网址 WEB_URL 证件类型 CARD_TYPE 证件号码 CARD_CODE  
  10.      * 公司邮编CO_POSTCODE 联系电话 TEL_NUM 法人代表名称 PERSON_NAME 发展类型 DEVELOP_TYPE  
  11.      * 地区编码REGION_ID regionId  
  12.      *   
  13.      * @throws Exception  
  14. */  
  15.     public abstract String groupInfo(long groupNo) throws Exception,  
  16.             RemoteException;   
  17.     // 根据集团编号查询集团订购历史  
  18.     public abstract String groupSubHistoryInfo(long groupNo) throws Exception;  
  19. }  

实现类:IBbossGroupInfoServiceImpl.java

  1. package com.asiainfo.b2p.soap.impl; 
  2.  
  3. import org.apache.commons.logging.Log; 
  4. import org.apache.commons.logging.LogFactory; 
  5. import com.asiainfo.b2p.soap.interfaces.IBbossGroupInfoService; 
  6.  
  7. /** 
  8.  * @Product esop_dev 
  9.  * @FileName IBbossGroupInfoServiceImpl.java 
  10.  * @History TODO 根据集团编号,查询集团基本信息、集团用户信息、集团订购历史 
  11.  * @Version 1.0.0 
  12.  * @Date Nov 22, 2011 
  13.  * @Author pantaipeng 
  14.  * @Content 最初版本 
  15. */ 
  16. public class IBbossGroupInfoServiceImpl implements IBbossGroupInfoService { 
  17.     private static transient Log log = LogFactory 
  18.             .getLog(IBbossGroupInfoServiceImpl.class); 
  19.  
  20.  
  21.     // 根据集团编号查询集团基本信息 
  22.     public String groupInfo(long groupNo) throws Exception, RemoteException { 
  23.         log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集团编号=" + groupNo); 
  24.         //方法体我省略了,为了测试我仅加入一句打印语句 
  25.         System.out.println("我是一个公共的方法,作用是根据集团编号查询集团基本信息"); 
  26.         String xml="<message>public_groupInfo</message>";//为了测试,返回的信息我也是随便写的一个字符串 
  27.         return xml; 
  28.     } 
  29.  
  30.     // 根据集团编号查询集团订购历史 
  31.     public String groupSubHistoryInfo(long groupNo) throws Exception { 
  32.  
  33.         log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集团编号=" + groupNo); 
  34.         //方法体我省略了,为了测试我仅加入一句打印语句 
  35.         System.out.println("我是一个公共的方法,作用是根据集团编号查询集团订购历史"); 
  36.         String xml="<message>public_groupSubHistoryInfo</message>";//为了测试,返回的信息我也是随便写的一个字符串 
  37.         return xml; 
  38.     } 

说明:为了更加的接近实际的开发,这个是本机上运行的程序,实现的功能是通过一个编号查询相关信息拼成一个字符串,方法体的部分我删除了,你需要用这个代码的话,直接拷贝修改包名称就可以直接用了。

(2)wsdd文件

wsdd文件只需加入一列几行(前提是你之前已经有wsdd文件了,没有的话可以在下载的apache的demo中拷贝一个):

  1. <service name="GroupInfoService" type=""  provider="java:RPC"> 
  2. <parameter name="className" value="com.asiainfo.b2p.soap.impl.IBbossGroupInfoServiceImpl" ></parameter> 
  3. <parameter name="allowedMethods" value="*"/> 
  4. </service> 

这个文件放在项目的WEB-INF下面。<service>标签的name属性是发布的webservice的名称,可以自己命名,第一个<parameter>标签的value属性指定实现类的完整路径,包括类名。其他的地方默认就好。
(3)配置web.xml文件

  1. <servlet> 
  2.   <servlet-name>AxisServlet</servlet-name> 
  3.   <display-name>Apache-Axis Servlet</display-name> 
  4.   <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> 
  5. </servlet> 
  6. <servlet-mapping> 
  7.   <servlet-name>AxisServlet</servlet-name> 
  8.   <url-pattern>/services/*</url-pattern> 
  9. </servlet-mapping> 

指定处理类以及映射就好,如果像这样配置的话,后面再写webservice的话,这个文件就不用再配置了。

第二步:客户端的开发

(1).动态调用接口

代码如下:

  1. package test.webserviceclient; 
  2.  
  3. import java.net.MalformedURLException; 
  4. import java.net.URL; 
  5. import java.rmi.RemoteException; 
  6. import javax.xml.rpc.ParameterMode; 
  7. import javax.xml.rpc.ServiceException; 
  8. import org.apache.axis.client.Call; 
  9. import org.apache.axis.encoding.XMLType; 
  10.  
  11. public class Test { 
  12.     /** 
  13.      * 通过genClient.bat文件生成的webservice客户端调用webservice服务的步骤如下: 
  14.      * 1.创建service对象  
  15.      * 2.创建url对象  
  16.      * 3.创建call对象, 
  17.      * 4.调用webservice的方法 
  18. */ 
  19.     public static void test1() { 
  20.         try { 
  21.             // 1.创建service对象,通过axis自带的类创建 
  22.             org.apache.axis.client.Service service = new org.apache.axis.client.Service(); 
  23.  
  24.             // 2.创建url对象 
  25.             String wsdlUrl = "http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";//请求服务的URL 
  26.             URL url = new URL(wsdlUrl);//通过URL类的构造方法传入wsdlUrl地址创建URL对象 
  27.  
  28. // 2.创建服务方法的调用者对象call,设置call对象的属性 
  29.             Call call = (Call) service.createCall(); 
  30.             call.setTargetEndpointAddress(url);//给call对象设置请求的URL属性 
  31.             String serviceName = "groupInfo"
  32.             call.setOperationName(serviceName);//给call对象设置调用方法名属性 
  33.             call.addParameter("groupNo", XMLType.XSD_LONG, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式 
  34.             call.setReturnType(XMLType.SOAP_STRING);// 设置调用方法的返回值类型 
  35.  
  36. //4.通过invoke方法调用webservice 
  37.             long groupNo = 2100000014L; 
  38.             String res = (String) call.invoke(new Object[] { groupNo });//调用服务方法 
  39.             System.out.println(res); 
  40.         } catch (MalformedURLException e) { 
  41.             e.printStackTrace(); 
  42.         } catch (ServiceException e) { 
  43.             e.printStackTrace(); 
  44.         } catch (RemoteException e) { 
  45.             e.printStackTrace(); 
  46.         } 
  47.     } 
  48.  
  49.     public static void main(String[] args) { 
  50.         test1(); 
  51.     } 

代码中的注释很详细,我就不介绍了。

(2).使用从WSDL生成的存根generated Stubs from Service WSDL description

第一步:配置genclient.bat文件

右键单击“编辑”打开bat文件如下(为了便于说明,每行的意思我就直接写在后面了):

 set Axis_Lib=E:/esop/lib -----指定工程的lib目录 set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% -----默认 set Output_Path=E:/esop/src -----指定工程的src目录 set Package=com.asiainfo.maks.webservices.pbosswebclient -----指定生成的四个文件的存放位置 %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% ----- 默认http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl -----指定wsdl文件的路径

第二步:用genclient.bat生成四个客户端类

双击编译好的bat文件,执行后生成的四个java类如下:

使用axis开发webservice详解

第三步:写测试类调用webservice

  1. package test.webserviceclient; 
  2.  
  3. import java.net.MalformedURLException; 
  4. import java.net.URL; 
  5. import java.rmi.RemoteException; 
  6. import javax.xml.rpc.ParameterMode; 
  7. import javax.xml.rpc.ServiceException; 
  8. import org.apache.axis.client.Call; 
  9. import org.apache.axis.encoding.XMLType; 
  10.  
  11. public class Test { 
  12.     /** 
  13.      * 通过genClient.bat文件生成的webservice客户端调用webservice服务的步骤如下: 
  14.      * 先介绍创建的四个文件分别为: 
  15.      * IBbossGroupInfoServiceImpl 定义了web服务接口, 
  16.      * IBbossGroupInfoServiceImplService 定义了用户获取web服务接口的方法 
  17.      * IBbossGroupInfoServiceImplServiceLocator 接口IBbossGroupInfoServiceImplService的具体实现 
  18.      * GroupInfoServiceSoapBindingStub web服务客户端桩,通过该类与服务器交互,该类实现了IBbossGroupInfoServiceImpl接口 
  19.      * 1.创建service对象  
  20.      * 2.创建url对象  
  21.      * 3.创建client对象  
  22.      * 4.调用webservice的方法 
  23. */ 
  24.     public static void test1() { 
  25.         // 1.创建一个service对象 
  26.         IBbossGroupInfoServiceImplService service = new IBbossGroupInfoServiceImplServiceLocator(); 
  27.  
  28.         try { 
  29.             // 2.创建一个URL对象,传入wsdl的地址够过URL的构造方法创建 
  30.             String wsdlUrl = "http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl"
  31.             URL url = new URL(wsdlUrl); 
  32.  
  33.             // 3创建一个client对象 
  34.             IBbossGroupInfoServiceImpl client = service 
  35.                     .getGroupInfoService(url); 
  36.  
  37.             // 4调用webservice的方法 
  38.             long groupNo = 2100000014L; 
  39.             String res = client.groupInfo(groupNo); 
  40.  
  41.             System.out.println(res); 
  42.  
  43.         } catch (MalformedURLException e) { 
  44.             e.printStackTrace(); 
  45.         } catch (ServiceException e) { 
  46.             e.printStackTrace(); 
  47.         } catch (RemoteException e) { 
  48.             e.printStackTrace(); 
  49.         } 
  50.  
  51.     } 
  52.  
  53.     public static void main(String[] args) { 
  54.         test1(); 
  55.     } 

对这种生成客户端四个类的情况我要说明下,还有通过wsdltojava命令的方式生成客户端类,但是这个都是一种通过axis调用webservice的方式,既然有工具我们为什么不用呢?

所以能使用wsdltojava命令的方式,我就不介绍了。

test result:

代码的测试截图我就不贴了,感兴趣的可以试试看。

《!--好久没有上来活动了,今天写的是最近用到的一个东东,本人也是个菜鸟,刚刚在项目中用到webservice,如果有不对的,请各位大侠指正。--》

正文到此结束
Loading...