`
touchmm
  • 浏览: 1001967 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

《JavaScript高级应用与实践》中的JSON-RPC for java的升级和独立使用

阅读更多

凡是购买《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中的日期串

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics