凡是购买《JavaScript高级应用与实践》(电子工业出版社.夏天著)的读者,可以获得JSON-RPC for java的独立使用版本和升级服务,我已经从书的jcore框架中剥离出来,并通过一些项目中对JSON-RPC的java部分核心代码进行了优化。
该版本独立后,提取出的js代码大约88行代码,更加简练和高效,并独立完成json-rpc级联调用的功能。
优化和独立的js部分代码如下:
/*
* 版权所有归《JavaScript高级应用与实践》(电子工业出版社.博文视点)的作者所有
* V1.2
* */
function JsonRpcClient(url)
{
url || (url = ("undefined" === typeof contextPath ? "." : contextPath) + "/JRPC");
if (this === window)
return JsonRpcClient._cache || (JsonRpcClient._cache = new JsonRpcClient(url));
this["url"] = url;
var _this = this, obj = {}, bind = function (f, o) {
return function () {
return f.apply(o, arguments)
}
}, _A = function (p) {
var r = [], i = 0, j = p.length;
for (; i < j; i++)
r.push(p[i]);
return r
}, AJAX = function (o) {
if (window === this)
return new AJAX(o);
var _this = this;
if (this.xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest()) {
this.xml.open("POST", o.url, o.bAsync, "", "");
this.xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
this.xml.setRequestHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Alexa Toolbar; Maxthon 2.0)");
this.xml.onreadystatechange = function () {
if (4 === _this.xml.readyState)
200 === _this.xml.status && o.clbkFun && o.clbkFun(_this.xml.responseText), delete _this.xml.onreadystatechange, delete _this.xml;
};
this.xml.send(o.data || "")
}
};
AJAX({url:url, bAsync:false, clbkFun:function ()
{
try{eval("obj = " + arguments[0])}catch (e) {}
}});
obj = obj.result;
var fnRpcCall = function ()
{
var params = _A(arguments), cbk = params[0], bAsync = "function" === typeof (cbk || ""), oRst = {};
bAsync && params.shift();
AJAX({url:this.url, bAsync:bAsync, data:"{\"method\":\"" + this.methodName + "\",id:\"" + this.id + "\",\"params\":" + (function (arg) {
var b = [], szTp;
for (var i = 0; i < arg.length; i++)
{
if ("number" === (szTp = typeof arg[i]) || "boolean" === szTp)
b.push(arg[i]);
else b.push("\"" + (arg[i] || "").toString().replace(/([\r\n\t\b\f"])/gm, "\\$1") + "\"");
}
return "[" + b.join(",") + "]"
})(params) + "}", clbkFun:function ()
{
try {
eval("var oTmp = " + arguments[0]);
if (null != oTmp && "object" === typeof oTmp) {
if (Array === (oTmp["constructor"] || "")) {
oRst = [];
for (var i = 0; i < oTmp.length; i++)
if ("object" === typeof oTmp[i])
_this.fnMakeObj(oTmp[i], oRst[i] = {});
else oRst[i] = oTmp[i];
} else _this.fnMakeObj(oTmp, oRst);
} else oRst = oTmp;
bAsync && cbk.apply(oRst, [oRst])
}catch (e){}
}});
return oRst
};
this.fnMakeObj = function (o, oRstObj)
{
var oT = oRstObj;
o.name && (oT = (oRstObj[o.name] = {}));
for (var k in o)
{
if ("methods" === k)
{
for (var i = o[k].length - 1; i >= 0; i--)
oT[o[k][i]] = bind(fnRpcCall, {url:_this.url, methodName:o[k][i], id:o.id});
delete o[k]
}
else
{
if ("object" === o[k]['constructor'])
o[k]["name"] = k, _this.fnMakeObj(o[k], oT);
else oT[k] = o[k]
}
}
};
for (var i = 0; i < obj.length; i++)
this.fnMakeObj(obj[i], _this)
}
测试代码如下:
MyTest.java
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jcore.jsonrpc.common.JSONRPCBridge;
import jcore.jsonrpc.common.ObjectToJSON;
public class MyTest {
public static void main(String[] args) {
Map map = new HashMap();
map.put("myDate", new Date(3324432));
map.put("ObjectArray", new Object[]{new Integer(32424443), "good01", "xiatian"});
List lst = new ArrayList();
lst.add("my first String");
map.put("MyList", lst);
lst.add("the last data");
lst.add(new MyJsonRpc());
ObjectToJSON obj = new ObjectToJSON(map, new JSONRPCBridge());
System.out.println(obj.toJSON(null));
}
输出:
{"myDate":new Date(3324432),"ObjectArray":[32424443,"good01","xiatian"],"MyList":["my first String","the last data",{"methods":["getMyDate","setMyDate","setRequest","getRequest","hashCode","toString"],"serialVersionUID":-8438114499990113268,"myDate":"2008-02-01",id:"4932403"},id:"-72092030"],id:"1200751969"}
浏览器中调用代码(我们假定上面的红色部分的代码注册为myMap):
var oRpc = JsonRpcClient();
// myMap为注册的对象
var aTmp = oRpc.myMap["ObjectArray"]; // 得到数组
var szTmp = oRpc.myMap["MyList"][2]["myDate"]; // Map中List中的日期串
var szTmp = oRpc.myMap["MyList"][2]["myDate"]; // Map中List中的日期串
分享到:
相关推荐
基于java的贝儿米幼儿教育管理系统答辩PPT.pptx
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
基于java的消防物资存储系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便
使用软件自带的basic脚本编辑制作的脚本 低版本软件无法输出Excel报告,可以通过脚本方式实现这一功能
基于java的就业信息管理系统答辩PPT.pptx
25法理学背诵逻辑.apk.1g
基于java的大学生校园兼职系统答辩PPT.pptx
做到代码,和分析的源数据
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
适用于ensp已经入门人群的学习,有一定难度
基于java的数码论坛系统设计与实现答辩PPT.pptx
tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl
基于java的医院信管系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
tornado-4.2.tar.gz
链表 合并两个链表,链表基础操作