浅谈Struts2的拦截器

拦截器:

      在谈拦截器之前,我觉得有必要提一下和过滤器的区别。

      1. 首先拦截器是Struts2自己的,只有用了Struts2框架才可以使用拦截器,而过滤器是servlet规范中的一部分,任何java web工程都可以使用;

2. 其次拦截器只可以拦截Action,而过滤器理论上可以拦截任何东西(jsp,html,css,image或者js等)。

拦截器配置(在Struts2.xml中进行):

 1 <package name="default" extends="struts-default">
 2            .......
 3 <!-- 首先得声明一个拦截器,名字随便,类名是你自己编写的拦截器类的路径 -->
 4     <interceptors>
 5             <interceptor name="priceInterceptor" class="interceptor.priceInterceptor"></interceptor>
 6      </interceptors>
 7            .......
 8 <!-- 然后在某一action中使用这个拦截器 -->
 9 <action name="updateBook" class="action.BookAction" method="update">
10 <!-- 不仅要调用自己定义的拦截器,系统默认的拦截器也需要手动调用 -->
11             <interceptor-ref name="defaultStack"></interceptor-ref>
12             <interceptor-ref name="priceInterceptor"></interceptor-ref>
13             <result name="success">/updateBook.jsp</result>
14             <result name="error">/updateBook.jsp</result>
15 </action>
16 </package>

当有请求Action时,拦截器链(存放的是一系列的拦截器)就会进行拦截,拦截的流程是这样:顺序执行拦截器,每到一个拦截器都会找到该拦截器对应的类,并实例化这个类,然后执行类中的intercept方法(这个方法里面存放的是拦截逻辑),如果通过了,就会执行下一个拦截器,直到通过整个拦截器链,最后才会执行action方法。

1 return arg0.invoke();

上面这行代码就是 通过了当前的拦截器,去执行下一个拦截器的代码(在intercept方法中)。

这里提一下为什么要有下面这行代码:因为如果你自己不定义拦截器,他并不是没有拦截器了,还存在系统默认的拦截器,当你没有自己定义拦截器时,这些默认的拦截器会在你请求时自动调用,但是当你自己定义了拦截器,并且在某一个action中调用了这个拦截器,那么这个action并不会自动调用系统默认的拦截器,需要你手动调用。

1 <interceptor-ref name="defaultStack"></interceptor-ref>

下面是我的工程下默认的拦截器:(interceptor-ref 就是那些系统默认的拦截器,需要被调用)

 1 <interceptor-stack name="defaultStack">
 2                 <interceptor-ref name="exception"/>
 3                 <interceptor-ref name="alias"/>
 4                 <interceptor-ref name="servletConfig"/>
 5                 <interceptor-ref name="i18n"/>
 6                 <interceptor-ref name="prepare"/>
 7                 <interceptor-ref name="chain"/>
 8                 <interceptor-ref name="scopedModelDriven"/>
 9                 <interceptor-ref name="modelDriven"/>
10                 <interceptor-ref name="fileUpload"/>
11                 <interceptor-ref name="checkbox"/>
12                 <interceptor-ref name="multiselect"/>
13                 <interceptor-ref name="staticParams"/>
14                 <interceptor-ref name="actionMappingParams"/>
15                 <interceptor-ref name="params">
16                   <param name="excludeParams">dojo\..*,^struts\..*</param>
17                 </interceptor-ref>
18                 <interceptor-ref name="conversionError"/>
19                 <interceptor-ref name="validation">
20                     <param name="excludeMethods">input,back,cancel,browse</param>
21                 </interceptor-ref>
22                 <interceptor-ref name="workflow">
23                     <param name="excludeMethods">input,back,cancel,browse</param>
24                 </interceptor-ref>
25                 <interceptor-ref name="debugging"/>
26             </interceptor-stack>

好,拦截器的配置讲完了,下面来看看拦截器的3种创建方式:(可能这部分提到拦截器的配置前面讲更好)

这里的3种创建方式也就是3中编写拦截器对应类的方法。

