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 ,就到這里了