环绕过滤器能够在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