Struts2框架(三)
一、拦截器
1.基本概念
1)在Struts2中,把每一个功能都用一个个的拦截器实现;用户想用Struts的哪个功能的时候,可以自由组装使用。
2)Struts2中,为了方便用户对拦截器的引用,提供了拦截器的定义,里面可以包含多个拦截器。
3)Struts2中,如果用户没有指定执行哪些拦截器,Struts2有一个默认执行的栈:defaultStack;一旦如果用户有指定执行哪些拦截器,默认的拦截器就不会被执行。拦截器的设计,就是基于组件设计的应用。
2.拦截器配置举例
1)struts-default.xml文件中,定义了struts提供的所有拦截器!
//1. 定义拦截器以及拦截器栈 <interceptors> 1.1 拦截器定义 <interceptor name="" class="" /> 1.2 拦截器栈的定义 <interceptor-stack name="defaultStack"> 引用了上面拦截器(1.1) </interceptor-stack> </interceptors> 2. 默认执行的拦截器(栈) <default-interceptor-ref name="defaultStack"/>
2)API
|--Interceptor 拦截器接口
|--AbstractInterceptor 拦截器默认实现的抽象类;一般用户只需要继承此类即可继续拦截器开发。
|--ActionInvocation拦截器的执行状态,调用下一个拦截器或Action
3)拦截器与过滤器的区别:
a.拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
b.过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。
c.拦截器只能对Action请求起作用,而过滤器则可以对几乎所有的请求起作用。
d.拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
e.在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时调用一次。
二、自定义一个拦截器案例
步骤:1.写拦截器类 2.配置
/** * 自定义拦截器 * @author Jie.Yuan * */ public class HelloInterceptor implements Interceptor{ // 启动时候执行 public HelloInterceptor(){ System.out.println("创建了拦截器对象"); } // 启动时候执行 @Override public void init() { System.out.println("执行了拦截器的初始化方法"); } // 拦截器业务处理方法 (在访问action时候执行? 在execute之前执行?) @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("2. 拦截器,业务处理-开始"); // 调用下一个拦截器或执行Action (相当于chain.doFilter(..) // 获取的是: execute方法的返回值 String resultFlag = invocation.invoke(); System.out.println("4. 拦截器,业务处理-结束"); return resultFlag; } @Override public void destroy() { System.out.println("销毁...."); } }
<?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> <package name="hello" extends="struts-default"> <!-- 【拦截器配置】 --> <interceptors> <!-- 配置用户自定义的拦截器 --> <interceptor name="helloInterceptor" class="cn.itcast.a_interceptor.HelloInterceptor"></interceptor> <!-- 自定义一个栈: 要引用默认栈、自定义的拦截器 --> <interceptor-stack name="helloStack"> <!-- 引用默认栈 (一定要放到第一行)--> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 引用自定义拦截器 --> <interceptor-ref name="helloInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 【执行拦截器】 --> <default-interceptor-ref name="helloStack"></default-interceptor-ref> <!-- Action配置 --> <action name="hello" class="cn.itcast.a_interceptor.HelloAction"> <result name="success"></result> </action> </package> </struts>
拦截器执行流程:

启动:创建所有拦截器、执行init()
访问:先创建Action,再执行拦截器,最后拦截器放行,执行execute()。

浙公网安备 33010602011771号