`
stworthy
  • 浏览: 522662 次
  • 来自: ...
社区版块
存档分类
最新评论

利用etmvc的环绕过滤器控制事务边界

 
阅读更多

环绕过滤器能够在Action执行之前和之后执行一段代码,相比前置过滤器和后置过滤器而言更加强大。可以为Action设置多个环绕过滤器,通过在控制器上进行注解:

@AroundFilters({
    @AroundFilter(execute=A.class),
    @AroundFilter(execute=B.class)
})
public class ApplicationController extends Controller{

环绕过滤器可以接受only和except参数以控制在那些Action上执行。

注意前置和后置过滤器的execute是执行的方法名称,而环绕过滤器的execute是一个类,这个类必须实现AroundHandler接口,或者继承AbstractAroundHandler类。

多个环绕过滤器的执行是嵌套的,如上例的执行顺序如下:

A.before

    B.before

        Action

    B.after

A.after

 

环绕过滤器可以处理身份验证,错误处理,日志处理,事务控制等,比如在Action中操作数据库的代码,如果需要事务控制,可以写上

try{
    beginTransaction();
    ...
    commit();
}
catch(Exception ex){
    rollback();
}

之类的代码,但利用环绕过滤器可以有更优雅的做法,这时Action代码保持不变,注解加上事务过滤器就好,过滤器代码如下所示:

public class TranFilter extends AbstractAroundHandler{
    @Override
    public boolean before(Controller controller) throws Exception{
        ActiveRecordBase.beginTransaction();
        return true;
    }
    @Override
    public boolean after(Controller controller) throws Exception{
        if (controller.getException() == null){
            ActiveRecordBase.commit();
        }
        else{
            ActiveRecordBase.rollback();
        }
        return true;
    }
}

before方法保证执行在Action 之前,after则执行在Action之后,且只要before执行成功,保存一定会执行after。这样,在需要事务控制的控制器上,只要加上

@AroundFilter(execute=TranFilter.class, only={"update","create"}) 

这样的代码就行了。

 

关于etmvc的详细资料,请访问www.etmvc.cn

 

分享到:
评论
1 楼 LewJun 2012-10-09  
mark,又学习了。

相关推荐

Global site tag (gtag.js) - Google Analytics