`
西风吹雨
  • 浏览: 30929 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

基于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使用,感觉不错。
分享到:
评论
8 楼 rmn190 2008-03-27  
顶!关注,我这些天正在用Json呢,同时也用到Ajax,有些乱.
7 楼 birdjavaeye 2007-06-25  
西风吹雨 写道

我写的这个jsongateway不需要程序员来把什么类的信息写在javascript 的object中,想想dwr都怎么用的,jsongateway同样是这样简单。只需要按照说明正常使用即可。程序员只需要愉快的调用自动生成的后台服务的javascript包装类,即可达到调用后台服务方法的目的。这点和flex2差不多。

dwr在这个方面和json一样,以它为起点做对比,还是有点不足。
以简单的方式调用后台服务确实是必要的,只不过库能多做点,程序员就能轻松点
6 楼 tomdev 2007-06-23  
asdf
5 楼 hax 2007-06-23  
andot 写道
考虑用 xml 保存它,是谁来考虑?应用开发程序员还是类库开发程序员?如birdjavaeye所说,如果把这个责任推给应用开发程序员的话,做项目是就太痛苦了。所以,还是把这些封装到类库中去,使用时,以 RPC 方式调用最方便。


我的意思是考虑如果用xml怎么保存,也就是用一个属性(IDREF)来指向对象。并不是说一定要用xml。我是说借鉴xml表达,或者sql表达的方法——即通过一个primitive的id属性来关联。

不过话说回来,如果中间是使用xml而不是json的话,也是一种方式。比如我就比较喜欢在中间使用xml。在什么情况下适用xml?我认为如果你需要一个独立的协议描述的话,可以考虑用xml。xml的好处有几个:
1. 表达能力丰富,可以描述复杂的业务数据
2. xml数据源适合更广泛的场合,互操作性较好,例如cs结构的程序、企业系统之间的交互、手机应用等;相对而言,json和其他格式不是说不能这样使用,但是确实主要局限于web网站。
3. 处理方法标准化化,有很多在各种平台上都可用的工具(sax,dom,xslt等等)。


如果仅仅是程序内部的信息传递,当然我们不希望应用开发程序员为此操心。反过来,某些场合,是需要对通讯协议做仔细设计的,那可以说不仅是应用开发程序员的责任,而且是业务人员的责任。
4 楼 西风吹雨 2007-06-23  
对2楼疑问的回复:
1、是不能直接处理对象图,如果有循环引用,jQuery.toJSON就会挂掉
这个是因为jQuery.toJSON的这个方法有缺陷,我放上去的代码是已经修正过这个问题的。

2、object只是map而已,不直接含有类信息,不容易和java中的类层次对应上
这个当然是用了些技巧,所以也不存在你说的问题。

我写的这个jsongateway不需要程序员来把什么类的信息写在javascript 的object中,想想dwr都怎么用的,jsongateway同样是这样简单。只需要按照说明正常使用即可。程序员只需要愉快的调用自动生成的后台服务的javascript包装类,即可达到调用后台服务方法的目的。这点和flex2差不多。
3 楼 andot 2007-06-22  
考虑用 xml 保存它,是谁来考虑?应用开发程序员还是类库开发程序员?如birdjavaeye所说,如果把这个责任推给应用开发程序员的话,做项目是就太痛苦了。所以,还是把这些封装到类库中去,使用时,以 RPC 方式调用最方便。
2 楼 hax 2007-06-22  
本来json比较适用传数据,如果要传对象图,可以做稍许转换。例如考虑xml怎么保存它。其实就类似sql的外键那样。
类信息跟语言关联太深,如果是简单类型,那稍作转换也可。
1 楼 birdjavaeye 2007-06-22  
用json有几个大缺点:
1 是不能直接处理对象图,如果有循环引用,jQuery.toJSON就会挂掉
2 object只是map而已,不直接含有类信息,不容易和java中的类层次对应上
这两个都是致命缺点
建议看看Objot库,很好地解决了这问题。还有PHPRPC,Buffalo,都避免了json的问题。前面有帖子讨论

如果用基础的库来做这种客户端对服务器的调用,那这个库的核心就要足够强大。如果只是直接基于json而没有做额外处理,那么就等于把职责推给程序员,当项目需要传递对象图、类信息时,还是痛苦

相关推荐

    ajax+json实例

    客户端可能有一个HTML页面,通过JavaScript调用AJAX发送请求,服务器端使用.NET处理请求,将数据以JSON格式返回。例如,一个简单的获取用户信息的接口: ```javascript // 客户端AJAX请求 function getUserInfo() {...

    前台ajax与后台json传递

    Ajax(Asynchronous JavaScript and XML)技术允许我们在不刷新整个页面的情况下,实现局部数据的更新,而Json(JavaScript Object Notation)则是一种轻量级的数据交换格式,易于人阅读和编写,同时也方便机器解析...

    ajax调用java传送json的小例子

    主要是用到jquery的ajax,java中的hibernate4的调用mysql数据和struts2地址重定向,并把数据转换成json数据,经过html页面中的javascript调用后台数据,有添加,修改,删除,查询等简单功能,适用于有ajax初学者,...

    Java+Ajax+JSON

    这些文件可能包含了如何在Java中生成和解析JSON的示例,或者是使用Ajax与服务器交换JSON数据的JavaScript代码。通过学习这些文件,开发者可以加深对Java、Ajax和JSON集成的理解,提升Web应用程序的开发能力。 总的...

    ajax+json+java

    在本例子中,通过Ajax,用户选择前端的下拉列表(Dropdown List)时,后台Java服务会被调用,但不会导致整个页面的刷新。这提高了用户体验,因为用户可以连续操作而不必等待页面加载。当用户更改下拉选项时,Ajax...

    Highcharts AJAX后台JAVA JSON 曲线报表完美可运行例子 不包含官方JS 自己下载

    在这个"Highcharts AJAX后台JAVA JSON 曲线报表完美可运行例子"中,我们将探讨如何结合Java后端和JSON数据格式,通过AJAX技术在网页上展示动态曲线报表。 首先,`index_lineAjax.htm`是前端HTML文件,它包含了...

    dwr dwr项目 js 调用 java 后台 方法 js调用java后台方法 后台方法 异步

    通过这个项目,开发者可以实践DWR的完整流程,从配置到实现JavaScript调用Java方法。 总结来说,DWR是一个强大的工具,使得Web开发者可以方便地构建AJAX应用,实现JavaScript与Java后台的无缝交互,提高用户体验。...

    Asp.net中JQuery、ajax调用后台方法总结

    在 Asp.net 中,使用 jQuery 和 Ajax 调用后台方法是一种常见的做法。下面总结了几种常见的调用方法。 有参数的方法调用 在前台使用 jQuery 代码调用后台方法时,需要将参数传递给后台方法。示例代码如下: ```...

    jQuery+get/post+Ajax+Json

    4. JSON字符串与JSON对象的转换:在JavaScript中,我们可以使用`JSON.stringify()`方法将JavaScript对象转换成JSON字符串,以便通过Ajax发送;而`JSON.parse()`方法则用于将接收到的JSON字符串解析成JavaScript对象...

    AjaxJson 实例 AjaxJson

    AjaxJson 是一种在 Web 应用程序中实现异步数据交换的技术,它结合了 AJAX(Asynchronous JavaScript and XML)和 JSON(JavaScript Object Notation)的优势,使得网页可以在不刷新整个页面的情况下与服务器进行...

    asp.net 利用jquery-ajax调用后台方法

    在ASP.NET的C#或VB.NET代码中,我们可以创建一个静态的WebMethod,标记为 `[WebMethod]` 或 `[ScriptMethod]`,以便可以从JavaScript直接调用。例如: ```csharp [WebMethod] public static string HelloWorld...

    JS调用C#后台方法

    本文将深入探讨如何使用JavaScript调用C#编写的后台方法,并介绍相关技术与实践。 首先,JavaScript作为客户端脚本语言,运行在用户的浏览器上,而C#通常是服务器端的语言,运行在Web服务器上。要实现它们之间的...

    ajax和JavaScript分别调用Webservice实例

    通过深入学习这三个示例,你可以熟练掌握Ajax和JavaScript调用WebService的基本方法,这对于开发实时交互的Web应用具有极大的价值。实践这些实例,将有助于你更好地理解和运用这些技术,提升你的Web开发技能。

    前台JS(Jquery)调用后台方法

    总的来说,"前台JS (Jquery) 调用后台方法"涉及了JQuery库中的AJAX功能,以及如何利用这些功能创建无刷新的级联菜单。通过理解这些概念和技术,开发者可以构建更高效、响应更快的前端应用,提高用户体验。

    ajax 解析json数据

    在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许页面在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。JSON(JavaScript Object Notation)是一种轻量级的...

    ZTree+Struts2+ajax+json实现checkbox权限树

    【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...

    java+ajax+json+jquery完整实例

    在IT行业中,Java、Ajax、JSON和jQuery是四个非常关键的技术元素,它们在构建现代Web应用程序时发挥着重要作用。这个“java+ajax+json+jquery完整实例”提供了一个实际的应用场景,展示了如何将这些技术有效地结合在...

    springMVC+ajax+json

    Spring MVC、Ajax 和 JSON 是现代Web开发中的关键技术,它们共同构建了高效、动态的用户界面。下面将详细解释这三个技术及其在实际应用中的结合。 **Spring MVC** Spring MVC 是 Spring 框架的一部分,用于构建基于...

    ajax返回json对象.zip

    "Ajax返回JSON对象"这个主题聚焦于Ajax如何处理JSON(JavaScript Object Notation)数据格式,这是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。 1. **Ajax基础**: - **异步通信**:...

    根据经纬度对离线地图进行标点示例(用Ajax调用后台接口返回Json数据)

    在本示例中,我们将探讨如何使用经纬度坐标在离线地图上标注点,并通过Ajax调用后台接口来获取Json数据。这个过程涉及到的技术栈包括Java、JavaScript、OpenLayers、HTML和CSS,这些都是构建Web地图应用的关键技术。...

Global site tag (gtag.js) - Google Analytics