jabsorb是一种基于Ajax/Web2.0的简单轻便的框架,可用于在Web浏览中通过HTTP请求向服务端发送请求,并获得响应数据。
1.jabsorb的安装
引用:jabsorb-1.2.2.jar,slf4j-api-1.4.2.jar,slf4j-jdk14-1.4.2.jar,jsonrpc.js
2.配置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,表示对响应的所有内容进行压缩,如果为一个正整数,表示当响应内容超过这个整数时,进行压缩
3.开始第一个json-rpc程序:
3.1配置文件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>
<listener>
<listener-class>
test.listener.AlexSessionListener
</listener-class>
</listener>
3.2 第一个bean:
public class TestJabsorb implements Serializable {
private static final long serialVersionUID = 1L;
public String getMessage(String s) {
return "你好:" + s;
}
public String getMessage() {
return "没有值;
}
public String getMessage(List al) {
String res = "list参数 :";
for (Iterator it = al.iterator(); it.hasNext();) {
Object next = it.next();
res += next + ",";
}
return res;
}
public String getMessage(String[] array) {
String res = "数组:";
for (int i = 0; i < array.length; i++) {
res += array[i] + ",";
}
return res;
}
public String getMessage(Map map) {
String res = "map参数:“;
Set entrySet = map.entrySet();
for (Iterator it = entrySet.iterator(); it.hasNext();) {
Object next = it.next();
res += next + ",";
}
return res;
}
public String getMessage(Test2 t2) {
String res = "Test2(bean)参数 :“;
res += t2.p1 + ",";
res += t2.p2 + ",";
return res;
}
public Test2 getMessage2() {
Test2 res = new Test2();
res.p1 = "11";
res.p2 = "22";
return res;
}
public List getList() {
List list = new LinkedList();
list.add("中国");
list.add(new Integer(1234));
return list;
}
public Map getMap() {
Map map = new HashMap();
map.put("bird", "鸟);
map.put("human", "人类");
return map;
}
}
3.3 index.jsp:
在<head>部分加入
<script type="text/javascript" src="script/jsonrpc.min.js"></script>
正文:
<script type="text/javascript">
try
{
jsonrpc = new JSONRpcClient("JSON-RPC");
var result = jsonrpc.alex.getMessage("alex");
alert(result);
result = jsonrpc.alex.getMessage();
alert(result);
//list parameter
result = jsonrpc.alex.getMessage({"javaClass":"java.util.ArrayList",'list':['h1','h2','h3']});
alert(result);
//bean parameter
result = jsonrpc.alex.getMessage({'javaClass':"test.Test2",p1:11,p2:22});
alert(result);
//bean return value
result = jsonrpc.alex.getMessage2();
alert(result.p1+'_'+result.p2);
//list return
result = jsonrpc.alex.getList().list;
alert(result.length);
//map return
result = jsonrpc.alex.getMap().map;
alert(result["bird"]);
alert(result["human"]);
//asynchronized call
function callback(result,exception){
if(exception==null){
alert(result);
}
}
result = jsonrpc.alex.getMessage(callback, "vicky");
alert(result);
}
catch(e)
{
alert(e);
}
</script>
3.4session listener:
public class AlexSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
JSONRPCBridge bridge = (JSONRPCBridge) session
.getAttribute("JSONRPCBridge");
if (bridge == null) {
bridge = new JSONRPCBridge();
session.setAttribute("JSONRPCBridge", bridge);
}
bridge.registerObject("alex", new TestJabsorb());
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
}
}
一些注意项:
1. 由于json对象注册是在session级别上注册的, 所以, 最好写一个HttpSessionListener
2. 至于session销毁的时候是否需要反注册, 待考虑
3. 默认都是同步调用的, 为了在网络环境不畅的环境下Web程序仍然能运行良好,这就需要进行异步调用。回调函数必须有两个参数,第一个参数表示返回值,第二个参数表示异常信息。如果无异常信息,第二个参数值为null。一个回调函数sample:
function callback(result,exception){
if(exception==null){
alert(result);
}
}
浙公网安备 33010602011771号