但我在运用的过程发现了一些问题。
比如我在使用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或者自己参考着重新开发(轮子?),难道没有其他更好的办法了吗?
请有经验的朋友分享、讨论一下?
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
不知道还有没有更好的实践?
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- 隐藏被引用文字 -
>
> - 显示引用的文字 -
其实这么说的话,感觉要用buffalo会有点牵强,但我们如果需要重新审视的问题可能会很严峻:
1、buffalo用一套自解析的封闭的xml协议,想干什么?可否考虑开放些?
2、buffalo的重心毕竟不是UI,那是否想过跟其他UI类库(我这里提了EXT)有更好的整合可能?
欢迎探讨。
On 6月17日, 上午9时49分, "无明" <java...@gmail.com> wrote:
> 要用Ext的话,直接由java端发送json数据到浏览器就好了,为何还要通过buffalo转一下?
任何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,
对最终开发者价值都是一样的。
--认可这些思路,也就是说: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
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){
}
});
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");
编写了一个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
--
Michael Chen
--------------------------------
Blog: http://michael.nona.name
MSN: jzch...@hotmail.com
> 参考代码已经放在svn中,这里留下链接供参考:http://buffalo.svn.sourceforge.net/viewvc/*checkout*/buffalo/trunk/bu...
>
> http://buffalo.svn.sourceforge.net/viewvc/buffalo/trunk/buffalo-demo/...
var grid = new Ext.grid.Grid('grid-example', {
ds: ds,
cm: colModel,//注意这里,要去掉这个逗号
});
应该为:
var grid = new Ext.grid.Grid('grid-example', {
ds: ds,
cm: colModel
});
On 6月24日, 下午10时01分, foxweimin <foxwei...@gmail.com> wrote: