1.拦截器介绍
struts2的核心就是拦截器,param,modelDriven,validation,servletAPI等等这些都是拦截器完成的功能。
服务器启动时实例化StrustPrepareAndExecuteFilter,读取struts所有的配置文件,吧struts.xml中的每一个Action实例化,当一个请求访问的时候,StrutsPrepareAndExecuteFilter会把请求拦截下来,匹配一个ActionMapper,然后ActionMapper创建ActionProxy,然后去执行默认的拦截器栈,在执行Action,然后返回结果,然后默认拦截器在反向执行(做一些运行期的监控和清理工作,不是每一个拦截器都执行后置拦截),最后把响应结果返回给页面。
2.自定义拦截器
自定义拦截器我们需要继承Abstractcetor
创建拦截器类:
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("前置拦截执行。。。");
// 让拦截器向下走并且返回结果代码
String invoke = actionInvocation.invoke();
System.out.println("后置拦截执行");
return invoke;
}
}
配置拦截器:
<package name="hello" extends="struts-default" namespace="/person">
<!--拦截器配置-->
<interceptors>
<interceptor name="myInterceptor" class="interceptor.MyInterceptor"></interceptor>
</interceptors>
<action name="hello" class="action.HelloWorld10" method="Save">
<!--引用拦截器-->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
可从执行结果看到执行顺序:前置拦截-》action->页面执行-》后置拦截。
3.拦截器和拦截器栈实战配置
<package name="mydefault" extends="struts-default" abstract="true">
<!--拦截器配置-->
<interceptors>
<!--自定义拦截器-->
<interceptor name="myInterceptor" class="interceptor.MyInterceptor"></interceptor>
<!--拦截器栈:是把多个拦截器集中到一起统一被继承引用-->
<interceptor-stack name="myStack">
<!--拦截器栈中要引用已经配置好的拦截器或者拦截器栈-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--把myStack作为默认拦截器,只要继承了mydefault,执行Action时就会自动先执行myStack中的所有拦截器-->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
</package>
<package name="hello" extends="mydefault" namespace="/person">
<action name="hello" class="action.HelloWorld10" method="Save">
<!--引用拦截器-->
<!-- <interceptor-ref name="myInterceptor"></interceptor-ref>-->
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>