`

Ajax框架Buffalo深度研究

阅读更多

Buffalo深度研究

——2010.01.11IT进行时[MSN:zhengxianquan AT hotmail Dot com]

目录

1. BUFFALO概述 2
1.1. 主要产品特性 2
1.2. 初次印象 5
2. BUFFALO的关键序列图 5
3. BUFFALO的协议分析 6
3.1. 概述 6
3.2. 请求[BUFFALO.CALL]协议定义 8
3.3. 响应[BUFFALO.RESPONSE]协议定义 8
3.3.1. List-数组或列表 8
3.3.1.1. List 8
3.3.1.2. Array 9
3.3.2. Map & POJO 9
3.3.3. Ref对象引用 10
3.4. FAULT异常 11
3.5. 其他 12
3.5.1. java.sql.Date 12
3.5.2. java.math.BigDecimal/ java.math.BigInteger 12
3.5.3. 还不够? 13
4. 核心类分析 13
4.1. 概述 13
4.2. SERVICE 14
4.2.1. 服务注册与初始化 14
4.2.2. 服务的匹配与调用 18
4.3. PROTOCOL 21
4.3.1. converters(类型转换解析器) 21
4.3.2. io(协议marshal/unmarshal) 22
5. 协议可能需要完善的专题讨论 26
5.1. 深度分析 26
5.2. 可能的解决方案 27
5.2.1. 在ProtocalTag中加入新协议标签 27
5.2.2. 定义两个工具类 28
5.2.2.1. PrimitiveObjectWrapper 28
5.2.2.2. PrimitiveObjectUtil 28
5.2.3. 新增转换器PrimitiveDoubleConverter 29
5.2.4. 修改DoubleConverter的协议标签类型 30
5.2.5. 注册转换器到DefaultConverterLookup 30
5.2.6. 修订FastStreamReader 33
5.2.7. 完善BuffaloCall 33
5.2.8. 客户端buffalo.js 34
5.3. 测试结果 35
6. 参考 36

 

1.  Buffalo概述

Buffalo一个贯穿前后端的比较完整的Ajax框架,目前最新的版本是2.0.1,其主页是:

http://buffalo.sourceforge.net/,可通过该页面找到下载。

不过该版本自2007年来就没有更新了,有点遗憾,不管怎样,一出来就关注到了,早前通读过代码,是个好作品。

上周开始用了些零碎的时间,重新评估并进行了深入的研究,其目的在于通过深度掌握某个优秀的贯穿前后端的AJAX框架,以提高自己的整体认知感。

1.1.      主要产品特性

略,可参考:http://buffalo.sourceforge.net/features.html

1.2.      初次印象

Buffalo最有价值之处,个人感觉有两点:

1、  后端实现了较为完整的基于xmlxml<->object序列化反序列化协议;

2、  前端提供了适配协议的调用封装和响应解析机制,并基于回调机制提供编码API

 

另,作品受xstream影响颇深,如果看过xstream的代码大家的感觉会更明显,不知道这样说Michael是否有意见:buffalo后端转换器、IO部分的代码,是xstreamlightweight版本:)

分享到:
评论
25 楼 chenhailong 2010-12-22  
了解中,希望能用到。。。谢谢
24 楼 itstarting 2010-12-20  
martintree 写道
lz 能否将这些内容做一个文档可以提供下载啊,因为这个排版实在是不整齐,而且 图也不清晰。先谢谢了

呵呵,这位老兄,论坛就是用来讨论并加上娓娓道来的咯

如果你真有兴趣学Buffalo,不妨也帮忙整理下?
23 楼 martintree 2010-12-16  
lz 能否将这些内容做一个文档可以提供下载啊,因为这个排版实在是不整齐,而且 图也不清晰。先谢谢了
22 楼 antipro 2010-07-30  
其实最喜欢buffalo的数据绑定功能,其他倒没觉得什么。
21 楼 andot 2010-01-22  
如果只关注RPC,还是PHPRPC和Hprose好,不但可以Java和Js互通,还可以在各种其它常用语言之间进行互通。而且使用更高效的序列化格式,运行和开发效率都很高。
20 楼 itstarting 2010-01-22  
类似

但从两者的使用经历来看,如果仅关注RPC,还是Buffalo好:
1、DWR由于是通过动态生成js stub,不支持同服务类下的同名方法;
2、DWR的js stub,感觉很不好,性能上应该有一定的影响

当然,Buffalo目前功能还相对单一,提升的空间还不少啊
19 楼 cuixiping 2010-01-22  
功能应该是类似于DWR吧
18 楼 taochenpfj 2010-01-13  
ding!这么多,支持!
17 楼 itstarting 2010-01-13  
xinnn 写道
Buffalo有js内存泄漏,1.2有2.0好像也没有改过来,但我们自己做了一些小的修正问题不大,很不错的框架


客户端反倒研究不多,可否不吝赐教?
16 楼 xinnn 2010-01-12  
Buffalo有js内存泄漏,1.2有2.0好像也没有改过来,但我们自己做了一些小的修正问题不大,很不错的框架
15 楼 itstarting 2010-01-12  
mootools我不了解,刚刚好奇看了一下,感觉这是一个纯客户端的框架,感觉是又一个prototype or jquery

Buffalo在定位上不一样,我的理解是:有完善XML自定义协议的贯穿前后的Ajax框架。

其客户端是基于prototype做了简单的自我封装

当然,其扩展性现在还有问题,应该也是作者努力的方向之一吧
14 楼 mycybyb 2010-01-12  
我在项目中用mootools写了20行代码,模拟了一下Buffalo的接口,然后把它扔了
13 楼 kimmking 2010-01-12  
这样一个框架,大概做的就是
定义一套交互的协议报文,调用接口的约定,
然后就是对象的序列化,反序列化,基本类型和bean的协议转换,
包装成其他格式生成stub或代理
都是些细致的工作
12 楼 itstarting 2010-01-11  
Michael,看到你的回帖还真有点激动,群里喊话了两次都毫无反应,心里还真咯噔了下

对primitive的尝试,可能是对DWR积怨过深所致:)无非也是一种学习研究的方法



有时间,我会考虑下实现基于json的协议,前端尝试下用jQuery(主要是前段时间翻了翻jquery in action,觉得也还不错)


还请多指导!
11 楼 mechiland 2010-01-11  
感谢itstarting的精辟分析。

对于原子类型、包装类型的处理,主要的考虑在于是不是实用。从系统边界的角度来说,你不会希望看到同一个service中同时存在divide(double, double)和divide(Double, Double)吧。

PS. 看了一下,近3年前你在分析,现在又捡起来分析了……算算自从你那时到现在,buffalo也没怎么更新了
10 楼 itstarting 2010-01-11  
DWR我2.0.3用在了两个项目,一个是基于internet的项目tuanzi.com,一个是企业内部产品研发项目

这个版本对于后端不能重名方法调用比较忌惮,开始不明白,等搞清楚机制后就知道怎么回事了,其push部分也尝试过,还好。

但在不少地方,感觉还不如Buffalo精致,但文档、包装什么的,却是更胜一筹,不知道新版本如何。

国内人员维护的开源代码,往往难以善终,跟国内开发人员的生存发展环境有关,前几天看了看Michael的blog,对他所提到的困惑深有同感

这篇研究文档,本来想跟他进行必要的沟通确认后再发布的,但发了两封邮件都无法联系到,也不知道他是在忙还是邮箱地址有误了。
9 楼 kimmking 2010-01-11  
第一次了解Buffalo,
跟我的rpcfx很像,不过我的还没有成型,
最近一次大的改动,已经跑不起来了
:)
http://code.google.com/p/rpcfx/

旧的版本 实现了java .net服务器、客户端的互相调用


都有dwr的影子。
8 楼 golddragon 2010-01-11  
我们的应用中用到了buffalo,不错,国产的ajax框架,只是2.0之后就不再更新了
7 楼 itstarting 2010-01-11  
<h2 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983422"><span style="" lang="EN-US"><span style=""><span style="font-size: large;">5.3.</span><span style='font: 7pt "Times New Roman";'>      </span></span></span><span style=""><span style="font-size: large;">测试结果</span></span></a></h2>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">输入:</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;"><br><img src="http://dl.iteye.com/upload/attachment/191470/ced4ea83-a24f-35b1-a38e-f34c63332426.jpg" alt=""><br> </span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">提交:</span></span></p>
<table class="MsoTableGrid" style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0"><tbody><tr style="">
<td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 426.1pt; padding-top: 0cm; background-color: transparent;" width="568" valign="top">
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 0cm;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;buffalo-call&gt;</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 0cm;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;method&gt;divide&lt;/method&gt;</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 0cm;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;double&gt;1.1&lt;/double&gt;</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 0cm;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;double&gt;2.2&lt;/double&gt;</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 0cm;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;/buffalo-call&gt;</span></span></p>
</td>
</tr></tbody></table>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">结果:</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="">)日志:</span></span></p>
<table class="MsoTableGrid" style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0"><tbody><tr style="">
<td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 426.1pt; padding-top: 0cm; background-color: transparent;" width="568" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 0cm; line-height: normal; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">2010-1-11 13:25:40 net.buffalo.demo.simple.SimpleService divide</span><span style='font-size: 10pt; font-family: "Courier New";' lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 0cm;"><span style="">信息</span><span style='font-size: 10pt; color: black; line-height: 120%; font-family: "Courier New";' lang="EN-US">: Calling Divide in divide(double a, double b),a=1.1, b=2.2</span></p>
</td>
</tr></tbody></table>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="">)界面:</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;"> <br><img src="http://dl.iteye.com/upload/attachment/191469/248a49e8-5063-3b91-82a9-4f8325ce83df.png" alt=""><br> <br> </span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">OK</span></span><span style="">,正是我们想要的。</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">当然了,还有两点需要说明:</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="">)其他的诸如</span><span lang="EN-US"><span style="font-family: Times New Roman;">Float</span></span><span style="">等</span><span lang="EN-US"><span style="font-family: Times New Roman;">Primitive</span></span><span style="">类型的处理,照葫芦画瓢即可;</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="">)客户端</span><span lang="EN-US"><span style="font-family: Times New Roman;">buffalo.js</span></span><span style="">还应该有少量的完善工作,重点在于类型的处理上,应该考虑的更周全些。</span></span></p>
<h1 style="margin: 24pt 0cm; text-indent: 0cm;"><a name="_Toc250983423"><span style="" lang="EN-US"><span style="">6.<span style='font: 7pt "Times New Roman";'>  </span></span></span><span style="">参考</span></a></h1>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">一、</span><span lang="EN-US"><span style="font-family: Times New Roman;">Buffalo</span></span><span style="">官方网站:</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt 21pt; text-indent: 21pt;"><span lang="EN-US"><a href="http://buffalo.sourceforge.net/"><span style="font-size: small; font-family: Times New Roman;">http://buffalo.sourceforge.net</span></a></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">二、</span><span lang="EN-US"><span style="font-family: Times New Roman;">buffalo.jar </span></span><span style="">包分析:</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt 21pt; text-indent: 21pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">http://blog.csdn.net/jianglike18/archive/2009/04/11/4062630.aspx</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt 21pt; text-indent: 21pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;"><a href="http://blog.csdn.net/jianglike18/archive/2009/05/05/4151558.aspx">http://blog.csdn.net/jianglike18/archive/2009/05/05/4151558.aspx</a></span></span></p>
6 楼 itstarting 2010-01-11  
<h1 style="margin: 24pt 0cm; text-indent: 0cm;">5<a name="_Toc250983409"><span style=""><span style="">.<span style="font-family: 'Times New Roman';">  </span></span></span><span style="">协议可能需要完善的专题讨论</span></a>
</h1>
<h2 style="margin: 12pt 0cm; text-indent: 0cm;">5<a name="_Toc250983410"><span style=""><span style=""><span style="font-size: large;">.1.</span><span style="font-family: 'Times New Roman';">      </span></span></span><span style=""><span style="font-size: large;">深度分析</span></span></a>
</h2>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">首先声明:在未与</span><span lang="EN-US"><span style="font-family: Times New Roman;">Michael</span></span><span style="">充分沟通交流前,一切都只是个人的想法,未必正确。</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">本人在“服务的匹配与调用”章节,曾经提出过服务方法匹配的问题,</span><span lang="EN-US"><span style="font-family: Times New Roman;">Michael</span></span><span style="">在</span><span lang="EN-US"><span style="font-family: Times New Roman;">buffalo.js</span></span><span style="">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">310</span></span><span style="">行提到过“</span><span lang="EN-US"><span style="font-family: Times New Roman;">Guess the type of an javascript object</span></span><span style="">”,但光完善客户端,只怕于事无补。</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">就如我做的实验那样,客户端可以提供</span></span><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';">divide(double a, double b)</span><span style="">的请求,此时的</span><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';">xml</span><span style="">为:</span><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';"></span></p>
<pre name="code" class="xml">&lt;buffalo-call&gt;
&lt;method&gt;divide&lt;/method&gt;
&lt;double&gt;1.1&lt;/double&gt;
&lt;double&gt;2.1&lt;/double&gt;
&lt;/buffalo-call&gt;
</pre>
<p> </p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">此时调用的是</span></span><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';">divide(Double a, Double b)</span><span style=""><span style="font-size: small;">而不是</span></span><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';">divide(</span><strong><span style="font-size: 10pt; color: #7f0055; line-height: 120%; font-family: 'Courier New';">double</span></strong><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';"> a, </span><strong><span style="font-size: 10pt; color: #7f0055; line-height: 120%; font-family: 'Courier New';">double</span></strong><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';"> b)</span><span style="">。</span><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';"></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">虽然已经相差无几,但依然无法到达准确制导,主要还是</span><span lang="EN-US"><span style="font-family: Times New Roman;">primitive</span></span><span style="">及其</span><span lang="EN-US"><span style="font-family: Times New Roman;">Wrapper</span></span><span style="">之间容易造成误会。</span></span></p>
<p><span style="">首先我们还是仔细来看看匹配权重的代码,在相同服务下,同名称同参数长度下,下一步就考虑到了参数的匹配权重问题(这里我加了注释):</span></p>
<p><span style="">
<pre name="code" class="java">private int parameterAssignable(Class targetType, Class sourceType) {
if (targetType.equals(sourceType)) return 6;//如果类型相等,匹配度为6
if (targetType.isAssignableFrom(sourceType)) return 5;//同源,为5
if (targetType.isPrimitive()) {//如果是primitive,则获取Wrapper类
targetType = ClassUtil.getWrapperClass(targetType);
}
if (targetType.equals(sourceType)) {
return 4; //此时肯定是经过处理的匹配,只能为4
} else if (Number.class.isAssignableFrom(targetType) &amp;&amp;
Number.class.isAssignableFrom(sourceType)) {
return 3; //如果两边都是Number型的,马虎匹配了,为3
}
return 0; //0就是没啥匹配度了
}
</pre>
<p> </p>
<p> </p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">题外话:注意下后面的</span><span lang="EN-US"><span style="font-family: Times New Roman;">if/else</span></span><span style="">代码稍微有些逻辑交待不清。</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">同时,需要结合所涉及到的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Converter</span></span><span style="">,此时为</span><span lang="EN-US"><span style="font-family: Times New Roman;">DoubleConverter</span></span><span style="">。同样我们看看代码:</span></span></p>
<span style="">
<p> </p>
</span></span></p>
<p> </p>
<pre name="code" class="java">public class DoubleConverter extends AbstractBasicConverter implements Converter{
public boolean canConvert(Class value) {
if (value == null) return false;
return value.equals(double.class) ||
value.equals(Double.class) ||
value.equals(float.class) ||
value.equals(Float.class);
}
protected String getType() {
return ProtocalTag.TAG_DOUBLE;
}
public Object fromString(String string) {
return Double.valueOf(string);
}
}
</pre>
<p> </p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">显然,在这个例子上,是这个转换器模糊了</span><span lang="EN-US"><span style="font-family: Times New Roman;">double</span></span><span style="">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">Double</span></span><span style="">,统统变成了</span><span lang="EN-US"><span style="font-family: Times New Roman;">Double</span></span><span style="">。</span></span></p>
<h2 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983411"><span style=""><span style="">5.2.<span style="font-family: 'Times New Roman';">      </span></span></span><span style="">可能的解决方案</span></a></h2>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">当然,这里的解决方案是以“需要这么干”为前提假设的。在很大程度上来说,这种“精确制导”没有必要。</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">我仅以解决上述例子为目标,做出修缮。</span></span></p>
<h3 style="margin: 12pt 0cm; text-indent: 0cm;">
<a name="_Toc250983412"><span style=""><span style=""><span style="font-size: large;">5.2.1.</span><span style="font-family: 'Times New Roman';">         </span></span></span><span style="font-size: large;"><span style="">在</span><span lang="EN-US"><span style="font-family: Times New Roman;">ProtocalTag</span></span></span></a><span style=""><span style=""><span style="font-size: large;">中加入新协议标签</span></span></span>
</h3>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">位置:</span><span lang="EN-US"><span style="font-family: Times New Roman;">net.buffalo.protocal.</span></span></span><span style="font-size: 10pt; color: #000000; line-height: 120%; font-family: 'Courier New';">ProtocalTag</span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style=""><span style="font-size: small;">需要加入新的标签定义:</span></span></p>
<p><span style="">
<pre name="code" class="java">package net.buffalo.protocal;

public interface ProtocalTag {
public static final String TAG_BOOLEAN = "boolean";
public static final String TAG_DATE = "date";
public static final String TAG_INT = "int";
public static final String TAG_LONG = "long";
public static final String TAG_NULL = "null";
public static final String TAG_STRING = "string";
public static final String TAG_LENGTH = "length";
public static final String TAG_TYPE = "type";
public static final String TAG_LIST = "list";
public static final String TAG_MAP = "map";
public static final String TAG_DOUBLE = "double";
public static final String TAG_REPLY = "buffalo-reply";
public static final String TAG_REF = "ref";
public static final String TAG_CALL = "buffalo-call";
public static final String TAG_FAULT = "fault";
public static final String TAG_METHOD = "method";

//加入新的协议标签 by zhengxq
//java.lang.Double
public static final String TAG_DOUBLE_W = "java.lang.Double";
//其他}
</pre>
<p> </p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<h3 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983413"><span style=""><span style=""><span style="font-size: large;">5.2.2.</span><span style="font-family: 'Times New Roman';">         </span></span></span><span style=""><span style="font-size: large;">定义两个工具类</span></span></a></h3>
<h4 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983414"><span style=""><span style=""><span style="font-size: small;">5.2.2.1.</span><span style="font-family: 'Times New Roman';">      </span></span></span><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">PrimitiveObjectWrapper</span></span></a></h4>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">Primitive</span></span><span style="">对象的包装类:</span></span></p>
<p><span style="font-size: small;"><span style="">
<pre name="code" class="java">package net.buffalo.protocal.util;

public class PrimitiveObjectWrapper {
private Class clazz;
private Object value;
public PrimitiveObjectWrapper(Object value){
this.clazz = PrimitiveObjectUtil.getPrivitiveType(value);
this.value = value;
}
public Class getClazz() {
return clazz;
}
public void setClazz(Class clazz) {
this.clazz = clazz;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
</pre>
<p> </p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<h4 style="margin: 12pt 0cm; text-indent: 0cm;">5<a name="_Toc250983415"><span style=""><span style="">.2.2.2.<span style="font-family: 'Times New Roman';">      </span></span></span><span lang="EN-US"><span style="font-family: Times New Roman;">PrimitiveObjectUtil</span></span></a>
</h4>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="">一个获取</span><span lang="EN-US"><span style="font-family: Times New Roman;">primitive</span></span><span style="">类型的工具:</span></p>
<p><span style="">
<pre name="code" class="java">package net.buffalo.protocal.util;

public class PrimitiveObjectUtil {
public static Class getPrivitiveType(Object v){
Class clazz = v instanceof Integer ? int.class :
v instanceof Long ? long.class :
v instanceof Short ? short.class :
v instanceof Byte ? byte.class :
v instanceof Float ? float.class :
v instanceof Double ? double.class :
v instanceof Boolean ? boolean.class :
v.getClass();
return clazz;
}
}
</pre>
<p> </p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<h3 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983416"><span style=""><span style=""><span style="font-size: large;">5.2.3.</span><span style="font-family: 'Times New Roman';">         </span></span></span><span style="font-size: large;"><span style="">新增转换器</span><span lang="EN-US"><span style="font-family: Times New Roman;">PrimitiveDoubleConverter</span></span></span></a></h3>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="">位置:</span><span lang="EN-US"><span style="font-family: Times New Roman;">net.buffalo.protocal.converters.primitive</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="">新增</span><span lang="EN-US"><span style="font-family: Times New Roman;">primitive</span></span><span style="">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">package</span></span><span style="">,并建立新的转换器</span><span lang="EN-US"><span style="font-family: Times New Roman;">PrimitiveDoubleConverter.java</span></span><span style="">:</span></p>
<span style="">
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<pre name="code" class="java">package net.buffalo.protocal.converters.primitive;

import net.buffalo.protocal.ProtocalTag;
import net.buffalo.protocal.converters.Converter;
import net.buffalo.protocal.converters.basic.AbstractBasicConverter;
import net.buffalo.protocal.util.PrimitiveObjectWrapper;

public class PrimitiveDoubleConverter extends AbstractBasicConverter implements Converter{

public boolean canConvert(Class value) {
if (value == null) return false;
return value.equals(double.class);
}

protected String getType() {
return ProtocalTag.TAG_DOUBLE;
}

public Object fromString(String string) {
//get the custom Wrapper
return new PrimitiveObjectWrapper(Double.valueOf(string));
}
}
</pre>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<h3 style="margin: 12pt 0cm; text-indent: 0cm;">
<a name="_Toc250983417"><span style=""><span style=""><span style="font-size: large;">5.2.4.</span><span style="font-family: 'Times New Roman';">         </span></span></span><span style="font-size: large;"><span style="">修改</span><span lang="EN-US"><span style="font-family: Times New Roman;">DoubleConverter</span></span></span></a><span style=""><span style=""><span style="font-size: large;">的协议标签类型</span></span></span>
</h3>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="">位置:</span><span lang="EN-US"><span style="font-family: Times New Roman;">net.buffalo.protocal.converters.basic.DoubleConverter.java</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="">不再是</span><span lang="EN-US"><span style="font-family: Times New Roman;">ProtocalTag.TAG_DOUBLE</span></span><span style="">了:</span></p>
<pre name="code" class="java">protected String getType() {
return ProtocalTag.TAG_DOUBLE_W;
}
</pre>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<h3 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983418"><span style=""><span style=""><span style="font-size: large;">5.2.5.</span><span style="font-family: 'Times New Roman';">         </span></span></span><span style="font-size: large;"><span style="">注册转换器到</span><span lang="EN-US"><span style="font-family: Times New Roman;">DefaultConverterLookup</span></span></span></a></h3>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="">位置:</span><span lang="EN-US"><span style="font-family: Times New Roman;">net.buffalo.protocal.converters.DefaultConverterLookup.java</span></span></p>
<p>
</p>
<pre name="code" class="java">protected void registerDefaultConverters() {
BooleanConverter booleanConverter = new BooleanConverter();
DoubleConverter doubleConverter = new DoubleConverter();
IntegerConverter integerConverter = new IntegerConverter();
LongConverter longConverter = new LongConverter();
StringConverter stringConverter = new StringConverter();
DateConverter dateConverter = new DateConverter();
CollectionConverter collectionConverter = new CollectionConverter();
MapConverter mapConverter = new MapConverter();
ArrayConverter arrayConverter = new ArrayConverter();
SqlDateConverter sqlDateConverter = new SqlDateConverter();
BigNumberConverter bigNumberConverter = new BigNumberConverter();
ExceptionConverter exceptionConverter = new ExceptionConverter();
ObjectConverter objectConverter = new ObjectConverter();

//新增新的转换器定义
PrimitiveDoubleConverter primitiveDoubleConverter = new PrimitiveDoubleConverter();

converters.add(nullConverter);
converters.add(booleanConverter);
converters.add(doubleConverter);
converters.add(integerConverter);
converters.add(longConverter);
converters.add(stringConverter);
converters.add(dateConverter);
converters.add(collectionConverter);
converters.add(mapConverter);
converters.add(arrayConverter);
converters.add(sqlDateConverter);
converters.add(bigNumberConverter);
converters.add(exceptionConverter);
// register new primitiveDoubleConverter
converters.add(primitiveDoubleConverter);
// Should be last one
converters.add(objectConverter);

tagNameConverterCache.put(ProtocalTag.TAG_BOOLEAN, booleanConverter);
tagNameConverterCache.put(ProtocalTag.TAG_STRING, stringConverter);
tagNameConverterCache.put(ProtocalTag.TAG_INT, integerConverter);
tagNameConverterCache.put(ProtocalTag.TAG_LONG, longConverter);
tagNameConverterCache.put(ProtocalTag.TAG_NULL, nullConverter);
tagNameConverterCache.put(ProtocalTag.TAG_DATE, dateConverter);
tagNameConverterCache.put(ProtocalTag.TAG_LIST, collectionConverter);
tagNameConverterCache.put(ProtocalTag.TAG_MAP, mapConverter);
tagNameConverterCache.put(ProtocalTag.TAG_REF, new ReferenceConverter());
// edit the doubleConverter
tagNameConverterCache.put(ProtocalTag.TAG_DOUBLE_W, doubleConverter);
// register new primitiveDoubleConverter
tagNameConverterCache.put(ProtocalTag.TAG_DOUBLE, primitiveDoubleConverter);

converterCache.put(Boolean.class, booleanConverter);
converterCache.put(boolean.class, booleanConverter);
converterCache.put(String.class, stringConverter);
converterCache.put(Integer.class, integerConverter);
converterCache.put(int.class, integerConverter);
converterCache.put(Long.class, longConverter);
converterCache.put(long.class, longConverter);
converterCache.put(Double.class, doubleConverter);
// edit the double converter mapping
//converterCache.put(double.class, doubleConverter);
converterCache.put(double.class, primitiveDoubleConverter);
converterCache.put(Date.class, dateConverter);
converterCache.put(ArrayList.class, collectionConverter);
converterCache.put(LinkedList.class, collectionConverter);
converterCache.put(HashSet.class, collectionConverter);
converterCache.put(Vector.class, collectionConverter);
converterCache.put(TreeSet.class, collectionConverter);
converterCache.put(HashMap.class, mapConverter);
converterCache.put(TreeMap.class, mapConverter);
converterCache.put(java.sql.Date.class, sqlDateConverter);
converterCache.put(java.math.BigDecimal.class, bigNumberConverter);
converterCache.put(java.math.BigInteger.class, bigNumberConverter);
}
</pre>
<p> </p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<h3 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983419"><span style=""><span style=""><span style="font-size: large;">5.2.6.</span><span style="font-family: 'Times New Roman';">         </span></span></span><span style="font-size: large;"><span style="">修订</span><span lang="EN-US"><span style="font-family: Times New Roman;">FastStreamReader</span></span></span></a></h3>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="">位置:</span><span lang="EN-US"><span style="font-family: Times New Roman;">net.buffalo.protocal.io.FastStreamReader</span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<pre name="code" class="java">/* 判断是否有效的标签字符,必须是字母、数字和两个特定字符:':'、'-'
* 又新增了字符'.'
*/
private boolean isTagChar(int ch) {
return (ch &gt;= 'a' &amp;&amp; ch &lt;= 'z' || ch &gt;= 'A' &amp;&amp; ch &lt;= 'Z' || ch &gt;= '0'
&amp;&amp; ch &lt;= '9' || ch == ':' || ch == '-' || ch == '.');
}
</pre>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<h3 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983420"><span style="" lang="EN-US"><span style=""><span style="font-size: large;">5.2.7.</span><span style='font: 7pt "Times New Roman";'>         </span></span></span><span style="font-size: large;"><span style="">完善</span><span lang="EN-US"><span style="font-family: Times New Roman;">BuffaloCall</span></span></span></a></h3>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="">位置:</span><span lang="EN-US"><span style="font-family: Times New Roman;">net.buffalo.protocal.BuffaloCall</span></span></p>
<font style=""><font size="3"><font style="">
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
</font></font></font></span></span></p>
</span><font style=""><font size="3">
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
</font></font></p>
<font style="">
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
</font>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<pre name="code" class="java">public BuffaloCall(String methodName, Object[] arguments) {
this.argumentTypes = new Class[arguments.length];
this.arguments = new Object[arguments.length];
for (int i = 0; i &lt; arguments.length; i++) {
// from code
//types[i] = arguments[i].getClass();
// to - begin
if(arguments[i] instanceof PrimitiveObjectWrapper){
PrimitiveObjectWrapper p = (PrimitiveObjectWrapper)arguments[i];
//the type
this.argumentTypes[i] = PrimitiveObjectUtil.getPrivitiveType(p.getValue());
//the value
this.arguments[i] = p.getValue();
}else{
this.argumentTypes[i] = arguments[i].getClass();
this.arguments[i] = arguments[i];
}
//end
}

this.methodName = methodName;
}
</pre>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
<h3 style="margin: 12pt 0cm; text-indent: 0cm;"><a name="_Toc250983421"><span style="" lang="EN-US"><span style=""><span style="font-size: large;">5.2.8.</span><span style='font: 7pt "Times New Roman";'>         </span></span></span><span style="font-size: large;"><span style="">客户端</span><span lang="EN-US"><span style="font-family: Times New Roman;">buffalo.js</span></span></span></a></h3>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">需要处理客户端对于</span><span lang="EN-US"><span style="font-family: Times New Roman;">java.lang.Double</span></span><span style="">标签的处理,在</span><span lang="EN-US"><span style="font-family: Times New Roman;">Buffalo.Reply</span></span><span style="">中(注意红色的部分):</span></span></p>
<p><span style="font-size: small;"><span style="">
<pre name="code" class="js">deserialize: function(dataNode) {
var ret;
var type = this._getType(dataNode);
switch (type) {
case "boolean": ret = this.doBoolean(dataNode); break;
case "date": ret = this.doDate(dataNode); break;
case "java.lang.double":;//new add
case "double": ret = this.doDouble(dataNode); break;
case "int":
case "long":
ret = this.doInt(dataNode);
break;
case "list": ret = this.doList(dataNode); break;
case "map": ret = this.doMap(dataNode); break;
case "null": ret = this.doNull(dataNode); break;
case "ref": ret = this.doRef(dataNode); break;
case "string": ret = this.doString(dataNode);break;
case "xml": ret = this.doXML(dataNode); break;
case "fault": ret = this.doFault(dataNode); break;
default: ;
}
return ret;
}
</pre>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>
</span></span>
</p>
<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>

<p class="MsoNormal" style="margin: 6pt 0cm 0pt; text-indent: 21pt;"> </p>

相关推荐

    国产Ajax框架 Buffalo

    【Ajax框架Buffalo详解】 Ajax(Asynchronous JavaScript and XML)技术自2005年以来,极大地改变了网页应用程序的开发方式,使得页面无需刷新即可与服务器进行数据交互,提升了用户体验。而“国产Ajax框架 Buffalo...

    JAVA源码国产Ajax框架Buffalo

    JAVA源码国产Ajax框架Buffalo

    java资源国产Ajax框架Buffalo

    java资源国产Ajax框架 Buffalo提取方式是百度网盘分享地址

    国产Ajax框架 Buffalo.7z

    《国产Ajax框架 Buffalo详解》 Ajax(Asynchronous JavaScript and XML)技术在Web开发领域中扮演着重要的角色,它使得网页可以实现异步更新,提升了用户体验。而在众多Ajax框架中,国产Ajax框架Buffalo以其独特的...

    基于Java的实例源码-国产Ajax框架 Buffalo.zip

    【标题】"基于Java的实例源码-国产Ajax框架 Buffalo.zip" 提供的是一个使用Java语言实现的国产Ajax框架——Buffalo的相关源代码。Ajax(Asynchronous JavaScript and XML)技术是一种在无需重新加载整个网页的情况下...

    java源码:国产Ajax框架 Buffalo.rar

    《Java源码解析:国产Ajax框架Buffalo》 在当今Web开发领域,Ajax技术因其能够实现页面...通过深入研究其源码,我们可以从中获取到许多关于Ajax框架设计、性能优化和事件处理的宝贵经验,进一步提升我们的编程技能。

    基于java的开发源码-国产Ajax框架 Buffalo.zip

    **Ajax框架Buffalo详解** Ajax(Asynchronous JavaScript and XML)技术是现代Web开发中的关键组成部分,它使得网页能够实现异步更新,提升了用户体验。而基于Java的Ajax框架Buffalo则是国内开发者为解决这一需求而...

    基于java的国产Ajax框架 Buffalo.zip

    【标题】基于Java的国产Ajax框架 Buffalo Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使网页实现异步更新,极大...

    基于Java的国产Ajax框架 Buffalo.zip

    **基于Java的国产Ajax框架 Buffalo** Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使网页实现异步更新,提升...

    Buffalo 1.1 ajax框架

    AJAX是开发基于web的rich client的一种方式,Buffalo则是实现AJAX的一个框架。Buffalo中定义了Web远程调用的传输基础,并且将远程调用对象完整的序列化到了本地,成为可以被JavaScript编程触及的对象。Buffalo中的...

    国产Ajax框架 Buffalo源码

    《国产Ajax框架 Buffalo源码详解》 Ajax,全称Asynchronous JavaScript and XML,是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使得网页实现异步更新,极大...

    buffalo-1.2alpha1 ajax框架

    Buffalo则是实现AJAX的一个框架。Buffalo中定义了Web远程调用的传输基础,并且将远程调用对象完整的序列化到了本地,成为可以被JavaScript编程触及的对象。Buffalo中的重要组件-BuffaloBinding,提供了将JavaScript...

    小程序 国产Ajax框架 Buffalo(源码).rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    buffalo1.2ajax框架应用演示例子

    buffalo1.2ajax框架应用演示例子 buffalo1.2下载地址: http://www.codechina.net/resource/html/2005-12/06/119641.html

    基于Ajax的buffalo技术的helloword和三级联动菜单

    基于Ajax的buffalo技术的helloword和三级联动菜单 包含入门模块:helloword、延伸模块:三级联动菜单 项目已包含所有文件,只需导入myeclipse运行即可。 开发环境:myeclipse6.0、jdk1.5、tomcat5.0 说明:连数据库...

    AJAX(Buffalo)配置使用

    Buffalo是一个用于构建Web应用程序的Go框架,它提供了方便的工具来处理HTTP请求,包括AJAX请求。要使用AJAX,你需要在前端设置JavaScript代码来发起请求,同时在后端配置相应的路由和处理函数。 1. **前端配置**:...

    ajax十大框架

    根据给定的信息,我们可以梳理出以下关于Ajax框架的相关知识点: ### 1. Prototype Prototype 是一个功能强大的 JavaScript 库,它扩展了 DOM API,并提供了一系列便捷的方法和对象。该库非常优雅,支持丰富的 ...

    Buffalo框架所需文件

    Buffalo框架是一个基于Java开发的轻量级Web应用框架,其设计目标是简化开发流程,提高开发效率。在描述中提到的"Buffalo框架所需文件"压缩包,包含了该框架运行所必需的组件,主要是jar文件和JS文件。这些文件在Java...

    buffalo-l 包buffalo-sc包

    在IT行业中,`buffalo-l` 和 `buffalo-sc` 是两个特定的软件包,它们可能涉及特定的开发框架或工具。尽管提供的信息有限,但我们可以根据这些关键词推测出一些可能的知识点。以下是对这两个包的详细解释以及与之相关...

    buffalo.jar

    buffalo2.0.jar,ajax使用buffalo框架!

Global site tag (gtag.js) - Google Analytics