1. 相关介绍:
<servlet>
<servlet- name>CommonHttpServlet</servlet- name>
<servlet-class>
com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.CommonHttpServlet
</servlet-class>
<load-on-startup>3</load-on- startup>
</servlet>
<servlet-mapping>
<servlet- name>CommonHttpServlet</servlet- name>
<url-pattern>/CMHS</url-pattern>
</servlet-mapping>
package com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Test {
/**
* 一般对象
* @param m
* @return
*/
public Object myCbkTest(Map m)
{
List lst = new ArrayList();
lst.add(new String[]{"牧仁", "之", "数据压缩传输", "创新"});
lst.add(new int[]{1,1,6,0,2,0,1,1});
return lst;
}
/**
* 行流方式
* @param m
* @param cbk
* @throws Exception
*/
public void myCbkTestRow(Map m, IRowHandler cbk) throws Exception
{
List lst = new ArrayList();
lst.add(new String[]{"牧仁2", "之", "数据压缩传输", "创新"});
lst.add(new int[]{1,1,6,0,2,0,1,1});
if(null != cbk)
for(int i = 0; i < lst.size(); i++)
cbk.handleRow(lst.get(i));
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new ObjectToJSON(new Test()).toJSON());
}
}
3.2 JSP
<%@ page pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%><!DOCTYPE html><html><head><base href="<%=basePath%>">
<title>XtZPStream框架使用演示(demo)</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"></head><body>
<script charset=UFF-8 src=XtZPStream.js></script>
<script>
// 指定上下文路径,必须的,没有的上下文的时候就是空串""
var contextPath = "<%=path%>";
var XtZPS = XtZPStream(contextPath);
var k, cbk = function(o)
{
o || (o = {});
var k;
for(k in o)
alert(k + " = " + o[k]);
}, log = function(s)
{
var oT = document.getElementById("myLog");
oT.innerText = s + "\n" + oT.innerText;
};
function fnTest()
{
XtZPS.setLogCbk("log");
XtZPS.readStm(
{ name:"牧仁",
QQ:11602011,
age:"9ZB",
a: {b:[1234,34,33,34]}, /* 复杂对象传递测试*/
/* 回调java方法,并返回结果,入口参数为: public Object myCbkTest(Map m) */
xtStreamCbk: "com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test.myCbkTest"
}, cbk, contextPath);
}
function fnTestRow()
{
XtZPS.setLogCbk("log",false);
XtZPS.readStm(
{ name:"牧仁",
QQ:11602011,
age:"9ZB",
a: {b:[1234,34,33,34]}, /* 复杂对象传递测试*/
/* 回调java方法,并返回结果,入口参数为: public void myCbkTestRow(Map m, IRowHandler cbk) throws Exception */
xtStreamCbkRow: "com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test.myCbkTestRow"
}, cbk, contextPath);
}
/*
Rpc调用演示
1、指定类名,获取该类的JS映射对象
2、在回调中使用、调用该类的方法(属性)
*/
function Test3()
{
XtZPS.setLogCbk("log",false);
// 指定类名和回调函数,必须用回调的方式,否则无法得到和类同名的对象Test,只有在回调里才能确保正确获得这个对象
XtZPS.getRpcObj("com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test", function(o)
{
/*//和下面的方法效果一样/
o.myCbkTest({data:"表单数据"}, function(p)
{
for(var k in p)alert(k + " = " + p[k]);
});
/*/
Test.myCbkTest({data:"表单数据"}, function(p)
{
for(var k in p)alert(k + " = " + p[k]);
});
});
}
</script>
<button οnclick=fnTest()>一般对象的发送、调用java、返回对象(List)</button>
<button οnclick=fnTestRow()>一般对象的发送、调用java、逐行返回对象(List)</button>
<button οnclick=Test3()>rpc</button>
<div id="myLog"></div></body>
</html>
3.3 JS API
// 指定上下文路径,必须的,没有的上下文的时候就是空串""
var contextPath = "<%=path%>";
var XtZPS = XtZPStream(contextPath);
1、XtZPS.nextId(); // 生成一个唯一的字符串id
2、XtZPS.getRpcObj(s,myCbk);
-------------------------------------------------------------
s 类名,例如:"com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test"
-------------------------------------------------------------
myCbk 回调函数,有一个入参,是指定类转换为js的对象,例如:
function(o)
{
/*//和下面的方法效果一样/
o.myCbkTest({data:"表单数据"}, function(p)
{
for(var k in p)alert(k + " = " + p[k]);
});
/*/
Test.myCbkTest({data:"表单数据"}, function(p)
{
for(var k in p)alert(k + " = " + p[k]);
});
}
3、XtZPS.readStm(o, fnCbk, ctx);
-------------------------------------------------------------
o 传递到后台的复杂js对象,例如:
{ name:"牧仁",
QQ:11602011,
age:"9ZB",
a: {b:[1234,34,33,34]}, /* 复杂对象传递测试*/
/* 回调java方法,并返回结果,入口参数为: public Object myCbkTest(Map m) */
xtStreamCbk: "com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test.myCbkTest"
}
xtStreamCbk用于指定要回调的java类名:(com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test)和方法(myCbkTest)
其中方法定义、入参要求是:
// 入参要去是Map
public Object myCbkTest(Map m)
{
List lst = new ArrayList();
lst.add(new String[]{"牧仁", "之", "数据压缩传输", "创新"});
lst.add(new int[]{1,1,6,0,2,0,1,1});
return lst;
}
另外:
/* 回调java方法,并返回结果,入口参数为: public void myCbkTestRow(Map m, IRowHandler cbk) throws Exception */
xtStreamCbkRow: "com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.Test.myCbkTestRow"
用来指定基于流的方式输出行流对象,并逐行回调js方法,方法的定义要求
public void myCbkTestRow(Map m, com.rmUzWqQrYQmyYvFT1de0faT7JWvJJ3Ja.IRowHandler cbk) throws Exception
{
List lst = new ArrayList();
lst.add(new String[]{"牧仁2", "之", "数据压缩传输", "创新"});
lst.add(new int[]{1,1,6,0,2,0,1,1});
if(null != cbk)
for(int i = 0; i < lst.size(); i++)
cbk.handleRow(lst.get(i));// 这里逐行输出数据
}
-------------------------------------------------------------
fnCbk 回调函数,具有一个入口参数,是异步返回的对象,例如:
var k, cbk = function(o)
{
o || (o = {});
var k;
for(k in o)
alert(k + " = " + o[k]);
};
-------------------------------------------------------------
ctx 当前应用上下文路径,没有时为"",例如:var ctx = "<%=request.getContextPath()%>";
项目网站:http://code.google.com/p/json-rpc-for-java/
下载地址:http://json-rpc-for-java.googlecode.com/files/XtZPStream_demo_V1.0.rar
本文是转载自:http://www.iteye.com/news/22527