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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! jabsorb是一种基于Ajax/Web 2.0的简单轻便的框架,可用于在Web浏览中通过HTTP请求向服务端发送请求,并获得响应数据。
本文为原创,如需转载,请注明作者和出处,谢谢!

jabsorb是一种基于Ajax/Web 2.0的简单轻便的框架,可用于在Web浏览中通过HTTP请求向服务端发送请求,并获得响应数据。实际上jabsorb就是json的升级版(不仅改了个名,而且包名都改了),目前最新版本是1.3

老版本的json可以从http://oss.metaparadigm.com/jsonrpc/download.html下载。

jabsorb可以从http://jabsorb.org/Download下载。

jabsorbjson基础上有了很大的改进,从1.2版开始支持ORB和循环引用(Circular References)。使用jabsorb至少有以下两个好处:

1. 
jabsorb中已经支持IE, Mozilla , Firefox , Safari , Opera, Konqueror 等浏览器,因此,使用jabsorb编写的AJAX程序也就可以跨不同的Web浏览器。

2. 使用jabsorb在客户端和服务端传递数据非常方便。在客户端可以象使用本地对象一样使用服务端的对象。

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


一、jabsorb的安装

安装jabsorb需要如下几步:

1步:加入jar

jabsorb需要三个jar包:jsonrpc-1.0.jarjsonrpc-1.0.jarslf4j-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可以取-10和一个正整数。如果值为-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 代码


<% --   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. JSONRPCBridgeinvoke.Message对象

4         使用JSONRPCBridgeregisterObject方法注册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到使用jabsorbJSP页面,也可以使用PrintWriter在当前Servlet中输出相应的javascripthtml代码。

四、注册全局对象

   
使用registerObject注册的对象只能在当前页面访问。如果想注册一次,就可以任何运行在当前Web服务器的页面(JSPHTML等)中使用这个对象,就需要使用如下的代码来注册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');

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




国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

目录
相关文章
|
29天前
|
JSON 程序员 数据格式
深入探索 “JSON for Modern C++“:安装、构建与应用
深入探索 “JSON for Modern C++“:安装、构建与应用
35 0
|
1月前
|
JSON 前端开发 JavaScript
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
1月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
25 0
|
1月前
|
存储 Java
Java:编写程序,计算两个数的和、差、积、商和余数。docx
Java:编写程序,计算两个数的和、差、积、商和余数。docx
|
20天前
|
JSON JavaScript 前端开发
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(中)
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(中)
|
12天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
33 3
|
5天前
|
XML JSON 前端开发
|
15天前
|
XML JSON JavaScript
Java中XML和JSON的比较与应用指南
本文对比了Java中XML和JSON的使用,XML以自我描述性和可扩展性著称,适合结构复杂、需验证的场景,但语法冗长。JSON结构简洁,适用于轻量级数据交换,但不支持命名空间。在Java中,处理XML可使用DOM、SAX解析器或XPath,而JSON可借助GSON、Jackson库。根据需求选择合适格式,注意安全、性能和可读性。
24 0
|
20天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。