1.用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)来减少对用户的页面输出。
2.慎重定义远程服务接口
请针对远程调用设计真正的远程服务方法。如果一个客户端开始了一次远程调用,那么服务应该一次性回应足够的信息。客户端不需要调用其它的方法。
3.采用浏览器前进/后退特征
在一个web应用不能使用浏览器的前进/后退按钮来导航页面视图时,包括我在内的许多未端用户都会感到困惑。在这方面做得好的例如google,而做得糟糕是...MSN Live Mail。从1.2版开始,buffalo引入了这个特征。请考虑采用这个特征来提高用户体验吧。
只要在主页面中加入buffalo - blank.html的引用并采用buffalo.switchView的方法。
<iframe src="buffalo-blank.html"
id="buffalo-view-history-iframe" width="0" height="0"
style="display:none;"></iframe>
buffalo-blank.html:
<html>
<title>Buffalo Browser History IFrame</title>
<script language="javascript">
function reportLoc() {
if (parent.Buffalo) {
setTimeout("parent.Buffalo.View.iframeLoaded(window.location)", 100);
} else {
alert("This page cannot run alone!");
}
}
</script>
<body onload="reportLoc()">
<h1>buffalo-blank.html - Needed for browser back/forward.</h1>
</body>
</html>
switchView是switchPart方法的一个快捷方式,也算是一个习惯配置,即当页面存在一个id=body的div时,会自动替换。然而,你可以使用switchPart来进行更细致的配置。
switchPart(viewName, partId, addToHistory)
控制了将哪个url的内容加载到partId的内容中,并且可以指定是否加入到浏览器历史中(使前进后退可用)
4.设计更多与用户接口的交互
这是对所有ajax产品的普遍要求。当用户点击按钮或链接时,你应该提供一个有意义的提示使用户注意正在发生什么。在传统的web开发中,那些action会引起页面刷新或是页面切换。而在ajax中,你应该提供更多。
5.在中小规模应用中,采用OPOA
OPOA(OnePageOneApplication的简称)定义了一个web应用的类型。小型的基于应用的操作总是页面很少,而需要更佳的交互,例如邮件应用、系统监控等。对于这些应用来讲,你能使用OPOA简化开发和提供更丰富的用户体验。
6.对于中大型应用,慎用OPOA
由于浏览器能力所限,采用OPOA的大型应用(具有上百个视图) 在运行一会儿后会出现CPU或者内存的高消耗。对于这种情况,如果你仍然坚持使用OPOA的话,那么需要把整个系统分解为模块。这样当用户切换模块时,系统将重新定位到一个新页面以使浏览器有机会清理内存并休息一下。