利用JavaScript SOAP Client直接调用webService --完整的前后台配置与调用示例

http://idoveu.iteye.com/blog/1575849

http://blog.djakapm.com/2011/12/15/json-web-service-with-java-and-axis2/#comment-418

 

 

 

在前端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文件中添加如下配置信息:

  1. <servlet>  
  2.         <servlet-name>AxisServlet</servlet-name>  
  3.         <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>  
  4.     </servlet>  
  5.     <servlet>  
  6.         <servlet-name>AdminServlet</servlet-name>  
  7.         <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>  
  8.         <load-on-startup>100</load-on-startup>  
  9.     </servlet>  
  10.     <servlet>  
  11.         <servlet-name>SOAPMonitorService</servlet-name>  
  12.         <servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class>  
  13.         <init-param>  
  14.             <param-name>SOAPMonitorPort</param-name>  
  15.             <param-value>5001</param-value>  
  16.         </init-param>  
  17.         <load-on-startup>100</load-on-startup>  
  18.     </servlet>  
  19.     <servlet-mapping>  
  20.         <servlet-name>AxisServlet</servlet-name>  
  21.         <url-pattern>/servlet/AxisServlet</url-pattern>  
  22.     </servlet-mapping>  
  23.     <servlet-mapping>  
  24.         <servlet-name>AxisServlet</servlet-name>  
  25.         <url-pattern>*.jws</url-pattern>  
  26.     </servlet-mapping>  
  27.     <servlet-mapping>  
  28.         <servlet-name>AxisServlet</servlet-name>  
  29.         <url-pattern>/services/*</url-pattern>  
  30.     </servlet-mapping>  
  31.     <servlet-mapping>  
  32.         <servlet-name>SOAPMonitorService</servlet-name>  
  33.         <url-pattern>/SOAPMonitor</url-pattern>  
  34.     </servlet-mapping>  
  35.     <mime-mapping>  
  36.         <extension>wsdl</extension>  
  37.         <mime-type>text/xml</mime-type>  
  38.     </mime-mapping>  
  39.     <mime-mapping>  
  40.         <extension>xsd</extension>  
  41.         <mime-type>text/xml</mime-type>  
  42.     </mime-mapping>  
<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文件配置:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
  3.     <globalConfiguration>  
  4.         <parameter name="adminPassword" value="admin" />  
  5.         <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl" />  
  6.         <parameter name="sendXsiTypes" value="true" />  
  7.         <parameter name="sendMultiRefs" value="true" />  
  8.         <parameter name="sendXMLDeclaration" value="true" />  
  9.         <parameter name="axis.sendMinimizedElements" value="true" />  
  10.         <requestFlow>  
  11.             <handler type="java:org.apache.axis.handlers.JWSHandler">  
  12.                 <parameter name="scope" value="session" />  
  13.             </handler>  
  14.             <handler type="java:org.apache.axis.handlers.JWSHandler">  
  15.                 <parameter name="scope" value="request" />  
  16.                 <parameter name="extension" value=".jwr" />  
  17.             </handler>  
  18.         </requestFlow>  
  19.     </globalConfiguration>  
  20.     <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder" />  
  21.     <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />  
  22.     <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />  
  23.     <service name="AdminService" provider="java:MSG">  
  24.         <parameter name="allowedMethods" value="AdminService" />  
  25.         <parameter name="enableRemoteAdmin" value="false" />  
  26.         <parameter name="className" value="org.apache.axis.utils.Admin" />  
  27.         <namespace>http://xml.apache.org/axis/wsdd/</namespace>  
  28.     </service>  
  29.     <service name="Version" provider="java:RPC">  
  30.         <parameter name="allowedMethods" value="getVersion" />  
  31.         <parameter name="className" value="org.apache.axis.Version" />  
  32.     </service>  
  33.       
  34.     <!-- xedit 生成表格/表单通用服务 -->  
  35.     <service name="XeditService" provider="java:RPC">  
  36.         <parameter name="allowedMethods" value="*"/>  
  37.         <parameter name="scope" value="Request"/>  
  38.         <parameter name="className" value="com.adam.xedit.service.server.XeditService"/>  
  39.         <parameter name="wsdlPortType" value="Xedit"/>  
  40.         <parameter name="typeMappingVersion" value="1.2"/>  
  41.     </service>  
  42.       
  43.     <transport name="http">  
  44.         <requestFlow>  
  45.             <handler type="URLMapper" />  
  46.             <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />  
  47.         </requestFlow>  
  48.     </transport>  
  49.     <transport name="local">  
  50.         <responseFlow>  
  51.             <handler type="LocalResponder" />  
  52.         </responseFlow>  
  53.     </transport>  
  54.       
  55. </deployment>  
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
	<globalConfiguration>
		<parameter name="adminPassword" value="admin" />
		<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl" />
		<parameter name="sendXsiTypes" value="true" />
		<parameter name="sendMultiRefs" value="true" />
		<parameter name="sendXMLDeclaration" value="true" />
		<parameter name="axis.sendMinimizedElements" value="true" />
		<requestFlow>
			<handler type="java:org.apache.axis.handlers.JWSHandler">
				<parameter name="scope" value="session" />
			</handler>
			<handler type="java:org.apache.axis.handlers.JWSHandler">
				<parameter name="scope" value="request" />
				<parameter name="extension" value=".jwr" />
			</handler>
		</requestFlow>
	</globalConfiguration>
	<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder" />
	<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />
	<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
	<service name="AdminService" provider="java:MSG">
		<parameter name="allowedMethods" value="AdminService" />
		<parameter name="enableRemoteAdmin" value="false" />
		<parameter name="className" value="org.apache.axis.utils.Admin" />
		<namespace>http://xml.apache.org/axis/wsdd/</namespace>
	</service>
	<service name="Version" provider="java:RPC">
		<parameter name="allowedMethods" value="getVersion" />
		<parameter name="className" value="org.apache.axis.Version" />
	</service>
	
	<!-- xedit 生成表格/表单通用服务 -->
	<service name="XeditService" provider="java:RPC">
		<parameter name="allowedMethods" value="*"/>
		<parameter name="scope" value="Request"/>
		<parameter name="className" value="com.adam.xedit.service.server.XeditService"/>
		<parameter name="wsdlPortType" value="Xedit"/>
		<parameter name="typeMappingVersion" value="1.2"/>
	</service>
	
	<transport name="http">
		<requestFlow>
			<handler type="URLMapper" />
			<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
		</requestFlow>
	</transport>
	<transport name="local">
		<responseFlow>
			<handler type="LocalResponder" />
		</responseFlow>
	</transport>
	
</deployment>

其中xedit 生成表格/表单通用服务是我们将要提供的接口类。


3) 对外释放的接口类:

  1. package com.adam.xedit.service.server;  
  2.   
  3. import javax.xml.rpc.ServiceException;  
  4.   
  5. import org.apache.axis.AxisFault;  
  6. import org.apache.axis.MessageContext;  
  7. import org.springframework.context.ApplicationContext;  
  8. import org.springframework.remoting.jaxrpc.ServletEndpointSupport;  
  9.   
  10. import com.adam.xedit.service.server.biz.XeditServiceBiz;  
  11.   
  12. /** 
  13.  * 对外调用的接口 
  14.  * @公司名称: 
  15.  * @作者: 
  16.  * @创建时间: 
  17.  */  
  18. public class XeditService extends ServletEndpointSupport  
  19. {  
  20.     private static final long serialVersionUID = 1L;  
  21.   
  22.     private ApplicationContext applicationContext;  
  23.     private XeditServiceBiz xsBiz;  
  24.   
  25.     protected void onInit() throws ServiceException  
  26.     {  
  27.         super.onInit();  
  28.         applicationContext = super.getApplicationContext();  
  29.         xsBiz = (XeditServiceBiz) applicationContext.getBean("xsBiz");  
  30.     }  
  31.     
  32.   //略去的代码  
  33.     
  34.     /** 
  35.      * 用于javascript soapClient调用接口服务的测试 
  36.      *  
  37.      * @param name 名字 
  38.      * @return 
  39.      */  
  40.     public String helloWorld(String name)  
  41.     {  
  42.         String str = "hello," + name;  
  43.         System.out.println(str);  
  44.         return str;  
  45.     }  
  46.     
  47.     public void destroy()  
  48.     {  
  49.         super.destroy();  
  50.     }  
  51.   
  52.     public void invoke(MessageContext arg0) throws AxisFault  
  53.     {  
  54.         // TODO Auto-generated method stub  
  55.     }  
  56. }  
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

  1. <html>  
  2. <head>  
