JavaScriptSoapClient下載地址:https://archive.codeplex.com/?p=javascriptsoapclient
JavaScriptSoapClient的Demo實例: http://www.guru4.net/articoli/javascript-soap-client/demo/en.aspx
利用JavaScript SOAP Client直接調用webService --完整的前后台配置與調用示例
在前端javascript代碼中直接調用webService服務,可以將后台調用webService的業務代碼轉移到前台,這樣做的好處是:
1) 減少了后台編碼量;
2) 在特定的情況下有助於減輕服務器壓力,節省服務器資源;
3) 有效提高服務器端的資源利用率;
但是也存在一定的弊端:
1) 前端javascript編碼的穩定性一直以來備受詬病;
2) 並且對不同瀏覽器的編碼調試比較麻煩;
對於JavaScript SOAP Client的優缺點暫且不論,現在主要來了解是如何使用這個js庫。
1 java后台webService發布
任何前端的數據訪問都離不開離不開后台webService的支撐,因此后台webService類庫的選擇以及配置是很關鍵的,只有在正確的類庫版本和正確的配置webService方可保證后台對外釋放的接口能夠被有效調用。在java語言中有多重webService類庫供大家使用,其中最常用的三種為Axis、Xfire 、Restlet。
現在以axis 1.4 來進行后台webService接口的配置發布。
1) 創建一個web工程,在工程的web.xml文件中添加如下配置信息:
<servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> </servlet> <servlet> <servlet-name>AdminServlet</servlet-name> <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class> <load-on-startup>100</load-on-startup> </servlet> <servlet> <servlet-name>SOAPMonitorService</servlet-name> <servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class> <init-param> <param-name>SOAPMonitorPort</param-name> <param-value>5001</param-value> </init-param> <load-on-startup>100</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/servlet/AxisServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>*.jws</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SOAPMonitorService</servlet-name> <url-pattern>/SOAPMonitor</url-pattern> </servlet-mapping> <mime-mapping> <extension>wsdl</extension> <mime-type>text/xml</mime-type> </mime-mapping> <mime-mapping> <extension>xsd</extension> <mime-type>text/xml</mime-type> </mime-mapping>
2) 用於發布服務的server-config.wsdd文件配置:
3) 對外釋放的接口類:
package com.adam.xedit.service.server; import javax.xml.rpc.ServiceException; import org.apache.axis.AxisFault; import org.apache.axis.MessageContext; import org.springframework.context.ApplicationContext; import org.springframework.remoting.jaxrpc.ServletEndpointSupport; import com.adam.xedit.service.server.biz.XeditServiceBiz; /** * 對外調用的接口 * @公司名稱: * @作者: * @創建時間: */ public class XeditService extends ServletEndpointSupport { private static final long serialVersionUID = 1L; private ApplicationContext applicationContext; private XeditServiceBiz xsBiz; protected void onInit() throws ServiceException { super.onInit(); applicationContext = super.getApplicationContext(); xsBiz = (XeditServiceBiz) applicationContext.getBean("xsBiz"); } //略去的代碼 /** * 用於javascript soapClient調用接口服務的測試 * * @param name 名字 * @return */ public String helloWorld(String name) { String str = "hello," + name; System.out.println(str); return str; } public void destroy() { super.destroy(); } public void invoke(MessageContext arg0) throws AxisFault { // TODO Auto-generated method stub } }
這個類繼承了import org.springframework.remoting.jaxrpc.ServletEndpointSupport類,很明顯我們是在spring框架下進行開發的,而且這個類中本來還有其他方法,略去。現在只需一個helloWorld() 方法來測試即可。Spring相關的配置也略去。
2 Javascript SOAP Client 前端調用webService
1) 頁面helloXeditService.htm
<script type="text/javascript" src="../gis/class/jquery-1.2.6.js"></script> <script type="text/javascript" src="../gis/js.src/xedit.service.js"></script> <script type="text/javascript" src="../gis/js.src/soapclient21.js"></script> <!-- 此處略去此理沒用到的js --> <script language="javascript"> var serviceUrl = "../../services/XeditService"; var xeditService = new XeditService(serviceUrl); /* * 均用於測試helloWorld **/ $(document).ready(function(){ $('#btnTest').click(function(){ var txtTest = $('#txtTest').val(); var result = xeditService.helloWorld(txtTest); if(result.error){ alert(result.errorDetail.string);return false; }else{ $('#txtTest').val(result.value); alert(txtTest); } }); }); </script> </head> <body> <div id="mainDiv" style="width:100%;"> <!-- propertyGrid --> <div id="propertyGridDiv" style="width:350px;"> <!-- 測試用 --> <table> <tr id="trTest"> <td style="border-color:red;"><input type="text" id="txtTest" width="300px";></input></td> <td align="left"><input type="button" id="btnTest" value="測試" ></input></td> </tr> </table> ... </body> </html>
該頁面也刪去了該示例沒用到的代碼。
1) Xedit.service.js
function XeditService(url){ this.base = Xedit2ServiceBase; this.base(url); } XeditService.prototype = new Xedit2ServiceBase; //helloWorld測試(用於測試JavaScript SOAP Client調用service是否成功) XeditService.prototype.helloWorld = function(name){ var param = new SOAPClientParameters(); param.add('name',name); var result = SOAPClient.invoke(this._url, "helloWorld", param, false); return result; } //略去不相關的代碼 function Xedit2ServiceBase(url){ this._url = url; } Xedit2ServiceBase.prototype.toString = function(){ return this._url; } //略去不相關的代碼
1) 頁面測試:
輸入
點擊測試彈出框
輸入框回填數據
后台控制台打印
以上測試就完成了Javascript SOAP Client對webService接口的調用。免去了mvc中的controller部分並且將部分業務代碼轉移到了js前端來處理。