大家有没有整合buffalo和EXT的经验,分享一下?

4 views
Skip to first unread message

itstarting

unread,
Jun 14, 2007, 9:33:38 PM6/14/07
to buffalo与Amowa
考虑到EXT具有这丰富的UI类库,故对buffalo和EXT的定位为:
buffalo:为service服务的寻址和command模式的应用;
EXT:客户端UI类库


但我在运用的过程发现了一些问题。
比如我在使用EXT的GRID的时候:
var ds = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url: '/f/services/XService?
method=queryList&start=0&offset=10'}),

reader: new Ext.data.XmlReader({
record: 'multiRef',
id: 'c_id'
}, [
'c_title', 'c_intime'
])
});

此时EXT需要的只是一个URL,虽然buffalo也是通过URI的规则来做的service的寻址,但其自有一套规则,做的也蛮好,但这里感觉整合
点找不到。
另一方面,buffalo返回的xml是通过buffalo解析的,感觉不是纯的与POJOS映射的XML(比如通过xstream进行toXML的那
种),也是很头疼的事情。

现在我做实验,是通过AXIS来进行桥接(UI-Webservice-SPI-DAO),这样成本太高,效率太低了。

这使得我又想到了JSON-RPC或者自己参考着重新开发(轮子?),难道没有其他更好的办法了吗?

请有经验的朋友分享、讨论一下?

Michael Chen

unread,
Jun 15, 2007, 12:59:40 AM6/15/07
to am...@googlegroups.com
var ds = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url: '/f/services/XService?
method=queryList&start=0&offset=10'}),

reader: new Ext.data.XmlReader({
record: 'multiRef',
id: 'c_id'
}, [
'c_title', 'c_intime'
])
});

呵呵,就从这个点进去就没问题了。跟java一样,在JS端编写新的Proxy和reader就可以了。只要满足接口要求的方法就好了。


--
Michael Chen
--------------------------------
Blog: http://michael.nona.name
MSN: jzch...@hotmail.com

itstarting

unread,
Jun 15, 2007, 1:10:17 AM6/15/07
to buffalo与Amowa
我现在在考虑通过写新的converter+调整buffalo的js客户端,然后在回调里面进行UI渲染(好复杂)。

不知道还有没有更好的实践?

