struts2官方教程学习总结——拦截器

拦截器的工作流程:

 struts2官方教程学习总结——拦截器

下面的就是当一个请求到struts2的时候,框架所做的事情:

框架首先寻找去调用哪一个Action class去处理request,并且会通过action配置去寻找要执行的过滤器。

现在过框架会生成一个ActionInvocation的实例并且会去执行invoke()方法。此时此刻,框架会将控制权转交给ActionInvocation以进行将来的处理。

ActionInvocation会将action和interceptors进行封装,并且知道拦截器将以怎样的次序被调用。

ActionInvocation会调用拦截器栈中的第一个拦截器的interceptor方法,下面就是LoggingInterceptor’s的interceptor()方法,它包含有以下的内容:

public String intercept(ActionInvocation invocation) throws Exception

{

//Pre processing

logMessage(invocation, START_MESSAGE);

String result = invocation.invoke();

//Post processing

logMessage(invocation, FINISH_MESSAGE);

return result;

}

正如所代码所展示的,当logMessage()方法被调用后,ActionInvocation会调用下一个拦截器的interceptor()方法,就这样循环重复着,直到栈中最后一个拦截器被调用。

当所有的拦截器都被调用之后,就会去调用action类中的指定的处理函数(默认为execute()方法),执行完后会返回一个结果对应的视图信息。

但是如果任何一个验证器检验出有错误发生,在这种情况下,请求就会被终止。以后的过滤器都不会被调用,并且action也不会被执行。同时控制流就会发生改变:到现在为止,已经执行的过滤器就会以相反的顺序传递处理结果,然后返回给用户。

现在我们考虑一下当执行完action后的操作,同样看LoggingMessage中的intercept方法,当执行完invoke方法后,就会继续执行下面的一个logMessage(invocation, FINISH_MESSAGE);然后将结果返回给前一个执行的过滤器,依次循环,所有的过滤器都完成,然后将结果返回给用户。

 

通过框架的过滤器机制,我们可以进行如下的操作和好处:

1、 更加灵活的操作用户的请求

2、 可以专心的处理用户的请求(即专注于Action中的处理请求函数,及其后台操作)

3、 加强了核心代码的可读性以及可重用性

4、 更加方便的进行项目测试

5、 我们可以只增加自己需要的过滤器到过滤器栈中去处理用户的请求