`
rigger21
  • 浏览: 127219 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

bufflo最佳实践

阅读更多
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
这里我们提供一些来自于真实项目的最佳实践。 这些实践提出了采用ajax的正确道路。请在你的项目中考虑它们。

用DTO [(data transfer object) 数据传递对象]直接代替domain对象

大多数ORM工具带给我们便利,尤其在处理对象关系上。在一个传统的java项目中,我们可以定义一个可用在多个层之间相容的domain对象。这即使在一个集群的应用中也是优良的,因为它们在同一个JVM中而且对象的内部状态能被保存。但在buffalo应用中,因为buffalo是真正地远程调用,所以你最好不这样做。你应该思量一下带宽的问题。

让我们示例说明:userService.listUser,这个方法将返回一个user列表,同时User对象有AddressInfo、Roles和User属于的Department。在传统的JSP编写方式下,这是很好的。但在buffalo,这是很糟糕的。如果你不处理这个状况下任何部分,buffalo将尝试序列化user对象所连接的"每一个"属性,甚至是一对多、多对多的引用数据。这就像我们不需要显示太多数据一样,是对时间和带宽的巨大浪费。

所以在设计buffalo服务时,请用DTO(或是 ViewHelper)来减少对用户的页面输出。

慎重定义远程服务接口

请针对远程调用设计真正的远程服务方法。如果一个客户端开始了一次远程调用,那么服务应该一次性回应足够的信息。客户端不需要调用其它的方法。

采用浏览器前进/后退特征

在一个web应用不能使用浏览器的前进/后退按钮来导航页面视图时,包括我在内的许多未端用户都会感到困惑。在这方面做得好的例如google,而做得糟糕是...MSN Live Mail。从1.2版开始,buffalo引入了这个特征。请考虑采用这个特征来提高用户体验吧。

设计更多与用户接口的交互

这是对所有ajax产品的普遍要求。当用户点击按钮或链接时,你应该提供一个有意义的提示使用户注意正在发生什么。在传统的web开发中,那些action会引起页面刷新或是页面切换。而在ajax中,你应该提供更多。

在中小规模应用中,采用OPOA

OPOA(OnePageOneApplication的简称)定义了一个web应用的类型。小型的基于应用的操作总是页面很少,而需要更佳的交互,例如邮件应用、系统监控等。对于这些应用来讲,你能使用OPOA简化开发和提供更丰富的用户体验。

对于中大型应用,慎用OPOA

由于浏览器能力所限,采用OPOA的大型应用(具有上百个视图) 在运行一会儿后会出现CPU或者内存的高消耗。对于这种情况,如果你仍然坚持使用OPOA的话,那么需要把整个系统分解为模块。这样当用户切换模块时,系统将重新定位到一个新页面以使浏览器有机会清理内存并休息一下。

---------------------------------------------------------------------------------------------------
补充 :

ref

<ref>表示对另一个对象的引用。这个标记对于处理循环引用的场合非常有用,而其它场合会抛出StackOverflowException异常。来让我们看一下示例:

/**//*People类定义*/
classPeople{

PeoplegetFriend()
//Otherfieldsommited
}

/**//*People类对象的使用*/
Peoplejohn
=newPeople("John");
Peoplemichael
=newPeople("Michael");
//这里演示了循环引用
john.setFriend(michael);
michael.setFriend(josh);

Listfriends
=newArrayList();
friends.add(john);
friends.add(smith);


friends被序列化为下面的xml片断:
<list>
<type>java.util.ArrayList</type>
<length>2</length>
<map>
<type>domain.People</type>
<string>friend</string>
<map>
<type>domain.People</type>
<string>friend</friend>
<ref>1</ref>
</map>
</map>
</list>
其中ref=1表示对对象#1的引用作为它的值。xml片断中的每个<list>、<map>将被看作对象并具有一个引用id。
<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://confluence.redsaga.com/pages/viewpage.action?pageId=1554" dc:identifier="http://confluence.redsaga.com/pages/viewpage.action?pageId=1554" dc:title="最佳实践" trackback:ping="http://confluence.redsaga.com/rpc/trackback/1554" /> </rdf:RDF> --><!-- Root decorator: all decisions about how a page is to be decorated via the inline decoration begins here. --><!-- Switch based upon the context. However, for now, just delegate to a decorator identified directly by the context. -->
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics