用jabsorb(json) for java编写AJAX应用程序

简介:
jabsorb 是一种基于Ajax/Web 2.0 的简单轻便的框架,可用于在Web 浏览中通过HTTP 请求向服务端发送请求,并获得响应数据。实际上jabsorb 就是json 的升级版(不仅改了个名,而且包名都改了),目前最新版本是1.3
老版本的json 可以从 http://oss.metaparadigm.com/jsonrpc/download.html 下载。
jabsorb 可以从http://jabsorb.org/Download 下载。
jabsorb json 基础上有了很大的改进,从1.2 版开始支持ORB 和循环引用(Circular References )。使用jabsorb 至少有以下两个好处:

1. 
jabsorb 中已经支持IE, Mozilla , Firefox , Safari , Opera, Konqueror  等浏览器,因此,使用jabsorb 编写的AJAX 程序也就可以跨不同的Web 浏览器。
2.  使用jabsorb 在客户端和服务端传递数据非常方便。在客户端可以象使用本地对象一样使用服务端的对象。

     下面我们就来看一下如何使用jabsorb 来编写基于AJAX Web 程序。本文使用Tomcat6.x 作为Web 服务器,读者可以根据需要使用其他的Web 服务器。

一、jabsorb的安装
安装jabsorb 需要如下几步:

1 步:加入jar
jabsorb 需要三个jar 包:jsonrpc-1.0.jar jsonrpc-1.0.jar slf4j-api-1.4.2.jar ,这三个文件都可以在jabsorb 的压缩包中找到。将这三个文件放到<Tomcat 安装目录>"lib 目录中,或是放到<Web 根目录>"WEB-INF"lib 目录中。
2 步:配置web.xml
     打开 <Web 根目录 >\WEB-INF\web.xml ,并加入如下的配置代码:

   < servlet >
    
< servlet-name > JSONRPCServlet </ servlet-name >
    
< servlet-class > org.jabsorb.JSONRPCServlet </ servlet-class >
   
    
< init-param >
      
< param-name > gzip_threshold </ param-name >
      
< param-value > 0 </ param-value >
    
</ init-param >
  
</ servlet >
  
< servlet-mapping >
    
< servlet-name > JSONRPCServlet </ servlet-name >
    
< url-pattern > /JSON-RPC </ url-pattern >
  
</ servlet-mapping >

这段代码配置了一个jabsorb 引擎,实际上就是一个Servlet (和Struts1.x 类似,也是通过Servlet 作为入口的)。其中gzip_threshold 可以取-1 0 和一个正整数。如果值为-1 ,表示不会对响应的内容进行压缩,如果为0 ,表示对响应的所有内容进行压缩,如果为一个正整数,表示当响应内容超过这个整数时, 进行压缩。
但当浏览器不支持gzip 压缩格式,或是经过压缩后的尺寸要比不压缩的尺寸还大时(当响应内容比较少时可能发生这种情况),jabsorb 就不会对响应内容进行压缩。因此,最好将这个值设为0 ,但这样做所付出的代价是可能会对所有的响应内容进行压缩。具体要设成什么值,读者可根据自己的具体情况决定。
3   jsonrpc.js 复制到<Web 根目录>\script 中,读者也可以将其放到<Web 根目录> 中的其他可访问的位置。这个文件也可以在jabsorb 的压缩包中找到。

二、编写一个简单的jabsorb应用程序

1 编写一个用客户端访问的 Java 类。

package  invoke;

public   class  Message  implements  java.io.Serializable
{
    
public  String getMessage(String s)
    {
        
return   " 你好   "   +  s;
    }    
}

2    编写 JSP 代码
<!--[if !supportLineBreakNewLine]--><!--[endif]-->


<% --   index.jsp   -- %>

<% @ page language = " java "  import = " java.util.* "  pageEncoding = " GB18030 " %>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
    
< head >
< script  type ="text/javascript"  src ="script/jsonrpc.js" ></ script >
< script  type ="text/javascript" >
function  onLoad()
{
    jsonrpc 
=   new  JSONRpcClient( " JSON-RPC " );
}
window.onload 
=  onLoad;

function  invoke()
{
    
var  text  =  document.getElementById( " text " );
    
var  result  =  jsonrpc.msg.getMessage(text.value);
    alert(result);
}
</ script >
< jsp:useBean  id ="JSONRPCBridge"  scope ="session"
   class
=" org.jabsorb.JSONRPCBridge "   />
< jsp:useBean  id ="message"  scope ="session"  
     class
="invoke.Message"   />
<%  
JSONRPCBridge.registerObject(
" msg " , message);
%>
</ head >
 
    
< body >
    
< input type = " text "  id = " text " />
    
< input type = " button "  value = " 获得信息 "  onclick = " invoke() "   />         
    
</ body >
</ html >

在这个jsp 文件中需要做如下四件事才能调用getMessage 方法。
1          引用jsonrpc.js 文件。
2          onLoad 函数中创建JSONRpcClient 对象。JSONRpcClient 类的构造方法的参数值就是在web.xml 中配置的JSON-RPC
3          使用<jsp:userBean> 创建了org.jabsorb. JSONRPCBridge invoke.Message 对象
4          使用JSONRPCBridge registerObject 方法注册Message 类,其中第一个参数可以是任意的字符串(这个参数是注册名),第二个参数是Message 对象实例。registerObject 方法可以对同一个注册名使用多次,但后一个将覆盖前一个对象。
在做完上述工作后,就可以使用jsonrpc.msg.getMessage 来调用getMessage 方法了。
三、在Servlet中使用 jabsorb

    
除了在 JSP 中使用 jabsorb 外,也可以在 Servlet 中使用它。代码如下:

