Struts2(12)_Struts2 拦截器

本系列博客汇总在这里: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>

在这里插入图片描述

如有错误,欢迎指正!

发布了448 篇原创文章 · 获赞 210 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36260974/article/details/103750847