本系列博客汇总在这里:Struts2 汇总
源码工程文件为:struts2_14
一、struts 拦截器介绍
- Struts2 的核心就是拦截器,param,modelDriven,validation,servletAPI 等等这些都是拦截器完成的功能。
- 服务器启动时实例化 StrustPrepareAndExecuteFilter,读取 struts 所有的配置文件,把 struts.xml 中的每一个 Action 实例化,当一个请求访问的时候,StrustPrepareAndExecuteFilter 会把请求拦截下来,匹配一个ActionMapper,然后 ActionMapper 创建 ActionProxy,然后去执行默认拦截器栈,在执行 Action,然后返回结果,然后默认拦截器再反向执行(做一些运行期的监控和清理工作,不是每一个拦截器都执行后置拦截),最后响应结果返回给页面。
二、自定义拦截器
自定义拦截器我们需要继承 AbstractInterceptor。
- 创建拦截器类。
package com.wyx.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("前置拦截执行...."); // 让拦截器向下走并且返回结果代码 String result = invocation.invoke(); System.out.println("后置拦截执行..."); return result; } }
- 拦截器的配置。
<package name="person" extends="struts-default" namespace="/person"> <!-- 拦截器配置 --> <interceptors> <interceptor name="myInterceptor" class="com.wyx.interceptor.MyInterceptor"></interceptor> </interceptors> <action name="weiyuxuan" class="com.wyx.action.PersonAction" method="save"> <result name="success">/success.jsp</result> <result name="input">/form.jsp</result> </action> <action name="delete" class="com.wyx.action.PersonAction" method="delete"> <!-- 引用拦截器 --> <interceptor-ref name="myInterceptor"></interceptor-ref> <result name="success">/success.jsp</result> <result name="input">/form.jsp</result> </action> </package>
- 我们从结果上可以看懂执行的顺序:前置拦截 --> 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.devMode" value="true"></constant>
<package name="myStruts-Default" extends="struts-default" abstract="true">
<interceptors>
<!-- 配置我们自己的拦截器 -->
<interceptor name="myInterceptor" class="com.wyx.interceptor.MyInterceptor"></interceptor>
<interceptor name="myInterceptor1" class="com.wyx.interceptor.MyInterceptor1"></interceptor>
<!-- 拦截器栈:是把多个拦截器集中到一起统一被引用 -->
<interceptor-stack name="wyxStack">
<!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="myInterceptor1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 把rlStack作为默认拦截器,只要继承了myStruts-Default,执行Action时就会自动先执行rlStack中的所有拦截器 -->
<default-interceptor-ref name="wyxStack" />
</package>
<package name="person" extends="myStruts-Default" namespace="/person">
<!-- 拦截器配置 -->
<action name="weiyuxuan" class="com.wyx.action.PersonAction" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
<action name="delete" class="com.wyx.action.PersonAction" method="delete">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
</package>
<package name="person1" extends="myStruts-Default" namespace="/person1">
<!-- 拦截器配置 -->
<action name="weiyuxuan1" class="com.wyx.action.PersonAction1" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
</package>
</struts>
四、排除 Action 的拦截
要想排除被拦截的 Action 的执行方法,拦截器需要继承 MethodFilterInterceptor。
package com.wyx.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor1 extends MethodFilterInterceptor
{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception
{
System.out.println("前置拦截执行1....");
// 让拦截器向下走并且返回结果代码
String result = invocation.invoke();
System.out.println("后置拦截执行1...");
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.devMode" value="true"></constant>
<package name="myStruts-Default" extends="struts-default" abstract="true">
<interceptors>
<!-- 配置我们自己的拦截器 -->
<interceptor name="myInterceptor" class="com.wyx.interceptor.MyInterceptor"></interceptor>
<interceptor name="myInterceptor1" class="com.wyx.interceptor.MyInterceptor1"></interceptor>
<!-- 拦截器栈:是把多个拦截器集中到一起统一被引用 -->
<interceptor-stack name="wyxStack">
<!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="myInterceptor1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 把rlStack作为默认拦截器,只要继承了myStruts-Default,执行Action时就会自动先执行rlStack中的所有拦截器 -->
<default-interceptor-ref name="wyxStack" />
</package>
<package name="person" extends="myStruts-Default" namespace="/person">
<!-- 拦截器配置 -->
<action name="weiyuxuan" class="com.wyx.action.PersonAction" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
<action name="delete" class="com.wyx.action.PersonAction"
method="delete">
<!-- 当前Action需要主动管理默认拦截器栈 -->
<interceptor-ref name="wyxStack">
<!--
指定要排除的拦截器
name:要排除的拦截器的名字.exludeMethods
元素:要排除的方法
-->
<param name="myInterceptor1.excludeMethods">delete</param>
</interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
</package>
<package name="person1" extends="myStruts-Default" namespace="/person1">
<!-- 拦截器配置 -->
<action name="weiyuxuan1" class="com.wyx.action.PersonAction1" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
</package>
</struts>
如有错误,欢迎指正!