1. 相关介绍: 1.1 是什么 是一个基于flash、java、js架构设计的超轻量级RPC框架。 1.2 特点是什么 1、JS2Java RPC:能够在javascript的web浏览器环境中指定java类,获取该类实例的属性,调用该实例的方法 2、支持复杂js对象作为入参:能够传递复杂的JavaScript Object对象作为调用参数,在java中得到对应的Map对象 3、自动压缩、解压传递 ...
1. 相关介绍:
1.1 是什么
是一个基于flash、java、js架构设计的超轻量级RPC框架。
1.2 特点是什么
1、JS2Java RPC:能够在javascript的web浏览器环境中指定java类,获取该类实例的属性,调用该实例的方法
2、支持复杂js对象作为入参:能够传递复杂的JavaScript Object对象作为调用参数,在java中得到对应的Map对象
3、自动压缩、解压传递的数据:调用过程中传递的数据自动进行压缩传输,后台自动解压,然后转换为Map给开发人员;因此从一定层面上保护、加密了传输的数据
4、JS回调函数中能够接收java返回的复杂对象:java中可以返回复杂的对象,比如Map、List,在javascript中对应为Object和Array
5、友好逐行数据输出并回调:java中可以将List逐行输出到浏览器中,框架每接收到一条数据,能够自动回调给定的javascript方法,从而实现数据流的逐行输出;该接口继承与“com.ibatis.sqlmap.client.event.RowHandler”因此很容易将ibatis的数据流逐行输出给浏览器,从而实现非常友好的数据加载方式
6、支持回调全异步(观察者模式):所有的过程调用都采用异步方式,可以指定回调函数,用来接收返回的对象,并进行其他处理
7、日志回调:L异步过程可以设置日志回调函数,让你掌控全过程
1.3 包含什么
包含:
XtZPStream.swf:V1.0:25KB,flash文件
XtZPStream_1.0.jar:655 KB,java服务端jar
XtZPStream.js:3.69 KB,
jsp中使用的代码片段:未压缩,大约2.61 KB
1.4 应该注意什么
XtZPStream和json-rpc-for-java都要求UTF-8字符集---js代码
1.5 下载地址是什么
http://code.google.com/p/json-rpc-for-java/downloads/list
1.6 依赖什么
依赖的jar【2.36 MB】:
backport-util-concurrent.jar
commons-httpclient-3.0.1.jar
jgroups.jar
2 web.xml配置
仅仅需要在Web.xml中配置,http://code.google.com/p/json-rpc-for-java/上的两个RPC框架都是,只需要简单的配置.
XtZPStream 在web.xml中的配置:
<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>
3 如何使用
3.1 Java
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="http://www.iteye.com/news/<%=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=http://www.iteye.com/news/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 onclick=fnTest()>一般对象的发送、调用java、返回对象(List)</button> <button onclick=fnTestRow()>一般对象的发送、调用java、逐行返回对象(List)</button><button onclick=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)
其中方法定义、入参要求是:
// 入参要去是Mappublic 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
声明:本文内容来源自网络,文字、图片等素材版权属于原作者,平台转载素材出于传递更多信息,文章内容仅供参考与学习,切勿作为商业目的使用。如果侵害了您的合法权益,请您及时与我们联系,我们会在第一时间进行处理!我们尊重版权,也致力于保护版权,站搜网感谢您的分享!