1.struts拦截器介绍
Struts2的核心就 是拦截器,param,modelDriven,validation,servletAPI等等这些都是拦截器完成的功能。
服务器启动时实例化StrustPrepareAndExecuteFilter,读取struts所有的配置文件,把struts.xml中的每一个Action实例化,当一个请求访问的时候,StrustPrepareAndExecuteFilter会把请求拦截下来,匹配一个ActionMapper,然后ActionMapper创建ActionProxy,然后去执行默认拦截器栈,在执行Action,然后返回结果,然后默认拦截器再反向执行(做一些运行期的监控和清理工作,不是每一个拦截器都执行后置拦截),最后响应结果返回给页面。
2.自定义拦截器
我们需要继承AbstractInterceptor
创建拦截器类:
public class NyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("前置拦截执行....");
String result = invocation.invoke();
System.out.println("后置拦截执行....");
return result;
}
}
配置拦截器:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="hello1" extends="struts-default" namespace="/aaa">
<!-- 拦截器配置 -->
<interceptors>
<interceptor name="MyInterceptor" class="com.zy.interceptor.NyInterceptor"> </interceptor>
</interceptors>
<action name="zhang" class="com.zy.action.PersonAction" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
<action name="delete" class="com.zy.action.PersonAction" method="delete">
<!-- 引用拦截器 -->
<interceptor-ref name="MyInterceptor"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
</package>
</struts>
我们从结果上可以看懂执行的顺序:前置拦截--àction---页面执行--后置拦截
3.拦截器和拦截器栈的配置
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 拦截器配置 -->
<package name="myStruts-Default" extends="struts-default" abstract="true">
<interceptors>
<!-- 自己配置的拦截器 -->
<interceptor name="myInterceptor" class="com.zy.interceptor.MyInterceptor"></interceptor>
<!-- 拦截器栈:是把多个拦截器集中到一起统一被引用-->
<interceptor-stack name="zyStack">
<!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--
把zyStack作为默认拦截器,只要继承了myStruts-Default,执行Action时就会自动先执行rlStack中的所有拦截器
-->
<default-interceptor-ref name="zyStack"></default-interceptor-ref>
</package>
<package name="hello1" extends="myStruts-Default" namespace="/aaa">
<action name="zhang" class="com.zy.action.PersonAction" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
<action name="delete" class="com.zy.action.PersonAction" method="delete">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
</package>
</struts>
这里action都会被拦截, 不同包下的action也会被拦截
4.排除Action拦截器
如果我们不想让delete使用拦截,要想排除被拦截的Action的执行方法,拦截器需要继承MethodFilterInterceptor
public class MyInterceptor1 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("前置拦截执行....");
String result = invocation.invoke();
System.out.println("后置拦截执行....");
return result;
}
}
配置action的排除
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 拦截器配置 -->
<package name="myStruts-Default" extends="struts-default" abstract="true">
<interceptors>
<!-- 自己配置的拦截器 -->
<interceptor name="myInterceptor" class="com.zy.interceptor.MyInterceptor"></interceptor>
<interceptor name="myInterceptor1" class="com.zy.interceptor.MyInterceptor1"></interceptor>
<!-- 拦截器栈:是把多个拦截器集中到一起统一被引用-->
<interceptor-stack name="zyStack">
<!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="myInterceptor1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="zyStack"></default-interceptor-ref>
</package>
<package name="hello1" extends="myStruts-Default" namespace="/aaa">
<action name="zhang" class="com.zy.action.PersonAction" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
<action name="delete" class="com.zy.action.PersonAction" method="delete">
<!-- 当前Action需要主动管理默认拦截器栈 -->
<interceptor-ref name="zyStack">
<!--
指定要排除的拦截器
name:要排除的拦截器的名字.exludeMethods
元素:要排除的方法
-->
<param name="myInterceptor1.excludeMethods">delete</param>
</interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
</package>
</struts>
http://localhost:8080/strus2/aaa/delete
http://localhost:8080/strus2/aaa/zhang