在buffalo推出session的支持后,许多人开始在服务中调用
RequestContext.getContext().getSession()
等操作来获取服务器状态信息,最常见的就是在很多OA应用中,绝大部分操作都需要用户登录才能使用。这种场景的常见处理办法是先判断用户是否登录,然后再调用某些方法。例如,一个列出用户所有的文档:
buffalo.remoteCall("userService.isLogin", [], function(reply) {
if (reply.getResult()) {
buffalo.remoteCall("bookService.listAllBooks", [], function(reply){ ... })
} else {
alert("请先登录")
}
})
如果只有一两个这样的案例还好,如果多起来的话,会显得相当麻烦。实际上buffalo已经支持了自定义事件。在spring的拦截器的帮助下,可以实现编程的简化,以及一致性的错误控制。
实现方式:
1 编写一个spring 拦截器,将其配置到需要进行拦截的服务中,其中代码片段如下:
public class RequiredLoginInterceptor implements MehtodInterceptor {
public Object invoke(MethodInvocation invoke) ...{
String username = RequestContext.getSession().get("username");
if (username == null) {
throw new RequiredLoginException("Please login first!");
}
return invoke.proceed();
}
}
2 在客户端需要调用的地方,重写onException方法:
var buffalo = new ...
buffalo.events["onException"] = function(fault) {
if (fault.code == "your.domain.RequiredLoginException") {
alert("请先登录!");
//或者其他处理
}
}
这样写完之后,所有出现exception的地方都会被这个方法来调用。因此本文开头的案例可以直接写为:
buffalo.remoteCall("bookService.listAllBooks", [], function(reply){ ... })
当需要集中处理某一类的异常的时候,这是一种相当简单的做法。buffalo已经提供了这个支持。然在在2.0发行版本中对这个特性存在小的缺陷,想要在2.0.1发布之前体会到这个便利,请直接svn,
或者访问
获得svn中的最新版本。
--
Michael Chen
--------------------------------
Blog: http://michael.nona.name
MSN: jzch...@hotmail.com
On 4/29/07, stone shao <ston...@gmail.com> wrote:
> 实现了一个类似消息总线的机制,可不可以真的做出这样的一个服务来呢?可以使组件之间、js和java之间(类似dwr的reversed
> ajax)通信?
>
> >
>