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