摘要:本节主要用于介绍使用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
package?com.asiainfo.b2p.soap.interfaces;???
import?java.rmi.RemoteException;??
publicinterface?IBbossGroupInfoService?{??
publicabstract?String?groupInfo(long?groupNo)?throws?Exception,??
????????????RemoteException;???
publicabstract?String?groupSubHistoryInfo(long?groupNo)?throws?Exception;??
}??
实现类:IBbossGroupInfoServiceImpl.java
package?com.asiainfo.b2p.soap.impl;?
import?org.apache.commons.logging.Log;?
import?org.apache.commons.logging.LogFactory;?
import?com.asiainfo.b2p.soap.interfaces.IBbossGroupInfoService;?
publicclass?IBbossGroupInfoServiceImpl?implements?IBbossGroupInfoService?{?
privatestatictransient?Log?log?=?LogFactory?
????????????.getLog(IBbossGroupInfoServiceImpl.class);?
public?String?groupInfo(long?groupNo)?throws?Exception,?RemoteException?{?
????????log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集团编号="?+?groupNo);?
????????System.out.println("我是一个公共的方法,作用是根据集团编号查询集团基本信息");?
????????String?xml="<message>public_groupInfo</message>";
return?xml;?
????}?
public?String?groupSubHistoryInfo(long?groupNo)?throws?Exception?{?
????????log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集团编号="?+?groupNo);?
????????System.out.println("我是一个公共的方法,作用是根据集团编号查询集团订购历史");?
????????String?xml="<message>public_groupSubHistoryInfo</message>";
return?xml;?
????}?
}?
说明:为了更加的接近实际的开发,这个是本机上运行的程序,实现的功能是通过一个编号查询相关信息拼成一个字符串,方法体的部分我删除了,你需要用这个代码的话,直接拷贝修改包名称就可以直接用了。
(2)wsdd文件
wsdd文件只需加入一列几行(前提是你之前已经有wsdd文件了,没有的话可以在下载的apache的demo中拷贝一个):
<servicename="GroupInfoService"type=""provider="java:RPC">
<parametername="className"value="com.asiainfo.b2p.soap.impl.IBbossGroupInfoServiceImpl"></parameter>
<parametername="allowedMethods"value="*"/>
</service>
这个文件放在项目的WEB-INF下面。<service>标签的name属性是发布的webservice的名称,可以自己命名,第一个<parameter>标签的value属性指定实现类的完整路径,包括类名。其他的地方默认就好。
(3)配置web.xml文件
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis?Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
指定处理类以及映射就好,如果像这样配置的话,后面再写webservice的话,这个文件就不用再配置了。
第二步:客户端的开发
(1).动态调用接口
代码如下:
package?test.webserviceclient;?
import?java.net.MalformedURLException;?
import?java.net.URL;?
import?java.rmi.RemoteException;?
import?javax.xml.rpc.ParameterMode;?
import?javax.xml.rpc.ServiceException;?
import?org.apache.axis.client.Call;?
import?org.apache.axis.encoding.XMLType;?
publicclass?Test?{?
publicstaticvoid?test1()?{?
try?{?
????????????org.apache.axis.client.Service?service?=?new?org.apache.axis.client.Service();?
????????????String?wsdlUrl?=?"http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";//请求服务的URL?
????????????URL?url?=?new?URL(wsdlUrl);
????????????Call?call?=?(Call)?service.createCall();?
????????????call.setTargetEndpointAddress(url);
????????????String?serviceName?=?"groupInfo";?
????????????call.setOperationName(serviceName);
????????????call.addParameter("groupNo",?XMLType.XSD_LONG,?ParameterMode.IN);
????????????call.setReturnType(XMLType.SOAP_STRING);
long?groupNo?=?2100000014L;?
????????????String?res?=?(String)?call.invoke(new?Object[]?{?groupNo?});
????????????System.out.println(res);?
????????}?catch?(MalformedURLException?e)?{?
????????????e.printStackTrace();?
????????}?catch?(ServiceException?e)?{?
????????????e.printStackTrace();?
????????}?catch?(RemoteException?e)?{?
????????????e.printStackTrace();?
????????}?
????}?
publicstaticvoid?main(String[]?args)?{?
????????test1();?
????}?
}?
代码中的注释很详细,我就不介绍了。
(2).使用从WSDL生成的存根generated?Stubs?from?Service?WSDL?description
第一步:配置genclient.bat文件
右键单击“编辑”打开bat文件如下(为了便于说明,每行的意思我就直接写在后面了):
set Axis_Lib=E:esoplib -----指定工程的lib目录
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% -----默认
set Output_Path=E:esopsrc -----指定工程的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类如下:

第三步:写测试类调用webservice
package?test.webserviceclient;?
import?java.net.MalformedURLException;?
import?java.net.URL;?
import?java.rmi.RemoteException;?
import?javax.xml.rpc.ParameterMode;?
import?javax.xml.rpc.ServiceException;?
import?org.apache.axis.client.Call;?
import?org.apache.axis.encoding.XMLType;?
publicclass?Test?{?
publicstaticvoid?test1()?{?
????????IBbossGroupInfoServiceImplService?service?=?new?IBbossGroupInfoServiceImplServiceLocator();?
try?{?
????????????String?wsdlUrl?=?"http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";?
????????????URL?url?=?new?URL(wsdlUrl);?
????????????IBbossGroupInfoServiceImpl?client?=?service?
????????????????????.getGroupInfoService(url);?
long?groupNo?=?2100000014L;?
????????????String?res?=?client.groupInfo(groupNo);?
????????????System.out.println(res);?
????????}?catch?(MalformedURLException?e)?{?
????????????e.printStackTrace();?
????????}?catch?(ServiceException?e)?{?
????????????e.printStackTrace();?
????????}?catch?(RemoteException?e)?{?
????????????e.printStackTrace();?
????????}?
????}?
publicstaticvoid?main(String[]?args)?{?
????????test1();?
????}?
}?
对这种生成客户端四个类的情况我要说明下,还有通过wsdltojava命令的方式生成客户端类,但是这个都是一种通过axis调用webservice的方式,既然有工具我们为什么不用呢?
所以能使用wsdltojava命令的方式,我就不介绍了。
test?result:
代码的测试截图我就不贴了,感兴趣的可以试试看。
《!--好久没有上来活动了,今天写的是最近用到的一个东东,本人也是个菜鸟,刚刚在项目中用到webservice,如果有不对的,请各位大侠指正。--》
原文链接:http://www.cnblogs.com/java-pan/archive/2011/11/25/axis_webservice.html