public   void  service(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException
    HttpSession session 
=  request.getSession();
    JSONRPCBridge bridge 
=  (JSONRPCBridge) session.getAttribute( " JSONRPCBridge " );
    if (bridge  ==   null )
    {
        bridge 
=   new  JSONRPCBridge();
        session.setAttribute(
" JSONRPCBridge " , bridge);
    }
    bridge.registerObject(
" msg " , message);
     
}

从上面的代码可以看出,在Servlet 中使用jabsorb ,实际上就是使用registerObject 方法来注册Message 类。然后可以forward 到使用jabsorb JSP 页面,也可以使用PrintWriter 在当前Servlet 中输出相应的javascript html 代码。
四、注册全局对象

    
使用registerObject 注册的对象只能在当前页面访问。如果想注册一次,就可以任何运行在当前Web 服务器的页面(JSP HTML 等)中使用这个对象,就需要使用如下的代码来注册Message 对象:

 JSONRPCBridge.getGlobalBridge().registerObject( " globalMsg " , message);

     读者可以将上面的相应代码换成这行代码,然后另建立一个 test.jsp ,然后使用如下的代码调用 getMessage 方法:


< script type = " text/javascript "  src = " script/jsonrpc.js " ></ script >
< script type = " text/javascript " >
try
{
    jsonrpc 
=   new  JSONRpcClient( " JSON-RPC " );
    //  如果将globalMsg换成msg,将抛出[object error]错误
     var  result  =  jsonrpc.globalMsg.getMessage( " bill " );
    alert(result);
 }
catch (e)
{
  alert(e);
}
</ script >

但经笔者测试,在firefox 中访问test.jsp ,竟然可以访问msg 对象,但在IE 里就会抛出对象错误异常。
    
五、访问集合类型

    
如果反回的数据很多的话,可以使用 Java 提供的集合类型,如将 Message 因扩展为如下形式:

package  invoke;

public   class  Message  implements  java.io.Serializable
{
    
public  String getMessage(String s)
    {
        
return   " 你好   "   +  s;
    }
    
public  java.util.List getList()
    {
        java.util.List list 
=   new  java.util.LinkedList();
        list.add(
" 中国 " );
        list.add(
1234 );
        
return  list;
    }
    
    
public  java.util.Map getMap()
    {
        java.util.Map map 
=   new  java.util.HashMap();
        map.put(
" bird " " " );
        map.put(
" human " " 人类 " );
        
return  map;
    } 
}

index.jsp 中可加入如下的代码来访问 getList getMap 方法中的数据:

<script type="text/javascript">
jsonrpc = new JSONRpcClient("JSON-RPC");
alert(jsonrpc.globalMsg.getList().list[1]);
    alert(jsonrpc.globalMsg.getMap().map['bird']);
</script>

六、异步调用

    
上面的代码都是同步调用,也就是在反回结果之前,客户端程序会被阻塞。为了在网络环境不畅的环境下Web 程序仍然能运行良好,这就需要进行异步调用。也就是说,客户端在发送请求后立即返回,直接服务端返回信息,才会调用另一个“回调函数”来获取结果。
回调函数必须有两个参数,第一个参数表示返回值,第二个参数表示异常信息。如果无异常信息,第二个参数值为null 。下面是一个回调函数:

function  asyc(result,e)
{
    if (e  ==   null )
        alert(result);
}

可以使用下面的代码以异步方式来调用getMessage 方法:

    jsonrpc.msg.getMessage(asyc, 'bill');
从上面的代码可以看出,异步调用和同步调用的区别就是异步调用需要将回调函数作为方法的第一个参数传入被调用的方法。后面跟着被调用方法的参数值。






 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215327,如需转载请自行联系原作者

相关文章
|
9月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
211 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
8月前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
1225 12
|
10月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1061 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
10月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
141 4
|
11月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
660 0
在Java中处理JSON数据:Jackson与Gson库比较
|
11月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
337 1
|
12月前
|
JSON Java fastjson
java小工具util系列3:JSON和实体类转换工具
java小工具util系列3:JSON和实体类转换工具
199 2
|
12月前
|
存储 缓存 监控
Java——图片文件位于 bin 目录下,下载新图片会导致应用程序重启
【9月更文挑战第22天】在Java应用中,若图片位于bin目录下且下载新图片导致应用重启,可能是因为部署方式不当或资源监控机制过于敏感。解决方法包括:更改图片存储位置至独立目录;配置应用服务器减少资源监控敏感度;使用独立资源服务器托管静态资源;优化代码减少资源重复加载。具体方案需根据应用实际情况和技术栈调整。
120 3
|
12月前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
438 2
|
10月前
|
存储 JSON 监控
公司用什么软件监控电脑:JSON 在监控信息交互中的应用探索
在现代企业管理中,电脑监控软件广泛应用于保障信息安全和提升工作效率。JSON(JavaScript Object Notation)因其简洁和易读性,在监控信息的收集、传输和处理中扮演着关键角色。本文介绍了 JSON 在监控数据结构、信息传输及服务器端处理中的具体应用,展示了其在高效监控系统中的重要性。
108 0