Struts 2的拦截器

preview
需积分: 0 1 下载量 137 浏览量 更新于2011-01-12 收藏 193KB PPT 举报
Struts2 拦截器是该框架的核心组件之一,主要负责在Action执行前后插入额外的功能处理。拦截器是基于Java的动态代理机制实现的,它允许开发者在不修改Action类本身的情况下,增加新的功能或者改变Action的行为。下面将详细阐述Struts2拦截器的概念、原理、配置以及使用方法。 **概念和原理** Struts2的拦截器是一个动态拦截Action调用的对象,它允许在Action执行前或执行后插入自定义代码。拦截器通过拦截器链(Interceptor Chain)的形式工作,即一系列拦截器按照预设顺序进行调用。当请求到达Struts2的ServletDispatcher时,框架会解析配置文件,实例化相应的拦截器,并形成一个调用列表,按照列表顺序逐一执行。 **拦截器链** 拦截器链是多个拦截器按照特定顺序组成的序列。每个拦截器都有机会在Action执行前后执行其定制逻辑。如果一个拦截器决定阻止Action的执行,那么后续的拦截器都不会被调用。拦截器链的配置允许开发者灵活地调整业务流程。 **拦截器实现原理** 当请求到达Struts2时,框架会查找配置文件,如`struts-default.xml`,其中包含了默认的拦截器及其配置。这些拦截器实例化后形成一个列表,然后由ServletDispatcher按照配置的顺序逐一调用。拦截器的调用过程类似于链式调用,每个拦截器执行完毕后会传递控制权给下一个拦截器,直到整个链执行完成。 **拦截器的配置** 1. **自定义拦截器**: 开发者可以通过实现`com.opensymphony.xwork2.interceptor.Interceptor`接口或继承`AbstractInterceptor`抽象类来创建自定义拦截器。 2. **配置拦截器**: 在Struts2的配置文件(如`struts.xml`或`struts-default.xml`)中,使用`<interceptors>`标签定义拦截器,`<interceptor>`标签定义单个拦截器,通过`name`属性指定拦截器名,`class`属性指定拦截器类全路径。 3. **拦截器栈**: 使用`<interceptor-stack>`标签定义拦截器栈,它可以包含多个`<interceptor-ref>`标签,用于引用已定义的拦截器,并定义它们的执行顺序。 4. **引用拦截器**: 在`<action>`标签内,使用`<interceptor-ref>`标签引用拦截器栈或单个拦截器,定义Action应使用的拦截器列表。 5. **参数配置**: 可以通过`<param>`标签为拦截器传递参数,例如:`<param name="key">value</param>`。 **拦截器配置示例** ```xml <package name="default" extends="struts-default"> <interceptors> <interceptor name="timer" class="..."/> <interceptor name="logger" class="..."/> <interceptor-stack name="myStack"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> </interceptor-stack> </interceptors> <action name="login" class="tutorial.Login"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <result name="input">/login.jsp</result> <result name="success" type="redirectAction">/secure/home</result> </action> </package> ``` 在这个例子中,`login` Action会先经过名为`timer`的拦截器,然后是`logger`拦截器,最后才执行Action本身。如果在拦截器栈`myStack`中定义了拦截器,也可以通过引用`myStack`来一次性应用多个拦截器。 **内置拦截器** Struts2提供了许多内置的拦截器,例如: - `fileUpload`:处理文件上传。 - `i18n`:提供国际化支持。 - `params`:将请求参数注入到Action中。 开发者可以根据需要选择或自定义拦截器,以满足不同的业务需求。拦截器使得Struts2更加灵活和可扩展,是构建企业级Web应用的重要工具。