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>
热门文章
优秀文章