1. 在jabsorb中已经支持IE, Mozilla , Firefox , Safari , Opera, Konqueror 等浏览器,因此,使用jabsorb编写的AJAX程序也就可以跨不同的Web浏览器。
一、jabsorb的安装
第1步:加入jar包
<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>
第1步编写一个用客户端访问的Java类。
public class Message implements java.io.Serializable
{
public String getMessage(String s)
{
return "你好 " + s;
}
}
第2步 编写JSP代码
<!--[if !supportLineBreakNewLine]--><!--[endif]-->
<%@ 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中使用jabsorb外,也可以在Servlet中使用它。代码如下:
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);

}
使用registerObject注册的对象只能在当前页面访问。如果想注册一次,就可以任何运行在当前Web服务器的页面(JSP、HTML等)中使用这个对象,就需要使用如下的代码来注册Message对象:
读者可以将上面的相应代码换成这行代码,然后另建立一个test.jsp,然后使用如下的代码调用getMessage方法:
<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>
五、访问集合类型
如果反回的数据很多的话,可以使用Java提供的集合类型,如将Message因扩展为如下形式:
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方法中的数据:
jsonrpc = new JSONRpcClient("JSON-RPC");
alert(jsonrpc.globalMsg.getMap().map['bird']);
上面的代码都是同步调用,也就是在反回结果之前,客户端程序会被阻塞。为了在网络环境不畅的环境下Web程序仍然能运行良好,这就需要进行异步调用。也就是说,客户端在发送请求后立即返回,直接服务端返回信息,才会调用另一个“回调函数”来获取结果。
{
if(e == null)
alert(result);
}
jsonrpc.msg.getMessage(asyc, 'bill');
















