`
zhufanamo
  • 浏览: 4318 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

基于json-rpc的对象绑定

阅读更多
从这个ibm上了解了json-rpc的简单使用
http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0606_barcia/0606_barcia.html

看完文档后json-rpc还是蛮好用的。可以很简单的实现服务暴露.屏蔽http , 类似spring的rmiServiceExport功能
java 代码
 
  1. //server端的服务注册 
  2. ....
  3. json_bridge = new JSONRPCBridge();
  4. json_bridge.registerObject("StockService",StockServiceImpl.getStockService());  
  5.   
  6.   
  7. //client端的rpc 调用  
  8. var jsonrpc = new JSONRpcClient("/FormBinder/JSON-RPC");  
  9. jsonrpc.StockService.setStockData(saveStockData,stock);  

如何用上面的网站上都有说

开发中大部分都是做对象的管理
而对象管理基本上是两种类型,
对象的批量管理  用table
单对象的管理  用form ,
table是很统一的方式,
而form则大都是定制化的,但form 是做单对象管理的,则表单上所表现的元素必然是与对象的属性一一对应的,只是表现形式不同


这里利用js的动态性及json-rpc的调用模型,在上面的示例的基本上 实现一个简单的对象绑定,类似spring mvc的绑定机制

需要被绑定的类如下
java 代码
 
  1. public class StockData implements Serializable {  
  2.     private String symbol;  
  3.   
  4.     private double price;  
  5.   
  6.     private String companyName;  
  7.       
  8.     private User user;  
  9.   
  10.     private List users;  
  11. }  

服务模型如下
java 代码
 
  1. public interface StockService {  
  2.     public StockData getStockData(String symbol) throws StockException;  
  3.   
  4.     public void setStockData(StockData data);  
  5. }  


页面的表单代码如下
这里的input ,select 等html元素都对应着StockData对象的某个属性
并且需要为这几个元素加上自定义的绑定属性.
例如
<input  fieldName="symbol"  id="symbolInput">  这里的自定义的属性fieldName ,这个元素对应着StockData的symbol属性
xml 代码
 
  1. <div class="stockPane"  id="pane"  >  
  2.            <h2>Stock Servive</h2>  
  3.            Enter symbol: <input fieldName="symbol"  id="symbolInput">  
  4.            <p/>  
  5.            Enter price: <input fieldName="price"  id="priceInput">  
  6.            <p/>  
  7.            Enter companyName: <select fieldName="companyName" id="companyName" >  
  8.                                   <option>IBM</option>  
  9.                                <option>BEA</option>  
  10.                                <option>MSFT</option>  
  11.                            </select>  
  12.            <p/>  
  13.            Enter userName: <input fieldName="user.name"  id="user.name">  
  14.            <p/>  
  15.            Enter userAge: <input fieldName="user.age"  id="user.age">  
  16.            <p/>  
  17.            Enter users: <select fieldName="users" id="users" multiple="true" >  
  18.                           <option>aaa</option>  
  19.                           <option>bbb</option>  
  20.                           <option>ccc</option>  
  21.                      </select>  
  22.            <p/>  
  23.            <button onclick="submitStock()">Save Stock Data</button>  
  24.            <p/>  
  25.            <button onclick="showStock()">Show Stock Data</button>  
  26.    </div>  

submitStock ()  事件 要做的是 把UI数据绑定到对象 再设到StockService.setStockData 中

showStock() 事件是从 StockService中取得相应的data 对象,再绑定到ui 上

通过
事先约订好的表单绑定契约,由FormBinder这个类来完成对象绑定的功能 ,减少js,及拼装json对象的代码

java 代码
 
  1.          var binder = new FormBinder();  
  2.           binder.resolvers["s1"]= new MultipleSelectResolver();  
  3.           binder.resolvers["s2"]= new SelectResolver();  
  4.             
  5.           var jsonrpc = new JSONRpcClient("/FormBinder/JSON-RPC");  
  6.   
  7.          function submitStock()  
  8.         {  
  9.             var stock = binder.bindUIToData("pane");  
  10.                           jsonrpc.StockService.setStockData(saveStockData,stock);  
  11.         }  
  12.           
  13.         function saveStockData(result,exception){  
  14.         }  
  15.           
  16.         function showStock() {  
  17.             jsonrpc.StockService.getStockData(showStockData,"IBM");  
  18.            
  19.         }  
  20.           
  21.         function showStockData(result,exception) {  
  22.                 binder.bindDataToUI("pane",result);  
  23.         }  


FormBinder
支持的元素只有input  及两种select
input 是内部默认支持, 当然你也可以覆盖掉
select是需要注册的
java 代码
 
  1. var binder = new FormBinder();  
  2. binder.resolvers["s1"]= new MultipleSelectResolver();   //名字随便起不冲突就可以了  
  3. binder.resolvers["s2"]= new SelectResolver();  

也可以实现自已的resolver 
InputResolver为例
js 代码
 
  1.  1. function InputResolver(){    
  2.  2.     this.tagName="input";  // 要被解析的tagName  
  3.  3. }   
  4.  4. //根据给定的fieldValue对象,为相应的widget赋值    
  5.  5. InputResolver.prototype.setWidgetValue = function(widget,fieldValue){    
  6.  6.                     widget.value = fieldValue;    
  7.  7. }   
  8.  8. //把widget的值赋给相应的data对象,  
  9.  9. InputResolver.prototype.setObjectValue = function (widget,data,fieldName){    
  10. 10.                 data[fieldName] = widget.value;    
  11. 11. }   
  12. 12. // 判断widget是否为空  
  13. 13. InputResolver.prototype.isEmpty = function (widget){    
  14. 14.                 return widget.value =="";    
  15. 15. }    
分享到:
评论
4 楼 zjh0588 2007-08-13  
可以给个简单的例子我看看吗? 我看了好久都没参透出来.
就是DOJO + JSON + MYSQL 的数据传送例子,简单的登陆程序就可以.
我是刚学DOJO的,以前没学过框架,请问可以把个简单的例子发到我邮箱吗?
zjh0588@gmail.com

3 楼 crystalchao 2007-04-04  
这么好的东西怎么没人来顶啊..
2 楼 pangyi 2007-01-16  
老兄,不错!
1 楼 jbla 2006-12-29  
代码变少了,结构简单了,可以有时间泡妞了!

相关推荐

    json-rpc-python

    这些方法会被绑定到特定的URL路径,当JSON-RPC请求到达时,服务器会解析请求并调用相应的函数。 3. **客户端接口**:在客户端,你可以创建一个JSON-RPC客户端对象,用于向服务器发送请求并接收响应。客户端通常会...

    Json-RPC & Spring MVC 集成

    1. **添加依赖**:在项目中引入JSON-RPC的库,如jsonrpc4j,同时确保Spring MVC的相关依赖。 2. **创建JSON-RPC服务**:定义一个实现了JSON-RPC协议的服务类,其中的方法将作为远程调用的接口。 3. **配置Spring MVC...

    java 使用json-rpc

    JSON-RPC for Java是一种基于JSON(JavaScript Object Notation)协议的远程过程调用(Remote Procedure Call)框架,它允许客户端通过网络调用服务器上的方法,实现了客户端与服务器端的轻量级通信。本文将详细解释...

    c/c++ json-rpc demo

    了解了这些基本概念和步骤后,你可以根据提供的`json-rpc.rar`和`jsonrpc.rar`文件进行学习和实践。这些文件可能包含了示例代码,帮助你更好地理解C和C++中JSON-RPC的具体实现细节。通过阅读源代码、编译和运行示例...

    simple-json-rpc:Java的简单JSON-RPC

    简单的JSON-RPC 一个用于将协议简单集成到Java应用程序的库。... Jackson ,非常适合JSON解析和数据绑定; Guava ,非常适合缓存和可选值(仅服务器端需要) SL4J ,这是日志记录的标准(仅服务器需要) Int

    v-jsonrpc:用V编写的基本JSON-RPC 2.0兼容服务器

    V-JSONRPC 0.2现在与协议无关,这意味着它不再与一个协议绑定,并且可以按其他方式使用,例如STDIN,TCP,UDP等。提供的输入是字符串。 安装 VPM v install nedpals.jsonrpc vpkg get v-jsonrpc 例子 此代码示例...

    jsonrpc:Rust 中的 JSON-RPC 实现

    JSON-RPC 实现这是 JSON-RPC 规范的实现,完全用 Rust 编写。 实现很简单,但目前缺少很多功能。去做: 实现批量调用当前实现绑定到 。 找到一种解耦它的方法,以便可以使用替代的 HTTP 库。 添加示例。 添加更多...

    jsonrpc.lua:使用 lsocket 实现 jsonrpc 请求的 web 服务器

    在"jsonrpc.lua"项目中,我们利用 lsocket 来创建一个监听特定端口的服务器,处理来自客户端的 JSON-RPC 请求。 首先,我们需要理解 JSON-RPC 的基本概念。JSON-RPC 2.0 标准规定了请求和响应的格式,其中请求包含...

    java-rpc远程过程调用

    4. **序列化(Serialization)**:将Java对象转化为网络可传输的数据格式,如JSON、protobuf等。 5. **反序列化(Deserialization)**:将接收到的网络数据还原为Java对象。 6. **网络通信(Network Communication)...

    origo-json-rpc-document:此项目可以创建origo网络rpc文档

    Slate可帮助您创建美观,智能,响应Swift的API文档。 上面的示例是使用Slate创建的。 在检查。特征简洁,直观的设计—使用Slate,API的描述位于文档的... 用多种语言编写代码示例—如果您的API具有多种编程语言的绑定

    liboqs (Open Quantum Safe) 的Rust绑定和密钥交换,一个用于抗量子加密算法的库

    oqs-kex-rpc- JSON-RPC 2.0 服务器和客户端通过oqs. mullvad-wg-establish-psk- 用于通过wireguard 隧道协商wireguard 兼容的预共享密钥的服务器和客户端程序。此密钥稍后可用于将隧道升级为后量子安全。

    Laravel开发-laravel-gearman-rpc

    这个库提供了一个Laravel服务提供者和服务容器绑定,使得在Laravel框架内使用Gearman变得更加方便。 ** 安装与配置 ** 首先,你需要通过Composer安装`mhlavc/gearman`库: ```bash composer require mhlavc/...

    Silverlight学习和json

    JSON基于JavaScript的一个子集,但它的语法不限于JavaScript,而是被广泛应用于各种编程语言中。JSON支持数据类型如字符串、数字、布尔值、数组、对象等,可以表示复杂的数据结构。 与XML相比,JSON通常被认为更...

    Python-Cplus-Rpc

    Python有许多RPC框架可供选择,如xmlrpc、jsonrpc、gRPC和zerorpc等。在Python-Cplus-Rpc的场景中,ZeroMQ可能是首选,因为它的性能强大且灵活,能支持多种协议,包括请求/响应模式,发布/订阅模式,以及点对点模式...

    分布式 RPC 框架 zerorpc-node.zip

    这种协议通常基于JSON-RPC,它允许客户端发送一个包含方法名和参数的JSON对象到服务器,服务器执行该方法并返回结果。zerorpc-node提供了一种简单的方式来定义和实现这些协议,使得服务的部署和调用变得轻松。 具体...

    Apache Avro RPC简单示例

    Avro的数据模型基于JSON,包括记录(Record)、枚举(Enum)、数组(Array)、映射(Map)、固定值(Fixed)和基本类型(如字符串、整数等)。这些数据结构允许Avro在不同的编程语言之间进行无缝的数据交换。 Avro ...

    网络连接服务开发人员参考库(第3卷)RPC与Wnet

    5. **数据编码**:RPC使用特定的数据表示格式,如XML-RPC或JSON-RPC,以便在网络上传输数据。 6. **错误处理**:当远程调用失败时,RPC框架会提供一套标准的错误处理机制。 7. **实现**:多种编程语言都有RPC实现,...

    protoc生成gin的插件

    而Gin是一个基于Go语言的Web框架,它提供了高效的路由和中间件管理,使得构建API和服务变得简单。将protoc与Gin结合,可以通过protoc生成的接口直接服务于HTTP请求,提高开发效率和代码质量。 标题"protoc生成gin的...

    HessionRPC调用代码示例.zip

    1. **高性能**:Hession采用二进制协议,相比于基于文本的协议如XML-RPC或JSON-RPC,它的传输效率更高。 2. **易用性**:Hession可以直接序列化和反序列化Java对象,使得服务接口的实现和调用非常简单。 3. **兼容性...

    C++ Rpc远程计算

    可以是自定义的二进制协议,也可以是基于HTTP、JSON-RPC或gRPC等标准协议。协议定义了消息的结构,包括方法名、参数、返回值等信息的编码规则。 5. **多线程/异步处理**:为了提高效率,服务器端可能需要使用多线程...

Global site tag (gtag.js) - Google Analytics