本页内容为:基于Ajax和JSON从javascript中调用后台java方法的JsonGateway,该文章本站转载自网络,如有侵权请告之,我们将会及时将其删除,其正文内容如下:

JsonGateway是一个java远程服务调用的ajax的接口,它使用Json数据格式在页面上的javascript和后台的 java服务之间进行数据交换。目前它可以调用spring的service,当然也可以调用普通的java类方法。jsonGateway可以自动生成 所配置的java类的javascript包装类,这将使你能够轻松进行ajax远程调用。jsonGateway使用了JQuery来进行远程调用,同 时在服务端使用了jsontools进行json数据格式的转换。

你可以在Sorceforge上下载 http://sourceforge.net/project/showfiles.php?group_id=188794

使用方法:

如果后台我们使用了Spring,那么调用Spring中配置的Service Bean的方法的方式为


配置JsonGateway的Servlet: 在web.xml中, 增加
<servlet>
<description>json gateway</description>
<display-name>json gateway servlet</display-name>
<servlet-name>json-gateway</servlet-name>
<servlet-class>org.svilo.spring.json.JsonGatewayServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>json-gateway</servlet-name>
<url-pattern>/json/*</url-pattern>
</servlet-mapping>

在html、jsp页面中,引入如下的javascript:
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/json.js"></script>
<script type="text/javascript" src="/js/moo.js"></script>
<script type="text/javascript" src="/js/jsonGateway.js"></script>

同时也需要引入自动生成的服务代理Javascript:

如果你有一个Spring的服务bean叫做'CustomerMgrService',那么在你的html中,增加如下几行代码:

<script type="text/javascript"src="/json/CustomerMgrService.js"></script> //the CustomerMgrService.js is generated by the JsonGateway

具体在javascript中的使用方法如下:

function testService(){

var callerResponder = new CallerResponder(); //这是ajax的响应回调的封装类
callerResponder.success = function(jsonObj) { //当调用后台方法成功时的回调函数
var customer = jsonObj;
alert(customer.brandName);

alert(this.context.name); //this will display 'wuyu' //我们在调用某个后台服务方法前,设置到CallerResponder上下文中的一些变量,在成功回调函数中,可以通过上下文取出来使用
alert(this.context.age); //this will display '30'
var str = jQuery.toJSON(customer);
var msg = "ajax success: " + str;
alert(msg);
}

callerResponder.error = function(request,settings,e) { //failure callback function, you may not implement it

//调用后台方法出错的回调函数
if (request.status == 500) {
var jsonError = jQuery.parseJSON(request.responseText);
}
if (this.debug ) {
alert("ajax error: " + request.responseText);
alert(e);
}
}

callerResponder.context.name = "wuyu"; //set the data which you will access in callback function 向callerResponder的上下文中设置一些需要在回调函数中访问的数据

callerResponder.context.age = "30";


var customerMgrService = new CustomerMgrService(); //新创建一个远程服务包装的javascript对象
var tagMgrService = new TagMgrService();
var strCustomerId = jQuery("#customerId").val();
//调用后台服务方法
customerMgrService.findByCustomerId(strCustomerId,callerResponder); // 后台的spring配置中名字叫 CustomerMgrService的Bean有一个'public Customer findByCustomerId(String customerId)'方法,所以我们在这里可以调用它,它在后台方法中只有customerId这个参数,在这里,我们在调用时方法参数的最后面增加 了一个callerResponder的参数。


}

 

下载包中的代码缺省只能是调用Spring中配置的服务bean的方法,但是在没有使用spring的程序中,我们也要使用的话,可以修改JsonGatewayServlet.java

public class JsonGatewayServlet extends HttpServlet {

private static Properties services;

public void init() throws ServletException {
super.init();
services = new Properties();
InputStream in =JsonGatewayServlet.class.getClassLoader().getResourceAsStream("services.properties");
try{
services.load(in);
}catch( Exception e){
e.printStackTrace();
}
}
增加一个名字叫做services.properties的服务配置文件,该文件中写上服务名称和对应java类的映射关系,比如:
BranchByArea=com.keygate.adbidplatform.common.service.BranchByArea

 

最后再修改一下JsonGatewayServlet的getService方法,直接从我们的配置文件中读取服务的配置即可。

private Object getService(HttpServletRequest request,String serviceName) throws Exception {
// WebApplicationContext webappCtx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
// Object service = webappCtx.getBean(serviceName);
Object service = Class.forName((String)services.get(serviceName)).newInstance();
if (service == null)
{
Exception e = new Exception("can not find the service: " + serviceName);
throw e;
}
return service;
}

 

呵呵,自己编写的这个JsonGateway虽然不是很强大,但是想要从javascript中调用java后台方法已经足够了,同时参数的传递也很对象化。配合jquery使用,感觉不错。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