来自:http://www.blogjava.net/nokiaguy/archive/2008/05/04/198071.html
Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。
Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口继承,在Intercepter接口中有如下三个方法需要实现:
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:
<package name="demo" extends="struts-default" > ... </package>
在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。这个默认的拦截器引用如下:
<default-interceptor-ref name="defaultStack"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
上面在defaultStack中引用的拦截器都可以在<action>中不经过引用就可以使用(如果在<action>中引用了任何拦截器后,要使用在defaultStack中定义的拦截器,也需要在<action>中重新引用,在后面将详细讲解)。
下面我们来看几个简单的拦截器的使用方法。
一、记录拦截器和execute方法的执行时间(timer)
timer是Struts2中最简单的拦截器,这个拦截器对应的类是com.opensymphony.xwork2.interceptor.TimerInterceptor。它的功能是记录execute方法和其他拦截器(在timer后面定义的拦截器)的intercept方法执行的时间总和。如下面的配置代码所示:
<action name="first" class="action.FirstAction">
<interceptor-ref name="logger"/>
<interceptor-ref name="timer" />
</action>
由于在timer后面没有其他的拦截器定义,因此,timer只能记录execute方法的执行时间,在访问first动作时,会在控制台输出类似下面的一条信息:
信息: Executed action [/test/first!execute] took 16 ms.
在使用timer拦截器时,需要commons-logging.jar的支持。将logger引用放到timer的后面,就可以记录logger拦截器的intercept方法和Action的execute方法的执行时间总和,代码如下:
<action name="first" class="action.FirstAction">
<interceptor-ref name="timer" />
<interceptor-ref name="logger"/>
</action>
大家可以使用如下的Action类来测试一下timer拦截器:
package action;
import com.opensymphony.xwork2.ActionSupport;
public class FirstAction extends ActionSupport
{
public String execute() throws Exception
{
Thread.sleep(1000); // 延迟1秒
return null;
}
}
如果只记录execute方法的执行时间,一般会输出如下的信息:
信息: Executed action [/test/first!execute] took 1000 ms.
二、通过请求调用Action的setter方法(params)
当客户端的一个form向服务端提交请求时,如有一个textfield,代码如下:
<s:form action="first" namespace="/test">
<s:textfield name="name"/>
<s:submit/>
</s:form>
在提交后,Struts2将会自动调用first动作类中的setName方法,并将name文本框中的值通过setName方法的参数传入。实际上,这个操作是由params拦截器完成的,params对应的类是com.opensymphony.xwork2.interceptor.ParametersInterceptor。由于params已经在defaultStack中定义,因此,在未引用拦截器的<action>中是会自动引用params的,如下面的配置代码,在访问first动作时,Struts2是会自动执行相应的setter方法的。
<action name="first" class="action.FirstAction">
... ...
</action>
但如果在<action>中引用了其他的拦截器,就必须再次引用params拦截器,Struts2才能调用相应的setter方法。如下面的配置代码所示:
<action name="first" class="action.FirstAction">
<interceptor-ref name="timer" />
<interceptor-ref name="params"/>
</action>
三、通过配置参数调用Action的setter方法(static-params)
static-params拦截器可以通过配置<params>标签来调用Action类的相应的setter方法,static-params拦截器对应的类是com.opensymphony.xwork2.interceptor.StaticParametersInterceptor。
下面配置代码演示了如何使用static-params拦截器:
<action name="first" class="action.FirstAction">
<interceptor-ref name="timer" />
<param name="who">比尔</param>
<interceptor-ref name="params"/>
<interceptor-ref name="static-params"/>
</action>
如果first动作使用上面的配置,在访问first动作时,Struts2会自动调用setWho方法将“比尔”作为参数值传入setWho方法。
四、使用拦截器栈
为了能在多个动作中方便地引用同一个或几个拦截器,可以使用拦截器栈将这些拦截器作为一个整体来引用。拦截器栈要在<package>标签中使用<interceptors>和子标签<interceptor-stack>来定义。代码如下:
<package name="demo" extends="struts-default" >
<interceptors>
<interceptor-stack name="mystack">
<interceptor-ref name="timer" />
<interceptor-ref name="logger" />
<interceptor-ref name="params" />
<interceptor-ref name="static-params" />
</interceptor-stack>
</interceptors>
<action name="first" class="action.FirstAction">
<param name="who">比尔</param>
<interceptor-ref name="mystack"/>
</action>
</package>
分享到:
相关推荐
### Struts2.0拦截器详解 #### 一、拦截器概述 在Struts2框架中,拦截器(interceptor)是一种非常重要的机制,用于在执行Action前后进行一系列预处理或后处理的操作。拦截器可以用来执行如参数拦截、类型转换、输入...
接下来,开发者可以根据具体需求进一步深入学习Struts 2.0 的高级特性和最佳实践,例如拦截器(Interceptor)、国际化(i18n)和支持AJAX等功能。Struts 2.0 不仅是一个强大的Web开发工具,而且也是一个学习现代Web...
5. **Struts2拦截器**:介绍Struts2的核心组件之一——拦截器,如何使用拦截器进行日志记录、权限验证等操作。 6. **结果类型与导航**:讲解如何配置结果类型,如Redirect、RedirectAction、Stream等,以及基于...
Struts2.0是Java Web开发中一个非常重要的框架,它是Apache软件基金会的Jakarta项目下的一个开源产品,主要用于构建MVC(Model-View-Controller)模式的应用程序。本入门案例将带你逐步了解如何使用Struts2.0来创建...
4. **拦截器**:拦截器是 Struts2.0 中的一个重要概念,它允许开发者编写自定义的行为,如认证、授权、事务管理等。 5. **配置**:Struts2.0 使用 XML 或注解来配置应用的各种行为和组件。 #### 四、Struts2.0 的...
07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX Struts2中用...
在第一章“Struts 2: the modern web application framework”中,作者们详细阐述了Struts 2.0相较于其他框架的优势所在,包括但不限于其对MVC架构的支持、强大的拦截器机制、灵活的数据类型转换以及与Spring、...
Struts 2是Struts 1的升级版,引入了更多的特性,如拦截器(Interceptor)、OGNL(Object-Graph Navigation Language)表达式语言和动态方法调用。它弥补了Struts 1在灵活性和可扩展性上的不足,使开发者能够更加...
3. **配置组件:** 通过可视化的界面配置Struts2.0的相关设置,如Action映射、拦截器等。 4. **代码生成:** 利用插件自动生成所需的代码,减少手动编码的时间。 5. **调试与测试:** 利用Eclipse内置的调试工具进行...
### Struts2.0框架技术详解 #### 一、MVC思想 **1.1 Model I 模式和 Model II 模式** ##### 1.1.1 Model I 模式 在Model I模式下,整个Web应用几乎全部由JSP页面组成。JSP页面不仅接收处理客户端请求,还直接...
一、Struts2.0标签概述 Struts2.0标签库是基于OGNL(Object-Graph Navigation Language)表达式的,它提供了丰富的标签,如`s:property`、`s:textfield`、`s:form`等,这些标签用于在JSP页面中动态地展示和操作数据,...
以上是对Struts2.0框架的概述,深入学习Struts2.0,还需要结合具体的代码示例和实际项目经验。提供的压缩包文件可能包含教程文档、示例代码以及配置文件,通过这些资源可以进一步了解和掌握Struts2.0的使用。
Struts2.0提供了一种更加灵活的控制器层,支持多种视图技术,如JSP、FreeMarker等,并引入了强大的拦截器(Interceptor)机制,增强了异常处理和国际化等功能。 二、Struts2.0的标签库 Struts2.0的标签库是其强大之...
- 配置`struts.xml`文件,该文件用于定义应用中的`Action`映射和拦截器栈等配置。 #### 步骤3:编写代码 - 创建JSP页面作为视图层。 - 编写业务逻辑类(如JavaBeans)作为模型层。 - 编写`Action`类作为控制器层,...
接下来,开发者可以进一步探索Struts2.0的其他高级特性,例如拦截器(Interceptors)、结果类型(Result Types)、国际化支持(Internationalization)等,以便更好地满足实际项目的需求。总之,Struts2.0凭借其强大的功能...
1. **Struts2.0框架概述** Struts2是Apache软件基金会的开源项目,它是对经典的Struts1框架的升级,具有更好的灵活性和扩展性。它整合了其他优秀框架如Hibernate和Spring,提供了全面的Action、结果类型、拦截器、...
### 搭建Struts2.0开发和运行环境 #### 一、概述 本文将详细介绍如何搭建Struts...随着对框架的深入学习,您可以进一步探索Struts 2.0提供的高级特性,如拦截器、结果类型等,从而实现更为灵活和高效的应用程序开发。
Struts2.0是Java Web开发中的一个强大框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建可维护性高、结构清晰的Web应用程序的工具。这个"struts2.0中文教程"压缩包显然是为了帮助初学者理解并...
一、Struts2.0概述 Struts2是Apache软件基金会的一个开源项目,它在Struts1的基础上进行了大量的改进和优化,提供更丰富的功能和更强的可扩展性。Struts2的核心组件包括Action、Result、Interceptor、ValueStack等,...