假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...

【原创】用jabsorb(json) for java编写AJAX应用程序

上一篇 / 下一篇  2008-07-04 11:10:16 / 个人分类:web

本文为原创,如需转载,请注明作者和出处,谢谢!
\:PW&L0FGXJ3z f+k*Q0
\dtS;RKL in0

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至少有以下两个好处:ITPUB个人空间P8]*f#bw3?8U

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

2. 使用jabsorb在客户端和服务端传递数据非常方便。在客户端可以象使用本地对象一样使用服务端的对象。
9[\0F r/\0
d8^#q4_](X0

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

ITPUB个人空间,yv0k\$nW.`Y(yG6{
一、jabsorb的安装

安装jabsorb需要如下几步:ITPUB个人空间"E CF7M1It,Q

3G3Tpn!d'M.I3u8B$@-G0
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,并加入如下的配置代码:
lcne N0ITPUB个人空间oAs0D~Cg7w9L
  <servlet>
:m m7u8F;IO0    
<servlet-name>JSONRPCServlet</servlet-name>
QGW6`$x*jb0    
<servlet-class>org.jabsorb.JSONRPCServlet</servlet-class>
S%?&b;eUd5z-Dwn0   
M s)e7\.YVN0    
<init-param>
i#iGPXod1VE0      
<param-name>gzip_threshold</param-name>
D-_'oWQk9a bfB9r0      
<param-value>0</param-value>ITPUB个人空间j]4~YQ_T
    
</init-param>
ps]p#T0  
</servlet>
7? v+r@t Um\1cB0  
<servlet-mapping>ITPUB个人空间5zlM/Fix)F
    
<servlet-name>JSONRPCServlet</servlet-name>ITPUB个人空间mE{6^,QP K(|
    
<url-pattern>/JSON-RPC</url-pattern>
L*PC9Zf!F3d0  
</servlet-mapping>
PI)u)nJ0

0S bH8q\ n'F(e0

这段代码配置了一个jabsorb引擎,实际上就是一个Servlet(和Struts1.x类似,也是通过Servlet作为入口的)。其中gzip_threshold可以取-10和一个正整数。如果值为-1,表示不会对响应的内容进行压缩,如果为0,表示对响应的所有内容进行压缩,如果为一个正整数,表示当响应内容超过这个整数时,进行压缩。

但当浏览器不支持gzip压缩格式,或是经过压缩后的尺寸要比不压缩的尺寸还大时(当响应内容比较少时可能发生这种情况),jabsorb就不会对响应内容进行压缩。因此,最好将这个值设为0,但这样做所付出的代价是可能会对所有的响应内容进行压缩。具体要设成什么值,读者可根据自己的具体情况决定。

3jsonrpc.js复制到<Web根目录>"script中,读者也可以将其放到<Web根目录>中的其他可访问的位置。这个文件也可以在jabsorb的压缩包中找到。ITPUB个人空间,}GE#C,v5V
ITPUB个人空间8h#UD})A%e6Hb&~x#M

二、编写一个简单的jabsorb应用程序ITPUB个人空间7|8j.vWk _2q~

y`2O(g}h$@"E0
1编写一个用客户端访问的Java类。ITPUB个人空间D!U&Br B%?7L*I
ITPUB个人空间:zHP7|Gh u
package invoke;ITPUB个人空间 tXw?(C iYz
ITPUB个人空间%a s0Wznl`+m4z
public class Message implements java.io.Serializable
f2gh'^$u3hb7i0{
)H [ OUX Q9Ov0    
public String getMessage(String s)
Fc[!C*Ek.n0    {
\/O(J3IH^Am_0        
return "你好  " + s;ITPUB个人空间-F:tUH9kpz2C
    }    ITPUB个人空间!k$Q$O'D |c}8bB
}
*O iUhA9~F-DB B0

:R1Fs|c0
2 编写JSP代码ITPUB个人空间J2na w Kq]YBo

:Z0@ `i7_:n O1v0
%O!d I9} iN0
<%--  index.jsp  --%>ITPUB个人空间4sG#Q9Z6|@
ITPUB个人空间5n2qWH ]3Am
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>ITPUB个人空间$o4a~/P"OQO

+U+dE8S4jB0
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
`rkcj1O}L r0
<html>
ZG1qS`R'a3Zp:Cz0    
<head>
Cjgib3T0
<script type="text/javascript" src="script/jsonrpc.js"></script>ITPUB个人空间6~%C,S `"@&j
<script type="text/javascript">ITPUB个人空间w @ c OzYW*F
function onLoad()ITPUB个人空间%VK:e'}-}q VwI3]
{
9Ql~5jAL]#g0    jsonrpc 
= new JSONRpcClient("JSON-RPC");
B!QdQ"?6T$a#YeYE!@0}ITPUB个人空间$[-za(L&RZ
window.onload 
= onLoad;ITPUB个人空间:d/}0@)VX-|j%^