<html>
<head>
  1. <script type="text/javascript" src="../gis/class/jquery-1.2.6.js"></script>  
  2. <script type="text/javascript" src="../gis/js.src/xedit.service.js"></script>  
  3. <script type="text/javascript" src="../gis/js.src/soapclient21.js"></script>  
  4.   
  5. <!-- 此处略去此理没用到的js -->  
  6. <script language="javascript">  
  7.         var serviceUrl = "../../services/XeditService";  
  8.         var xeditService = new XeditService(serviceUrl);  
  9.     /*  
  10.     * 均用于测试helloWorld  
  11.     **/  
  12.     $(document).ready(function(){  
  13.         $('#btnTest').click(function(){  
  14.             var txtTest = $('#txtTest').val();  
  15.             var result = xeditService.helloWorld(txtTest);  
  16.             if(result.error){  
  17.                 alert(result.errorDetail.string);return false;  
  18.             }else{  
  19.                 $('#txtTest').val(result.value);  
  20.                 alert(txtTest);  
  21.             }  
  22.         });  
  23.     });  
  24.     </script>  
  25. </head>  
  26. <body>  
  27.     <div id="mainDiv" style="width:100%;">  
  28.         <!-- propertyGrid  -->  
  29.         <div id="propertyGridDiv" style="width:350px;">  
  30.             <!-- 测试用 -->  
  31.             <table>  
  32.                 <tr id="trTest">  
  33.                     <td style="border-color:red;"><input type="text" id="txtTest" width="300px";></input></td>  
  34.                     <td align="left"><input type="button" id="btnTest" value="测试" ></input></td>  
  35.                 </tr>  
  36.             </table>  
  37.     
  38.   ...  
  39.   </body>  
  40.   </html>  
<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

[javascript] view plain copy print ?
  1. function XeditService(url){  
  2.     this.base = Xedit2ServiceBase;  
  3.     this.base(url);  
  4. }  
  5.   
  6. XeditService.prototype = new Xedit2ServiceBase;  
  7.   
  8. //helloWorld测试(用于测试JavaScript SOAP Client调用service是否成功)  
  9. XeditService.prototype.helloWorld = function(name){  
  10.     var param = new SOAPClientParameters();  
  11.     param.add('name',name);  
  12.     var result = SOAPClient.invoke(this._url, "helloWorld", param, false);  
  13.     return result;  
  14.   }  
  15.   //略去不相关的代码  
  16. function Xedit2ServiceBase(url){  
  17.     this._url = url;  
  18. }  
  19.   
  20. Xedit2ServiceBase.prototype.toString = function(){  
  21.     return this._url;  
  22.   }  
  23.   //略去不相关的代码  
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 ClientwebService接口的调用。免去了mvc中的controller部分并且将部分业务代码转移到了js前端来处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值