axis2发布webservice和客户端调用的例子,完全可以跑的通 ,这里在services.xml中发布多个服务
这里模仿中国移动webservice的实际调用过程
采用Axis2发布webservice,采用手动生成.aar文件,手动生成webservice的客户端代码
这次的webservice代码还是在webServiceServerDemo项目中
Webservice的服务端的代码

package com.dongaiqin.wanggd; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import webServiceServerDemo.RequestInfo; import webServiceServerDemo.QueryPersonInfoRequest; /** * 入参报文如下: * <?xml version="1.0" encoding="GBK" standalone="no" ?> <ROOT> <REQUEST_INFO> <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> </REQUEST_INFO> </ROOT> * @author Administrator * */ public class WebServiceServerDemo{ public String callService(String requstXml) { //入参数是xml格式,返回值也是xml的 //解析入参 String IDCARD_NO =""; String PERSON_NAME=""; String REQUEST_INFO=""; Document document; try { document = DocumentHelper.parseText(requstXml); Element root = document.getRootElement(); //注意dom4j解析xml时,获取的element不能越级的节点 ,如是不能直接通过root根节点, //来查找非直接子节点的元素,如这里的IDCARD_NO IDCARD_NO = root.element("REQUEST_INFO").element("IDCARD_NO").getText(); PERSON_NAME = root.element("REQUEST_INFO").element("PERSON_NAME").getText(); /*List list = root.elements("REQUEST_INFO"); Element element = (Element)list.get(0); System.out.println(element.element("IDCARD_NO").getText());*/ } catch (Exception e) { e.printStackTrace(); } System.out.println(IDCARD_NO); System.out.println(PERSON_NAME); //这里没有查询数据库,直接返回一段数据 if(IDCARD_NO.equals("370982")&&PERSON_NAME.equals("WANGGD")){ System.out.println("****************************"); return "<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\" ?> \n"+ "<ROOT> \n"+ "<IDCARD_NO type=\"string\">370982</IDCARD_NO> \n"+ "<PERSON_NAME type=\"string\">WANGGD</PERSON_NAME> \n"+ "<PERSON_AGE type=\"string\">30</PERSON_AGE> \n"+ "<PERSON_ADDRESS type=\"string\">济南市中区</PERSON_ADDRESS> \n"+ "<PERSON_INFO> \n"+ "<COURCE_LIST>\n"+ "<COURSE>\n"+ "<COURCE_NAME type=\"string\">英语</COURCE>\n"+ "<COURCE_SCORE type=\"string\">120</COURCE>\n"+ "</COURSE>\n"+ "<COURSE>\n"+ "<COURCE_NAME type=\"string\">数学</COURCE>\n"+ "<COURCE_SCORE type=\"string\">150</COURCE>\n"+ "</COURSE>\n"+ "</COURCE_LIST>\n"+ "<HOBBYS_LIST>\n"+ "<HOBBY>\n"+ "<HOBBY_NAME type=\"string\">足球</HOBBY>\n"+ "<HOBBY_TIME type=\"string\">2年</HOBBY>\n"+ "</HOBBY>\n"+ "<HOBBY>\n"+ "<HOBBY_NAME type=\"string\">魔术</HOBBY>\n"+ "<HOBBY_TIME type=\"string\">2年</HOBBY>\n"+ "</HOBBY>\n"+ "</HOBBYS_LIST>\n"+ "</PERSON_INFO>\n"+ "</ROOT>\n"; }else { return null; } } public static void main(String[] args) { RequestInfo requestInfo = new RequestInfo(); requestInfo.setIdCardNo("370982"); requestInfo.setPersonName("WANGGD"); QueryPersonInfoRequest request = new QueryPersonInfoRequest(); request.setRequestInfo(requestInfo); System.out.println(MyParseXml.parseTestWebserviceRequest2XML(request)); System.out.println(new WebServiceServerDemo().callService(MyParseXml.parseTestWebserviceRequest2XML(request))); } }
项目的组织结构,这次同时发布2个服务
其中deploy文件夹中,
除了META-INF使用文件夹以外,其他的可以使用package, deploy 下面保存的都是要发布的webservice服务相关的class文件
注意这里的services.xml的内容 ,
此处使用<serviceGroup> </serviceGroup> 来发布多个服务,
每个服务采用<service></service> 来声明
<serviceGroup>
<service name="ManagerUserService">
<description>ManagerUserService</description>
<parameter name="ServiceClass">com.hoo.service.ManagerUserService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
<service name="WebServiceServerDemo">
<description>WebServiceServerDemo</description>
<parameter name="ServiceClass">com.dongaiqin.wanggd.WebServiceServerDemo
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
</serviceGroup>
手动生成aar文件
1. 在cmd中进入到webServiceServerDemo项目中deploy文件夹下面
(deploy中存放了发布webservice相关的class文件和services.xml配置文件)
刷新deploy文件夹后会看到生成的aar文件
把刚生成的webSeviceDemo.aar放到tomcat 的webapps\axis2\WEB-INF\services
启动tomcat,看一下效果,可以发现在services.xml中发布的2个服务
新建web工程。webserviceClientDemo 用来统一存放生成的webservice的客户端
webserviceClientDemo 项目中要添加axis2的支持
在cmd中进入到webserviceClientDemo项目所在的空间的路径,执行命令
wsdl2java -uri http://localhost:8080/axis2/services/WebServiceServerDemo?wsdl
执行wsdl2java -uri http://localhost:8080/axis2/services/ManagerUserService?wsdl
生成ManagerUserService对应的客户端代码
刷新webserviceClientDemo项目可以看到生成的客户端代码
下面封装webservice的报文信息 --------------------------------------------------------------------------------------------------------------------------------- 服务名: queryPersonInfo 说明:根据 客户的身份证前6位 和 客户的用户名 查询用户 的相关信息,如选课的信息和爱好信息 --------------------------------------------------------------------------------------------------------------------------------- 入参报文如下: <?xml version="1.0" encoding="GBK" standalone="no" ?> <ROOT> <REQUEST_INFO> <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> </REQUEST_INFO> </ROOT> 出参报文如下: <?xml version="1.0" encoding="GBK" standalone="no" ?> <ROOT> <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> <PERSON_AGE type="string">30</PERSON_AGE> <PERSON_ADDRESS type="string">济南市中区</PERSON_ADDRESS> <PERSON_INFO> <COURCE_LIST> <COURSE> <COURCE_NAME type="string">英语</COURCE> <COURCE_SCORE type="string">120</COURCE> </COURCE> <COURSE> <COURCE_NAME type="string">数学</COURCE> <COURCE_SCORE type="string">150</COURCE> </COURCE> </COURCE_LIST> <HOBBYS_LIST> <HOBBY> <HOBBY_NAME type="string">足球</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBY> <HOBBY> <HOBBY_NAME type="string">魔术</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBYS> </HOBBYS_LIST> </PERSON_INFO> </ROOT> 第一步: 根据给定的报文,封装报文 1. 封装入参报文 <?xml version="1.0" encoding="GBK" standalone="no" ?> <ROOT> <REQUEST_INFO> <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> </REQUEST_INFO> </ROOT> 这里把 <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> 封装到一个对象里面, IDCARD_NO和 PERSON_NAME 分别对应对象的两个属性 private String idCardNo =""; //默认值为空字符 private String personName =""; 代码如下: package com.dongaiqin.objects; public class RequestInfo { private String idCardNo =""; //默认值为空字符 private String personName =""; public String getIdCardNo() { return idCardNo; } public void setIdCardNo(String idCardNo) { this.idCardNo = idCardNo; } public String getPersonName() { return personName; } public void setPersonName(String personName) { this.personName = personName; } public RequestInfo(String idCardNo, String personName) { super(); this.idCardNo = idCardNo; this.personName = personName; } public RequestInfo() { super(); } } <REQUEST_INFO></REQUEST_INFO>标签对中整个内容封装为一个对象,该对象中包含又有一个对象(RequestInfo) package com.dongaiqin.objects; /** * 入参报文: * * 入参报文如下: * <?xml version="1.0" encoding="GBK" standalone="no" ?> <ROOT> <REQUEST_INFO> <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> </REQUEST_INFO> </ROOT> * * @author Administrator * */ public class QueryPersonInfoRequest { /** * 这里把下面的东西封装为一个对象RequestInfo,对象有2个属性 * <REQUEST_INFO> <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> </REQUEST_INFO> */ private RequestInfo requestInfo; public RequestInfo getRequestInfo() { return requestInfo; } public void setRequestInfo(RequestInfo requestInfo) { this.requestInfo = requestInfo; } public QueryPersonInfoRequest(RequestInfo requestInfo) { super(); this.requestInfo = requestInfo; } public QueryPersonInfoRequest() { super(); } } 2. 封装出参报文信息: 这一次把所有的出参报文信息封装为一个对象QueryPersonInfoResponse <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> <PERSON_AGE type="string">30</PERSON_AGE> <PERSON_ADDRESS type="string">济南市市中区</PERSON_ADDRESS> 封装为 对象的属性 private String idCardNO; private String personName; private String personAge; private String personAddress; 报文: <COURCE_LIST> <COURSE> <COURCE_NAME type="string">英语</COURCE> <COURCE_SCORE type="string">120</COURCE> </COURCE> <COURSE> <COURCE_NAME type="string">数学</COURCE> <COURCE_SCORE type="string">150</COURCE> </COURCE> </COURCE_LIST> 其中 <COURSE> <COURCE_NAME type="string">英语</COURCE> <COURCE_SCORE type="string">120</COURCE> </COURCE> 封装为一个对象Cource package com.dongaiqin.objects; /** * 封装 * <COURSE> <COURCE_NAME type="string">英语</COURCE> <COURCE_SCORE type="string">120</COURCE> </COURCE> <COURSE> <COURCE_NAME type="string">数学</COURCE> <COURCE_SCORE type="string">150</COURCE> </COURCE> * * @author Administrator * */ public class Cource { private String courceName; private String courceScore; public String getCourceName() { return courceName; } public void setCourceName(String courceName) { this.courceName = courceName; } public String getCourceScore() { return courceScore; } public void setCourceScore(String courceScore) { this.courceScore = courceScore; } public Cource(String courceName, String courceScore) { super(); this.courceName = courceName; this.courceScore = courceScore; } public Cource() { super(); } } <COURCE_LIST></COURCE_LIST> 整个标签对 的内容,封装为一个list private List<Cource> courceList =new ArrayList<Cource>(); 报文: <HOBBYS_LIST> <HOBBY> <HOBBY_NAME type="string">足球</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBY> <HOBBY> <HOBBY_NAME type="string">魔术</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBYS> </HOBBYS_LIST> 下面的报文 <HOBBY> <HOBBY_NAME type="string">足球</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBY> 封装为一个对象Hobby package com.dongaiqin.objects; /** * 封装 * <HOBBY> <HOBBY_NAME type="string">足球</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBY> <HOBBY> <HOBBY_NAME type="string">魔术</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBYS> * @author Administrator * */ public class Hobby { private String hobbyName; private String hobbyTime; public String getHobbyName() { return hobbyName; } public void setHobbyName(String hobbyName) { this.hobbyName = hobbyName; } public String getHobbyTime() { return hobbyTime; } public void setHobbyTime(String hobbyTime) { this.hobbyTime = hobbyTime; } public Hobby(String hobbyName, String hobbyTime) { super(); this.hobbyName = hobbyName; this.hobbyTime = hobbyTime; } public Hobby() { super(); } } <HOBBYS_LIST></HOBBYS_LIST>整个标签对的内容封装为一个list private List<Hobby> hobbyList =new ArrayList<Hobby>(); 此时出参报文信息封装完毕,封装为QueryPersonInfoResponse package com.dongaiqin.objects; import java.util.ArrayList; import java.util.List; /** * <?xml version="1.0" encoding="GBK" standalone="no" ?> <ROOT> <IDCARD_NO type="string">370982</IDCARD_NO> <PERSON_NAME type="string">WANGGD</PERSON_NAME> <PERSON_AGE type="string">30</PERSON_AGE> <PERSON_ADDRESS type="string">济南市市中区</PERSON_ADDRESS> <PERSON_INFO> <COURCE_LIST> <COURSE> <COURCE_NAME type="string">英语</COURCE> <COURCE_SCORE type="string">120</COURCE> </COURCE> <COURSE> <COURCE_NAME type="string">数学</COURCE> <COURCE_SCORE type="string">150</COURCE> </COURCE> </COURCE_LIST> <HOBBYS_LIST> <HOBBY> <HOBBY_NAME type="string">足球</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBY> <HOBBY> <HOBBY_NAME type="string">魔术</HOBBY> <HOBBY_TIME type="string">2年</HOBBY> </HOBBYS> </HOBBYS_LIST> </PERSON_INFO> </ROOT> * @author Administrator * */ public class QueryPersonInfoResponse { private String idCardNO; private String personName; private String personAge; private String personAddress; private List<Cource> courceList =new ArrayList<Cource>(); private List<Hobby> hobbyList =new ArrayList<Hobby>(); public List<Cource> getCourceList() { return courceList; } public void setCourceList(List<Cource> courceList) { this.courceList = courceList; } public List<Hobby> getHobbyList() { return hobbyList; } public void setHobbyList(List<Hobby> hobbyList) { this.hobbyList = hobbyList; } public String getIdCardNO() { return idCardNO; } public void setIdCardNO(String idCardNO) { this.idCardNO = idCardNO; } public String getPersonName() { return personName; } public void setPersonName(String personName) { this.personName = personName; } public String getPersonAge() { return personAge; } public void setPersonAge(String personAge) { this.personAge = personAge; } public String getPersonAddress() { return personAddress; } public void setPersonAddress(String personAddress) { this.personAddress = personAddress; } } 这里一般还要在写一个解析入参对象request和出参对象response的方法 package com.dongaiqin.parsexml; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import com.dongaiqin.objects.Cource; import com.dongaiqin.objects.Hobby; import com.dongaiqin.objects.QueryPersonInfoRequest; import com.dongaiqin.objects.QueryPersonInfoResponse; import com.dongaiqin.objects.RequestInfo; import com.dongaiqin.objects.ResponseHead; public class MyParseXml { public static String parseQueryPersonInfoRequest2XML(QueryPersonInfoRequest request){ StringBuffer sb = new StringBuffer(); sb.append("<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\" ?>").append("\n"); sb.append("<ROOT>").append("\n"); sb.append("<REQUEST_INFO>").append("\n"); sb.append("<IDCARD_NO type=\"string\">"+request.getRequestInfo().getIdCardNo()+"</IDCARD_NO>").append("\n"); sb.append("<PERSON_NAME type=\"string\">"+request.getRequestInfo().getPersonName()+"</PERSON_NAME>").append("\n"); sb.append("</REQUEST_INFO>").append("\n"); sb.append("</ROOT>").append("\n"); return sb.toString(); } public static QueryPersonInfoResponse parseXMLQueryPersonInfoResponse(String xml){ Document document=null; try { document = DocumentHelper.parseText(xml); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } QueryPersonInfoResponse response =new QueryPersonInfoResponse(); Element root = document.getRootElement(); String IDCARD_NO = root.elementTextTrim("IDCARD_NO"); String PERSON_NAME = root.elementTextTrim("PERSON_NAME"); String PERSON_AGE = root.elementTextTrim("PERSON_AGE"); String PERSON_ADDRESS = root.elementTextTrim("PERSON_ADDRESS"); List<Element> courceList = root.elements("COURSE_INFO"); List<Element> hobbysList = root.elements("HOBBYS_INFO"); List<Cource> cources = new ArrayList<Cource>(); List<Hobby> hobbys = new ArrayList<Hobby>(); ResponseHead responseHead = new ResponseHead(); responseHead.setIdCardNO(IDCARD_NO); responseHead.setPersonName(PERSON_NAME); responseHead.setPersonAge(PERSON_AGE); responseHead.setPersonAddress(PERSON_ADDRESS); for(Element cource :courceList){ Cource c = new Cource(); c.setCourceName(cource.elementTextTrim("COURCE_NAME")); c.setCourceScore(cource.elementTextTrim("COURCE_SCORE")); cources.add(c); response.setCourceList(cources); } for(Element cource :hobbysList){ Hobby h = new Hobby(); h.setHobbyName(cource.elementTextTrim("HOBBY_NAME")); h.setHobbyTime(cource.elementTextTrim("HOBBY_TIME")); hobbys.add(h); response.setHobbyList(hobbys); } return response; } public static void main(String[] args) { QueryPersonInfoRequest request = new QueryPersonInfoRequest(); RequestInfo info = new RequestInfo(); info.setIdCardNo("370982"); info.setPersonName("wanggd"); request.setRequestInfo(info); System.out.println(parseQueryPersonInfoRequest2XML(request)); } }
接下来做一个关键性的操作,把客户的代码导成一个jar包,供其他的应用使用
在桌面上可以看到生成的jar包, 看了一下属性 290kb
新建web工程: callWebserviceDemo 测试webservice的客户端是否可以使用
并且要添加axis2的支持
把 webserviceClientDemo.jar 放到上面工程的lib目录下面
编写webservice服务: QueryPersonInfo 的客户端调用的测试代码
测试代码如下:
测试代码如下:
package test;
import java.rmi.RemoteException;
import com.dongaiqin.objects.QueryPersonInfoRequest;
import com.dongaiqin.objects.RequestInfo;
import com.dongaiqin.parsexml.MyParseXml;
import com.dongaiqin.wanggd.WebServiceServerDemoStub;
public class WebServiceServerDemoClient {
public static void main(String[] args) throws RemoteException {
String target = "http://localhost:8080/axis2/services/WebServiceServerDemo";
WebServiceServerDemoStub stub = new WebServiceServerDemoStub(target);
//callservice是方法名
WebServiceServerDemoStub.CallService callservice = new WebServiceServerDemoStub.CallService();
// 创建editUser方法的参数,User.java类型的参数
RequestInfo requestInfo = new RequestInfo();
requestInfo.setIdCardNo("370982");
requestInfo.setPersonName("WANGGD");
QueryPersonInfoRequest request = new QueryPersonInfoRequest();
request.setRequestInfo(requestInfo);
callservice.setRequstXml(MyParseXml.parseQueryPersonInfoRequest2XML(request));
System.out.println("入参报文信息:");
System.out.println(MyParseXml.parseQueryPersonInfoRequest2XML(request));
WebServiceServerDemoStub.CallServiceResponse response = stub.callService(callservice);
System.out.println("出参报文信息:");
System.out.println(response.get_return());
}
}
运行测试程序,输出结果如下
入参报文信息:
<?xml version="1.0" encoding="GBK" standalone="no" ?>
<ROOT>
<REQUEST_INFO>
<IDCARD_NO type="string">370982</IDCARD_NO>
<PERSON_NAME type="string">WANGGD</PERSON_NAME>
</REQUEST_INFO>
</ROOT>
出参报文信息:
<?xml version="1.0" encoding="GBK" standalone="no" ?>
<ROOT>
<IDCARD_NO type="string">370982</IDCARD_NO>
<PERSON_NAME type="string">WANGGD</PERSON_NAME>
<PERSON_AGE type="string">30</PERSON_AGE>
<PERSON_ADDRESS type="string">济南市中区</PERSON_ADDRESS>
<PERSON_INFO>
<COURCE_LIST>
<COURSE>
<COURCE_NAME type="string">英语</COURCE>
<COURCE_SCORE type="string">120</COURCE>
</COURSE>
<COURSE>
<COURCE_NAME type="string">数学</COURCE>
<COURCE_SCORE type="string">150</COURCE>
</COURSE>
</COURCE_LIST>
<HOBBYS_LIST>
<HOBBY>
<HOBBY_NAME type="string">足球</HOBBY>
<HOBBY_TIME type="string">2年</HOBBY>
</HOBBY>
<HOBBY>
<HOBBY_NAME type="string">魔术</HOBBY>
<HOBBY_TIME type="string">2年</HOBBY>
</HOBBY>
</HOBBYS_LIST>
</PERSON_INFO>
</ROOT>
---------------------------------------------------------------------
Ok ,就到这里了