采用自定义事件来统一异常处理

5 views
Skip to first unread message

Michael Chen

unread,
Apr 28, 2007, 4:09:43 AM4/28/07
to am...@googlegroups.com
[注意:本文仅限于buffalo 2.0.1+版本,在写本文时,请下载svn中的buffalo.js来进行使用]

在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,
或者访问

http://buffalo.svn.sourceforge.net/svnroot/buffalo/trunk/buffalo-demo/src/main/webapp/script/buffalo.js

获得svn中的最新版本。

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

宋来

unread,
Apr 28, 2007, 4:11:36 AM4/28/07
to am...@googlegroups.com
先 顶 再 看
 
 
---老大速度真快啊!

stone shao

unread,
Apr 28, 2007, 9:07:13 PM4/28/07
to am...@googlegroups.com
实现了一个类似消息总线的机制,可不可以真的做出这样的一个服务来呢?可以使组件之间、js和java之间(类似dwr的reversed ajax)通信?

Michael Chen

unread,
Apr 28, 2007, 9:38:03 PM4/28/07
to am...@googlegroups.com
reversed ajax...在实际的开发环境中,是怎么使用的呢?

On 4/29/07, stone shao <ston...@gmail.com> wrote:
> 实现了一个类似消息总线的机制,可不可以真的做出这样的一个服务来呢?可以使组件之间、js和java之间(类似dwr的reversed
> ajax)通信?
>
> >
>

Reply all
Reply to author
Forward
0 new messages