学习了Swato之后,受到启发,对Zigzag Chen的代码作了点修改,写了个适合自己的RPC Engine:
简单的测试代码:
- // imports dependencies:
- GRS.loadJS("../jslib/3rdparty/prototype.js");
- GRS.loadJS("../jslib/3rdparty/json.js");
- Ext.namespace("GRS.rpc");
- /**
- * Constructor of GRS.rpc.Engine
- * @param url
- * @param options
- * @author Zhijie Chen <zigzag.chen@gmail.com>
- * @author Sam Chen (inspired by Zigzag Chen's swato-engine.js)
- * @version 1.0 11/22/2007
- */
- GRS.rpc.Engine = function(url,options) {
- this.url = url;
- this.conn_id = Math.floor(Math.random()*100000000);
- this.options = options;
- GRS.rpc.Engine.superclass.constructor.call(this)
- }
- Ext.extend(
- GRS.rpc.Engine,
- Ext.util.Observable,
- {call: function(catcher,serviceDotMethodName,params,options) {
- if ( this.url == null ) return;
- var serviceId=serviceDotMethodName.substring(0,serviceDotMethodName.indexOf("."));
- var methodName=serviceDotMethodName.substring(serviceDotMethodName.indexOf(".")+1,serviceDotMethodName.length);
- var option=new Object();
- Object.extend(option,options);
- option.onComplete=this._onRequestComplete.bind(catcher);
- new Ajax.Request(this.url+"/"+serviceId, this._requestOptions(serviceId.hashCode||serviceId,methodName,params,option));
- },
- fetch: function(catcher,url,options) {
- if ( url == null ) return;
- var option=new Object();
- Object.extend(option,options);
- option.onComplete=this._onRequestComplete.bind(catcher);
- new Ajax.Request(url,option);
- },
- send: function(catcher,jsObject,remoteObjectID,options) {
- this.call(catcher,remoteObjectID,'',[jsObject],options);
- },
- _requestOptions: function(remoteObjectID,methodName,params,options) {
- var sendingData={
- "params":params,
- "method":methodName,
- "id":remoteObjectID,
- "conn_id":this.conn_id};
- var requestOptions=new Object();
- Object.extend(requestOptions,this.options);
- Object.extend(requestOptions,options);
- requestOptions.parameters=JSON.stringify(sendingData);
- return requestOptions;
- },
- _onRequestComplete : function(response) {
- if (response.status != 200) {
- return;
- }
- eval("var error = " + response.responseText.error);
- if (error!=undefined) {
- if (this.failure!=null) {
- // call the failure handler
- this.failure.apply(this, [error]);
- } else {
- alert("Warning from rpc.js : Error occurred and no error handler defined.");
- }
- } else {
- if (this.success!=null){
- // call the success handler:
- this.success.apply(this, [response.responseText]);
- }
- }
- }
- }
- );
- // global rpcengine
- rpcengine=new GRS.rpc.Engine("/RPCServlet");
简单的测试代码:
- <script type="text/javascript" charset="UTF-8" src="../../3rdparty/ext-2.0-beta1/adapter/ext/ext-base.js"></script>
- <script type="text/javascript" charset="UTF-8" src="../../3rdparty/ext-2.0-beta1/ext-all.js"></script>
- <script type="text/javascript" charset="UTF-8" src="../grsframework-core.js"></script>
- <script type="text/javascript" charset="UTF-8" src="../rpc.js"></script>
- <script>
- var handler={
- success:function(ret){
- alert("testRPC.html :: Result :: " + ret);
- },
- failure:function(err){
- alert("Err occurred : " + err);
- }
- };
- window.onload = function() {
- alert("testing rpcengine...");
- rpcengine.call(handler,"userManager.getUserList",[]);
- }
- </script>