jabsorb是一种基于Ajax/Web2.0的简单轻便的框架,可用于在Web浏览中通过HTTP请求向服务端发送请求,并获得响应数据。

 

1.jabsorb的安装

引用:jabsorb-1.2.2.jarslf4j-api-1.4.2.jarslf4j-jdk14-1.4.2.jarjsonrpc.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可以取-10和一个正整数。如果值为-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);
    }      
}


源码

 


posted on 2010-12-15 23:37  菊次郎  阅读(365)  评论(0)    收藏  举报