On 6月15日, 下午12时59分, "Michael Chen" <mechil...@gmail.com> wrote:
> var ds = new Ext.data.Store({
> proxy: new Ext.data.HttpProxy({url: '/f/services/XService?
> method=queryList&start=0&offset=10'}),
>
> reader: new Ext.data.XmlReader({
> record: 'multiRef',
> id: 'c_id'
> }, [
> 'c_title', 'c_intime'
> ])
> });
>
> 呵呵,就从这个点进去就没问题了。跟java一样,在JS端编写新的Proxy和reader就可以了。只要满足接口要求的方法就好了。
>

> MSN: jzche...@hotmail.com- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Michael Chen

unread,
Jun 15, 2007, 1:28:17 AM6/15/07
to am...@googlegroups.com
为什么要converter呢?

On 6/15/07, itstarting <zhengx...@gmail.com> wrote:

MSN: jzch...@hotmail.com

无明

unread,
Jun 16, 2007, 9:49:47 PM6/16/07
to am...@googlegroups.com
要用Ext的话,直接由java端发送json数据到浏览器就好了,为何还要通过buffalo转一下?


itstarting

unread,
Jun 17, 2007, 9:45:21 AM6/17/07
to buffalo与Amowa
你说的是有道理的,我用buffalo很多时候也是希望更大程度的降低对传统MVC的controller的强依赖(如struts等),而是尽量在
UI层做(试想一下,我们会常常进行view层的切换吗?而且根据OAOP的思想,切换的也许仅仅就是UI组件而已,而非page),所以在这个层面来
说,我用buffalo主要关注的就是:客户端对Request的包装和后端对服务的寻址,也即Request->unmarshal-
>view(json or xml)->service->Response,而数据(就是就是为UI服务的东西,我也叫view吧)就是通过这些相
同的sevice(SPI)提供,完全可以轻松构建facade完成不同的view或其他数据提供/交换的需求。

其实这么说的话,感觉要用buffalo会有点牵强,但我们如果需要重新审视的问题可能会很严峻:
1、buffalo用一套自解析的封闭的xml协议,想干什么?可否考虑开放些?
2、buffalo的重心毕竟不是UI,那是否想过跟其他UI类库(我这里提了EXT)有更好的整合可能?

欢迎探讨。

On 6月17日, 上午9时49分, "无明" <java...@gmail.com> wrote:
> 要用Ext的话,直接由java端发送json数据到浏览器就好了,为何还要通过buffalo转一下?

Michael Chen

unread,
Jun 17, 2007, 10:45:52 AM6/17/07
to am...@googlegroups.com
关于buffalo与UI组件的整合,之前说过很多次,现在有了新的需求,还是再次说一下...

任何UI组件的实现,无论是过去我提到的Qooxdoo,
还是现在的YUI-EXT,或者更多更华丽的单一或者自成体系的UI框架(如Bindows),依赖的数据无论是url, 还是xml,
如果设计精巧的化,最后渲染的那一部分一定是被转化成为了JS对象。有buffalo的贡献者写出了与YUI Tree的整合案例:

http://confluence.redsaga.com/pages/viewpage.action?pageId=1562

我也刚刚查看了EXT的代码,觉得两者整合应该还是很容易的。最终任何组件依赖的数据是JS对象,虽然表象上它们需要url或者xml。而buffalo直接给了完整的对象,从用法上,应该是更抽象些,虽然不是那么直接就能使用。

关于buffalo采用xml协议的问题,这是一个历史问题。buffalo早在2004年就已经有了想法,那时候JSON远远不为人所知。后来也逐渐开发出来了,但大多数的用户也不依赖于具体的协议实现。无论buffalo的协议实现是JSON还是xml,
对最终开发者价值都是一样的。

itstarting

unread,
Jun 20, 2007, 12:45:21 AM6/20/07
to buffalo与Amowa
最终任何组件依赖的数据是JS对象,虽然表象上它们需要url或者xml。而buffalo直接给 了完整的对象,从用法上,应该是更抽象些,虽然不是
那么直接就能使用。

--认可这些思路,也就是说:js object(s)<->Request<->buffalo protocol<->Service(pojo-
based),这时候就不用管协议了,关键还是在客户端对UI和Buffalo进行融合,毕竟后面的service都是pojo-based。

自己会做些尝试(虽然oo js需要补课),不过建议Michael也尝试一下,系统总要具有包容性,我们也有些参考。

On 6月17日, 下午10时45分, "Michael Chen" <mechil...@gmail.com> wrote:
> 关于buffalo与UI组件的整合,之前说过很多次,现在有了新的需求,还是再次说一下...
>
> 任何UI组件的实现,无论是过去我提到的Qooxdoo,
> 还是现在的YUI-EXT,或者更多更华丽的单一或者自成体系的UI框架(如Bindows),依赖的数据无论是url, 还是xml,
> 如果设计精巧的化,最后渲染的那一部分一定是被转化成为了JS对象。有buffalo的贡献者写出了与YUI Tree的整合案例:
>
> http://confluence.redsaga.com/pages/viewpage.action?pageId=1562
>

> 我也刚刚查看了EXT的代码,觉得两者整合应该还是很容易的。最终任何组件依赖的数据是JS对象,虽然表象上它们需要url或者xml。而buffalo直接给 了完整的对象,从用法上,应该是更抽象些,虽然不是那么直接就能使用。
>
> 关于buffalo采用xml协议的问题,这是一个历史问题。buffalo早在2004年就已经有了想法,那时候JSON远远不为人所知。后来也逐渐开发出来 了,但大多数的用户也不依赖于具体的协议实现。无论buffalo的协议实现是JSON还是xml,
> 对最终开发者价值都是一样的。


>
> On 6/17/07, itstarting <zhengxianq...@gmail.com> wrote:
>
>
>
>
>
> > 你说的是有道理的,我用buffalo很多时候也是希望更大程度的降低对传统MVC的controller的强依赖(如struts等),而是尽量在
> > UI层做(试想一下,我们会常常进行view层的切换吗?而且根据OAOP的思想,切换的也许仅仅就是UI组件而已,而非page),所以在这个层面来
> > 说,我用buffalo主要关注的就是:客户端对Request的包装和后端对服务的寻址,也即Request->unmarshal-
> > >view(json or xml)->service->Response,而数据(就是就是为UI服务的东西,我也叫view吧)就是通过这些相
> > 同的sevice(SPI)提供,完全可以轻松构建facade完成不同的view或其他数据提供/交换的需求。
>
> > 其实这么说的话,感觉要用buffalo会有点牵强,但我们如果需要重新审视的问题可能会很严峻:
> > 1、buffalo用一套自解析的封闭的xml协议,想干什么?可否考虑开放些?
> > 2、buffalo的重心毕竟不是UI,那是否想过跟其他UI类库(我这里提了EXT)有更好的整合可能?
>
> > 欢迎探讨。
>
> > On 6月17日, 上午9时49分, "无明" <java...@gmail.com> wrote:
> > > 要用Ext的话,直接由java端发送json数据到浏览器就好了,为何还要通过buffalo转一下?
>
> --
> Michael Chen
> --------------------------------
> Blog:http://michael.nona.name

foxweimin

unread,
Jun 23, 2007, 10:14:06 PM6/23/07
to buffalo与Amowa
根据Memory的例子我写了一个BuffaloProxy,结合ArrayReader工作,但不知道为什么ds.load后,ds中仍然没有数据,
请大侠帮我看看。

Ext.data.BuffaloProxy = function(buffalo,serviceName,args){
Ext.data.BuffaloProxy.superclass.constructor.call(this);
this.buffalo=buffalo;
this.serviceName = serviceName;
this.args = args;
};

Ext.extend(Ext.data.BuffaloProxy, Ext.data.DataProxy, {
load : function(params, reader, callback, scope, arg) {
params = params || {};
if(this.fireEvent("beforeload", this, params) !== false){
var result;
var fnLoadData=function(replay){
result=reader.readRecords(data);
}
try {

this.buffalo.remoteCall(this.serviceName,this.args,fnLoadData);
}catch(e){
this.fireEvent("loadexception", this, arg, null, e);
callback.call(scope, null, arg, false);
return;
}
callback.call(scope, result, arg, true);
};
},
failure : function(response) {
console.log("Failed"); callback
},
update : function(params, records){
}
});


foxweimin

unread,
Jun 23, 2007, 10:19:32 PM6/23/07
to buffalo与Amowa
参考MemoryProxy的源码我写了一个BuffaloProxy,结合ArrayReader工作,但不知道为什么ds.load后,ds中仍然
没有数据,
请大侠帮我看看。

Ext.data.BuffaloProxy = function(buffalo,serviceName,args){
Ext.data.BuffaloProxy.superclass.constructor.call(this);
this.buffalo=buffalo;
this.serviceName = serviceName;
this.args = args;
};

Ext.extend(Ext.data.BuffaloProxy, Ext.data.DataProxy, {
load : function(params, reader, callback, scope, arg) {
params = params || {};
if(this.fireEvent("beforeload", this, params) !== false){
var result;
var fnLoadData=function(replay){

var data=replay.getResult();


result=reader.readRecords(data);
}
try {

this.buffalo.remoteCall(this.serviceName,this.args,fnLoadData);
}catch(e){
this.fireEvent("loadexception", this, arg, null, e);
callback.call(scope, null, arg, false);
return;
}
callback.call(scope, result, arg, true);
};
},
failure : function(response) {
console.log("Failed");

Michael Chen

unread,
Jun 24, 2007, 5:45:51 AM6/24/07
to am...@googlegroups.com
我写了一个demo, 用EXT Grid来加载Demo中的Locale列表。

编写了一个Proxy:

Buffalo.Ext = {};

//Usage: new Buffalo.Ext.DataProxy(buffalo, "myService.method",
[param1, param2])
Buffalo.Ext.DataProxy = function(buffalo, service, params) {
Buffalo.Ext.DataProxy.superclass.constructor.call(this);
this.buffalo = buffalo;
this.service = service;
this.params = params;
}

Ext.extend(Buffalo.Ext.DataProxy, Ext.data.DataProxy, {

load : function(params, reader, callback, scope, arg){

var self = this;
if (this.fireEvent("beforeload", this, params) != false) {
this.buffalo.remoteCall(this.service, this.params, function(reply) {
if (reply.isFault()) {
// This should be processed in buffalo events...
// alert(reply.getSource());
return;
}
// let the reader to read the returned object.
var result = reader.readRecords(reply.getResult());
self.fireEvent("load", this, null, arg);
callback.call(scope, result, arg, true);
});
} else {
callback.call(scope || this, "", arg, false);
}
}
});

用法:

var ds = new Ext.data.Store({

proxy: new Buffalo.Ext.DataProxy(buffalo,
"simpleService.allLocales", []),
reader: new Ext.data.JsonReader({}, [
{name: 'language'},
{name: 'country'},
{name: 'variant'},
{name: 'hashcode'}
])
});


程序的其他部分完全不用修改。

注意,这个demo没有做分页处理,请考虑实现一个CountableList(增加totalSize属性)来实现。实现原理和那篇ext-dwr的文档类似。

参考代码已经放在svn中,这里留下链接供参考:
http://buffalo.svn.sourceforge.net/viewvc/*checkout*/buffalo/trunk/buffalo-demo/src/main/webapp/script/buffalo-ext.js?revision=62

http://buffalo.svn.sourceforge.net/viewvc/buffalo/trunk/buffalo-demo/src/main/webapp/ext-grid.jsp?revision=62&view=markup

--
Michael Chen
--------------------------------
Blog: http://michael.nona.name

MSN: jzch...@hotmail.com

foxweimin

unread,
Jun 24, 2007, 9:40:35 AM6/24/07
to buffalo与Amowa
和我写的例子差不多啊?但是我发现我写的哪个有问题啊。应该是异步调用的问题,因为this.buffalo.remoteCall中回调函数还没有执
行完的时候已经开始执行后面的程序了,这样好像就取不到数据啊。

foxweimin

unread,
Jun 24, 2007, 10:01:29 AM6/24/07
to buffalo与Amowa
Michael 的例子实验成功,看了一下代码的差别,我没有self.fireEvent("load", this, null, arg); 这
一句,看了Ext的文档,fireEvent好像是用来触发"load"事件的,在执行ds.load以后不是已经
buffalo.remoteCall了吗?为什么还要触发这个"load"事件呢?请Michael抽空解答一下啊

itstarting

unread,
Jun 25, 2007, 10:28:00 PM6/25/07
to buffalo与Amowa
领教了!谢谢

> 参考代码已经放在svn中,这里留下链接供参考:http://buffalo.svn.sourceforge.net/viewvc/*checkout*/buffalo/trunk/bu...
>
> http://buffalo.svn.sourceforge.net/viewvc/buffalo/trunk/buffalo-demo/...

itstarting

unread,
Jun 26, 2007, 5:08:30 AM6/26/07
to buffalo与Amowa
svn 上的demo有bug,FF通过,但在IE下执行不了,仔细分析,原因是很多地方多了个逗号",",比如

var grid = new Ext.grid.Grid('grid-example', {
ds: ds,
cm: colModel,//注意这里,要去掉这个逗号
});

应该为:
var grid = new Ext.grid.Grid('grid-example', {
ds: ds,
cm: colModel
});

寒风

unread,
Jul 9, 2007, 2:19:26 AM7/9/07
to buffalo与Amowa
这一句是发布"load"事件,如果有其他对象注册了这个ds的"load"事件,此时就会触发它们的事件处理函数,Grid应该会注册这个事件的。

On 6月24日, 下午10时01分, foxweimin <foxwei...@gmail.com> wrote:

Reply all
Reply to author
Forward
0 new messages