HelloInterceptor.java:
package com.struts.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
* 拦截器:普通的 java 类只要实现了 interceptor 接口,就被成为 拦截器;
* 1、在 struts2 中,把每一个功能都用一个个的拦截器实现,用户想用 struts 的哪个功能的时候,可以自由组装使用;
* 2、在 struts2 中,为了方便用户对拦截器的使用,提供了拦截器栈的定义,里面可以包含多个拦截器;
* 3、在 struts2 中,如果用户没有指定执行哪些拦截器,struts2 有一个默认执行的栈,defaultStack;
* 注意:如果用户自己指定了执行哪些拦截器,那么默认的拦截器栈就不会被执行;
*
* struts-default.xml 文件中,定义了 struts 提供的所有拦截器!
* <interceptors>
* <interceptor name="" class="" /> 拦截器定义
*
* <interceptor-stack name="defaultStack"> 拦截器栈的定义
* 引用了上面定义的拦截器(<interceptor/>)
* </interceptor-stack>
* </interceptors>
*
* 默认执行的拦截器:
* <default-interceptor-ref name="defaultStack"/>
*/
public class HelloInterceptor implements Interceptor {
// 服务器启动的时候执行
public HelloInterceptor(){
System.out.println("1、创建了拦截器对象");
}
// 服务器启动的时候执行
@Override
public void init() {
System.out.println("2、启动了拦截器初始化方法");
}
// 拦截器业务处理方法:每次访问 action 的时候执行
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("4、拦截器:业务处理开始");
// 执行下一个拦截器;
// 或者执行 action 中的业务处理方法,并获取方法的返回值
String result = actionInvocation.invoke();
System.out.println("6、拦截器:业务处理结束");
return result;
}
// 服务器关闭的时候调用
@Override
public void destroy() {
System.out.println("7、拦截器销毁");
}
}
HelloAction.java:
package com.struts.interceptor;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport {
// 访问 action 的时候执行:先创建 action 对象,再执行 拦截器;
public HelloAction(){
System.out.println("3、创建 action 对象");
}
@Override
public String execute() throws Exception {
System.out.println("5、执行 action 中的业务处理方法");
return SUCCESS;
}
}
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="interceptor" extends="struts-default">
<!-- 拦截器配置 -->
<interceptors>
<!-- 配置自定义拦截器 -->
<interceptor name="helloInterceptor" class="com.struts.interceptor.HelloInterceptor"/>
<!-- 配置拦截器栈 -->
<interceptor-stack name="helloStack">
<!-- 引用默认栈:一定要放到第一行(先引用的先执行) -->
<interceptor-ref name="defaultStack"/>
<!-- 引用自定义拦截器 -->
<interceptor-ref name="helloInterceptor"/>
</interceptor-stack>
</interceptors>
<!-- 配置默认执行的 拦截器栈 -->
<default-interceptor-ref name="helloStack"/>
<!-- 配置 action -->
<action name="hello" class="com.struts.interceptor.HelloAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
拦截器执行流程: