Struts2 拦截器栈的开发和使用

Struts2 的拦截器栈,就是把使用多个拦截器拦截相同的Action。

1 编写目标Action类

package com.yiidian.action;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 需要拦截的目标Action
 * @author 一点教程(yiidian.com)
 */
public class Demo1Action extends ActionSupport{

	@Override
	public String execute() throws Exception {
		System.out.println("目标对象-----3.Demo1Action");
		return SUCCESS;
	}
}

2 定义两个拦截器

第一个拦截器代码

package com.yiidian.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
 * 拦截器
 * @author 一点教程(yiidian.com)
 */
public class MyInterceptor1 implements Interceptor{

	@Override
	public void destroy() {
	}

	@Override
	public void init() {
	}

	//拦截的方法
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("1号执行拦截器--1.在执行action之前");
		
		//执行action的方法
		invocation.invoke();
		
		System.out.println("1号执行拦截器--5.在执行action之后");
		
		return null;
	}

}

第二个拦截器代码

package com.yiidian.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
 * 拦截器
 * @author 一点教程(yiidian.com)
 */
public class MyInterceptor2 implements Interceptor{

	@Override
	public void destroy() {
	}

	@Override
	public void init() {
	}

	//拦截的方法
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("2号执行拦截器--2.在执行action之前");
		
		//执行action的方法
		invocation.invoke();
		
		System.out.println("2号执行拦截器--4.在执行action之后");
		
		return null;
	}

}

3 struts.xml配置拦截器栈

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">	
<struts>
	<package name="base" extends="struts-default" namespace="/">
		<!-- 1.定义拦截器 -->
		<interceptors>
			<interceptor name="myInterceptor1" class="com.yiidian.interceptor.MyInterceptor1"/>
			<interceptor name="myInterceptor2" class="com.yiidian.interceptor.MyInterceptor2"/>
			
			<!-- 2.定义拦截器栈 -->
			<interceptor-stack name="myStack">
				<interceptor-ref name="myInterceptor1"/>
				<interceptor-ref name="myInterceptor2"/>
			</interceptor-stack>
		</interceptors>
		
		<action name="demo1" class="com.yiidian.action.Demo1Action">
			<!-- 3.使用拦截器栈 -->
		    <interceptor-ref name="myStack"/>	
			<result>/succ.jsp</result>
		</action>
	</package>
	
</struts>

4 访问测试

http://localhost:8080/ch02_03_struts2_interceptor/demo1.action

 

 

从控制台输出看到先执行MyInterceptor1,再执行MyInterceptor2,为什么会按照这样的顺序呢?原因是,我们配置拦截器的时候,先配置MyInterceptor1,再配置MyInterceptor2

<!-- 2.定义拦截器栈 -->
<interceptor-stack name="myStack">
	<interceptor-ref name="myInterceptor1"/>
	<interceptor-ref name="myInterceptor2"/>
</interceptor-stack>

如果希望顺序反过来,把配置反过来就可以啦!

5 Struts2默认拦截器

Struts2预定义了一个名称叫defaultStack的拦截器栈,这个拦截器的功能非常多,包括请求参数封装,文件上传解析,国际化等。

struts-default.xml:

这里有个需要注意的问题:我们刚才自定义了拦截器栈,这样会覆盖掉defaultStack拦截器栈的功能。所以我们需要自行把defaultStack加入到自定义拦截器的前面

<interceptor-stack name="myStack">
	<!-- 手动添加Struts2的默认拦截器栈 -->
	<interceptor-ref name="defaultStack"/>
	<interceptor-ref name="myInterceptor1"/>
	<interceptor-ref name="myInterceptor2"/>
</interceptor-stack>

 

源码下载:https://pan.baidu.com/s/18K9wMpFvdqrtMZ3-AtMusg

热门文章

优秀文章