0A9j/N-gT$R2A0
function invoke()ITPUB个人空间 w'DdYStBb
{ITPUB个人空间s4A5g7}C
    
var text = document.getElementById("text");
B SM|-_@X2?[0    
var result = jsonrpc.msg.getMessage(text.value);
n8EAOqx Q8fu0    alert(result);
`S6]*i ^DX0}ITPUB个人空间 ?Nq/M#gj4ko
</script>ITPUB个人空间guS[8BZQ1?
<jsp:useBean id="JSONRPCBridge" scope="session"
[2@T7t?0F~0   class
=" org.jabsorb.JSONRPCBridge " />ITPUB个人空间8T2_P!At,o2FP j
<jsp:useBean id="message" scope="session" 
6Rdr'Z Kc3A'W0     class
="invoke.Message" />ITPUB个人空间;wu"x{8T_U
<% ITPUB个人空间*]t9` ^!g _ss5w
JSONRPCBridge.registerObject(
"msg", message);
{n8}W&_ t0%》ITPUB个人空间;S x3n|F(zRg
</head>ITPUB个人空间*?x'fK&_ f!`,dsV
 
HhKm8W0    
<body>ITPUB个人空间X$wC"~1g%C0SA
    
<input type="text" id="text"/>
&LNe$Nvg0    
<input type="button" value="获得信息" onclick="invoke()" />        
a]y%Gg0    
</body>ITPUB个人空间 rd%IW d T
</html>
d8y0R F2Va+RJ|0

2B Ol0eN'g.yd4}0

在这个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
r6?/X-x Q*rA0ITPUB个人空间]3C#CF e%[
   
除了在JSP中使用jabsorb外,也可以在Servlet中使用它。代码如下:ITPUB个人空间i*^y3K7ev#e pp9ZUx
ITPUB个人空间D;S,N.nv0zs@,y
public void service(HttpServletRequest request, HttpServletResponse response)
F&AI:~#p:V*Br0            
throws ServletException, IOException
q*WH#k Zh | s0    HttpSession session 
= request.getSession();
)~ O?-Wr%@S0    JSONRPCBridge bridge 
= (JSONRPCBridge) session.getAttribute("JSONRPCBridge");ITPUB个人空间7u%Mq'{/PF
    if(bridge == null)
`"K5E7U5u.@f0    {
XYO&u*w w0K0        bridge 
= new JSONRPCBridge();
+Mt)c @s/^0        session.setAttribute(
"JSONRPCBridge", bridge);
},jM5^3b uKe,l0    }ITPUB个人空间 V s0rdY9Bq
    bridge.registerObject(
"msg", message);ITPUB个人空间ZEZQW\:m
    ITPUB个人空间4[3g5zK]E
}
;\$q+GSi |7}1Oq0

:a_/?nJRA0

从上面的代码可以看出,在Servlet中使用jabsorb,实际上就是使用registerObject方法来注册Message类。然后可以forward到使用jabsorbJSP页面,也可以使用PrintWriter在当前Servlet中输出相应的javascripthtml代码。

四、注册全局对象
)ZeF$Z8Bc]4]3U0ITPUB个人空间:y.U u5pEcbd
   
使用registerObject注册的对象只能在当前页面访问。如果想注册一次,就可以任何运行在当前Web服务器的页面(JSPHTML等)中使用这个对象,就需要使用如下的代码来注册Message对象:
"Q6l+U)kpyEQ7a/F0
ITPUB个人空间;WN]~1G | ]]%N

 JSONRPCBridge.getGlobalBridge().registerObject("globalMsg", message);
ITPUB个人空间}5a@M9v
   读者可以将上面的相应代码换成这行代码,然后另建立一个test.jsp,然后使用如下的代码调用getMessage方法:ITPUB个人空间%S._-O/l4?

S F'Q%c?,x0ITPUB个人空间@.b*h-M\F+\8}
<script type="text/javascript" src="script/jsonrpc.js"></script>ITPUB个人空间y?k'{L hn
<script type="text/javascript">ITPUB个人空间N Z)}3HP;G&Y zL.e
tryITPUB个人空间Ap*FDY`
{ITPUB个人空间l ~7N }i$^cJG
    jsonrpc 