1. 实现拦截器接口 Interceptor

    该接口中有3个方法init,intercept,destory,我们只需要把我们的拦截逻辑写进intercept中去就行了;

  2.继承抽象类 AbstractInterceptor

    我们只需要重写intercept就行了,因为AbstractInterceptor帮我们实现了Interceptor接口中的init()、destory()方法;

  3.继承抽象类MethodFilterInterceptor

    我们需要重写doIntercept方法,这种是我们常用的方式(推荐大家也用这种方式来创建),因为这种创建方式有个很大的优点,就是可以指定action中拦截的方法(通俗的讲就是该拦截的拦截,不该拦截的不拦截),下面举个例子:

 1 <action name="updateBook" class="action.BookAction" method="update">
 2         <interceptor-ref name="defaultStack"></interceptor-ref>
 3         <interceptor-ref name="priceInterceptor">
 4             <!-- 在这里加上不拦截的方法 -->
 5             <param name="这个随意1">方法名1</param>
 6             <param name="这个随意2">方法名2</param>
 7          </interceptor-ref>
 8          <result name="success">/updateBook.jsp</result>
 9          <result name="error">/updateBook.jsp</result>
10 </action>

拦截器的配置与创建都讲完了,希望对你有所帮助!

原文地址:https://www.cnblogs.com/baikaizhuliangshui/p/11622111.html

时间: 2024-11-06 03:42:31

浅谈Struts2的拦截器的相关文章

【struts2】拦截器基础

1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Struts2系统架构图中关于拦截器的部分,如下图所示: 这个图清晰的描述出了拦截器的运行地位,就是用来负责在Action执行之前和Result执行之后处理一些功能的类.也就是说,上图示意了有3个拦截器的类,分别是Interceptor1.Interceptor2和Interceptor3,它们分别执行不同的

谈谈 Struts2 的拦截器

套话 相信很多人都用过 Struts2 了,当然,对 Struts2 的原理也都比较了解.之前在一个项目中就已经用到了,当初的理解也仅仅是局限在应用的层面上,对于更深层次的原理.机制,了解的并不是很多.现在回过头来,再看 Struts2 的拦截器,相比之前的理解,又别有另一番滋味. 理解 Struts2 的拦截器,英文名为 Interceptor ,至于为什么中文要翻译为拦截器,我想这一定是有原因的,肯定不是一拍脑门,就叫拦截器了(它必定有什么含义在里边).从字面的意思,就是在发送请求的时候,有

struts2 在拦截器进行注入(根据Action是否实现自定义接口)

例如:常常在Action中都需要获取当前登录的User,就需要获取Session,然后从Session获取当前登录的User,因为这些步骤都是重复操作,可以想办法在拦截器中进行实现,可以自定义一个接口,只要你的Action实现了这个接口,就在自定义拦截器中进行注入.即从拦截器中获取Session,然后设置进行注入. 简单的例子: 一个自定义接口,只要Action实现这个接口,就在拦截器中进行注入 package com.atguigu.surveypark.struts2; import com

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

Struts2 自定义拦截器时Action无法接收到参数

问题:自定义拦截器,没有添加defaultStack导致Action无法接受到参数 解决办法: 方法一,添加defaultStack,然后在Action中引用 自定义的stack,其实defaultStack中也有细分如basicStack等 <interceptors> <interceptor name="checkUser" class="com.common.interceptor.UserInfoInterceptor"></

Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)

参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspectj的execution表达式自定以切面的位置. 比如下面的配置service方法执行日志: 1 <!-- 系统日志 --> 2 <bean id="logUtils" class="com.tabchanj.crm.utils.SystemLogUtils&q

浅谈struts2标签中的2个很常用的标签的用法(radio和select)

1.如图所示我们需要在前台的页面通过radio和select将对应的数据库中的数据显示到选项当中,这也是我们做项目中经常需要做的,动态的显示,而不是静态的显示. 首先我们需要在页面中导入struts2的标签库<%@ taglib prefix="s" uri="/struts-tags"%>,一般的我们不用struts2写一个radio代码如下: <input type="RADIO" name="sex"

【struts2】拦截器的工作模拟实现

Main.java /** * 书本:[struts2] * 功能:模拟拦截器的工作,实际就是递归的思想 * 文件:Main.java * 时间:2014年11月9日20:04:55 * 作者:cutter_point */ public class Main { public static void main(String [] args) { new ActionInvocation().invoke(); } } ActionInvocation.java /** * 书本:[struts

【跟我一步一步学Struts2】——拦截器

前言 前面提到过拦截器.而且说拦截器仅仅能拦截Action.这里拦截器的调用体现了责任链模式.为什么说体现了责任链模式呢? 以下的一段话说的非常明确: Struts2将整个运行划分成若干同样类型的元素,每一个元素具备不同的逻辑责任,并将它们纳入到一个链式的数据结构中.而每一个元素又有责任负责链式结构中下一个元素的运行调用. 从代码重构的角度来看,实际上是将一个复杂的系统,分而治之.从而使得每一个部分的逻辑可以高度重用并具备高度可扩展性. 拦截器的原理 Struts2框架的拦截器是动态配置的,假设