= new JSONRpcClient("JSON-RPC");ITPUB个人空间n LMK8j1M8?$`v
    // 如果将globalMsg换成msg,将抛出[object error]错误ITPUB个人空间B GV RQD1|$Ei
    var result = jsonrpc.globalMsg.getMessage("bill");
t$\K V!D4G"W0    alert(result);ITPUB个人空间)iJz YR8Z;l {gw&y
 }ITPUB个人空间/t)I| \o+_n0FBj f
catch(e)
4T\CX:p!r0{ITPUB个人空间u'GS G4F
  alert(e);ITPUB个人空间\W1n#xx5S
}
b%r.j(e^Hj1Z6x$u0
</script>
Pz(~\ F"TS;kw0

Ej!ea&bS Rn0

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

   ITPUB个人空间Q+I/E_ k^Y1_%` z+N
五、访问集合类型ITPUB个人空间I.]B6L6H8?
ITPUB个人空间`;l/P9HAb
   
如果反回的数据很多的话,可以使用Java提供的集合类型,如将Message因扩展为如下形式:ITPUB个人空间Wh6i*B8i`
ITPUB个人空间}}dC9ai
package invoke;ITPUB个人空间z7E8j/z.\ENE
ITPUB个人空间"cQ/tC5sy*w
public class Message implements java.io.SerializableITPUB个人空间U.I4]ei ?4g"?%u
{ITPUB个人空间~eU2]Z4s
    
public String getMessage(String s)ITPUB个人空间'v5w5fE]
    {ITPUB个人空间hz }@){*Y }L
        
return "你好  " + s;
Y#ksgf?/n0    }ITPUB个人空间)f:m.c&}!C9pc
    
public java.util.List getList()ITPUB个人空间T+k{7[$xr8y
    {ITPUB个人空间cN2Id"T7P
        java.util.List list 
= new java.util.LinkedList();
]w bS%}5F0        list.add(
"中国");ITPUB个人空间}:y*fO/t9v
        list.add(
1234);ITPUB个人空间d?!_j9]dqY A \
        
return list;
$KkCJ-v V3X*IaA0    }
DxP}/Js'K0    ITPUB个人空间)q!j;UA MQQpU
    
public java.util.Map getMap()
X8xu` HQ0    {ITPUB个人空间`[ ~~|B0C&C'P
        java.util.Map map 
= new java.util.HashMap();ITPUB个人空间b!_.Q0K*s_Q
        map.put(
"bird""");
qB?;^X3Fi0        map.put(
"human""人类");
"e^]7u8mE``B%^0        
return map;ITPUB个人空间3` w:cb6^{?cI
    } 
Y \pdG-` _D&s0}ITPUB个人空间_x:w#k:tu
ITPUB个人空间w'X jVA`*YX
index.jsp中可加入如下的代码来访问getListgetMap方法中的数据:
Q4Y`)a4O!hs l}0ITPUB个人空间I!`e._9fi^c1U h

<script. type="text/javascript">
?:VI?Dgh Z%c0jsonrpc = new JSONRpcClient("JSON-RPC");

alert(jsonrpc.globalMsg.getList().list[1]);
y3^ d6Q c/wa0   alert(jsonrpc.globalMsg.getMap().map['bird']);

</script>ITPUB个人空间(RyUj] XV3]Gr7Z

u5YM#BmR_C,B0

六、异步调用
7E t:e~*CB `"@D0ITPUB个人空间J*xj)~-_5E
   
上面的代码都是同步调用,也就是在反回结果之前,客户端程序会被阻塞。为了在网络环境不畅的环境下Web程序仍然能运行良好,这就需要进行异步调用。也就是说,客户端在发送请求后立即返回,直接服务端返回信息,才会调用另一个“回调函数”来获取结果。

回调函数必须有两个参数,第一个参数表示返回值,第二个参数表示异常信息。如果无异常信息,第二个参数值为null。下面是一个回调函数:
DMC8pesp0ITPUB个人空间6v%b g;Z3iu

function asyc(result,e)
1Z|y`(v+A0{ITPUB个人空间X&V3jc(V7a'V1T
    if(e == null)
F%H} d P0T:B0        alert(result);
P5d)ZPF:n1I%^zq0}ITPUB个人空间!`4N-fz aJk

ITPUB个人空间 Z#LQ eu T2E

可以使用下面的代码以异步方式来调用getMessage方法:ITPUB个人空间GA;G8HCk4Ld

kWv,YW'y%n C0    jsonrpc.msg.getMessage(asyc, 'bill');

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


TAG: ajax java web

引用 删除 Guest   /   2009-04-06 14:00:20
-5
引用 删除 Guest   /   2008-09-26 15:46:02
5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2009-07-05  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 37305
  • 日志数: 197
  • 建立时间: 2008-02-08
  • 更新时间: 2009-06-17

RSS订阅

Open Toolbar