Struts2学习教程之拦截器机制与自定义拦截器

前言

拦截器体系是Struts2框架的重要组成部分,不夸张的说,没有拦截器体系,也就没有这么好用的Struts2框架了。在Struts2框架中,大量的拦截器完成了很多基础的功能,比如,params拦截器负责解析HTTP请求的参数,并设置Action的属性;servlet-config拦截器直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action;fileUpload拦截器则负责解析请求参数中的文件域,并将一个文件域设置成Action的三个属性......这一切的一切都是由内建的拦截器来完成的。所以,掌握了Struts2中拦截器的使用原理与方式,也就把握住了Struts2框架的“命脉”。

但是学习Struts2到现在,除了在web.xml中配置了一个StrutsPrepareAndExecuteFilter过滤器外,还没有接触其它的什么拦截器,那为什么我们的应用能够很好的运行呢?实际上,Struts2已经默认启用了大量通用的拦截器,只要配置Action的package继承了struts-default包,这些拦截器就会起作用。下面来看看Struts2内建的拦截器。

Struts2内建的拦截器

在Struts2框架中有很多内建的拦截器,这些拦截器几乎完成了Struts2框架70%的工作,包括解析请求参数,将请求参数赋值给Action属性等,Struts2这种灵巧的设计,很大程度上得益于拦截器的设计;当需要扩展Struts2功能时,只需要提供对应拦截器,并将它配置在Struts2容器中即可。

这些内建的拦截器以name-class对的形式配置在struts-default.xml文件中,其中name是拦截器名字,就是以后使用该拦截器的唯一标识;class则指定了该拦截器的实现类。对于这些内建的拦截器的详细介绍,请参见官方文档

配置拦截器

在Struts.xml文件中定义拦截器只需为拦截器类指定一个拦截器名,就完成了拦截器定义。定义拦截器使用<interceptor.../>,例如:

<!-- 通过指定拦截器名和拦截器实现类来定义拦截器 -->
<interceptor name="拦截器名" class="拦截器实现类">
  <param name="参数名">参数值</param>
</interceptor>

除此之外,还可以把多个拦截器连在一起组成拦截器栈,在拦截器中使用<interceptor-ref .../>来定义拦截器引用。例如:

<interceptor-stack name="拦截器栈一">
  <interceptor-ref name="拦截器一"/>
  <interceptor-ref name="拦截器二"/>
  ...
</interceptor-stack>

从程序结构上来看,拦截器栈由多个拦截器组成;但是从程序功能上来说,拦截器栈和拦截器是一样的,它们包含的方法都会在Action的execute方法执行之前自动执行。所以,我们完全可以把拦截器栈当成一个更大的拦截器。

由于拦截器栈和拦截器是一致的,所以拦截器栈中又可以包含拦截器栈,例如:

<interceptor-stack name="拦截器栈二">
  <interceptor-ref name="modelDriven"/>
  <interceptor-ref name="拦截器栈一"/>
</interceptor-stack>

使用拦截器

一旦定义了拦截器栈和拦截器后,就可以使用这个拦截器栈或拦截器来拦截Action了,拦截器的拦截行为将会在Action的execute方法执行之前被执行。

通过使用<interceptor-ref .../>元素可以在Action内使用拦截器,在Action中使用拦截器的配置语法与配置拦截器栈时引用拦截器的语法完全一样。例如:

<action name="login" class="com.jellythink.practise.LoginAction">
  <result name="error">/error.jsp</result>
  <result name="success">/welcome.jsp</result>
  <!-- 拦截器栈 -->
  <interceptor-ref name="defaultStack"/>
  <!-- 拦截器 -->
  <interceptor-ref name="test1"/>
  <!-- 带参数的拦截器 -->
  <interceptor-ref name="test2">
    <param name="key">动态参数</param>
  </interceptor-ref>
</action>

这样配置完成以后,在执行DownloadAction之前,这三个拦截器都会起作用。

配置默认拦截器

当配置一个包时,可以为其指定默认拦截器。一旦为某个包指定了默认的拦截器,如果该包中的Action没有显式指定拦截器,则默认的拦截器将会起作用。但是,一旦我们为该包中的Action显式应用了某个拦截器,则默认的拦截器不会起作用;如果该Action需要使用该默认拦截器,则必须手动配置该拦截器的引用。

只有当Action中没有显式应用拦截器时,该Action所在包的默认拦截器才会生效。

配置默认拦截器使用<default-interceptor-ref.../>元素,该元素作为<package.../>元素的子元素使用,为该包下的所有Action配置默认的拦截器。例如:

<default-interceptor-ref name="默认拦截器"/>

也可以为默认拦截器指定参数,例如:

<default-interceptor-ref name="默认拦截器">
  <param name="参数名">参数值</param>
</default-interceptor-ref>

在struts-default.xml文件中,配置了一个名为struts-default的抽象包,在该包中定义了名为defaultStack的默认拦截器引用。当我们定义的包继承struts-default包时,也继承了它的默认拦截器栈:defaultStack,这也意味着,如果我们不为Action显式地应用拦截器,则defaultStack拦截器栈会自动生效。

自定义拦截器

1>.添加一个类,让它继承AbstractInterceptor类,或者实现Interceptor接口

public class TimeInterceptor extends AbstractInterceptor {
/**
* 拦截器的核心方法intercept的返回值是一个字符串
*/
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
return "login";
}
}

2>.在struts.xml的package中添加interceptors子节点,并在它下面添加Interceptor节点

<package name="goods" namespace="/goods" extends="common-pkg">
<interceptors>
<interceptor name="timeInterceptor" class="com.wskj.struts2.interceptor.TimeInterceptor"></interceptor>
</interceptors>
</package>

3>.在想被拦截的action节点下添加子节点interceptor-ref

<action name="list_Category" class="com.wskj.struts2.controller.CategoryAction" method="list">
<interceptor-ref name="timeInterceptor"></interceptor-ref>
<result name="list" type="dispatcher">/pages/Category/list.jsp</result>
</action>

总结

这篇文章对Stuts2中的核心——拦截器进行了一个初步的总结,在后面的文章中,我们会实现一个我们自己的拦截器,并将这篇文章中总结的知识点进行运用。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Struts2拦截器 关于解决登录的问题

    拦截器的工作原理如图 拦截器是由每一个action请求(request)都包装在一系列的拦截器的内部,通过redirectAction再一次发送请求. 拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作. 我们可以让每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面. 接下来我们该如何定义一个拦截器: 自定义一个拦截器如下: 1.实现Interceptor接口或者继承AbstractInterceptor抽象类. 2

  • struts2拦截器_动力节点Java学院整理

    如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器): <interceptor-ref name="checkbox"> <param name="uncheckedValue">0</param> </interceptor-ref>

  • Java中的Struts2框架拦截器之实例代码

    本文实例为大家分享了Struts2框架拦截器实例的示例代码,供大家参考,具体内容如下 在看拦截器的小例子的前我们先来看看sturts2的原理 struts2自己是有拦截器的,通过拦截器可以拦截用户请求,并作出处理 拦截器作用有很多,譬如: 1.Action里面有个属性,这个属性我想在action执行之前改成别的值,可以用拦截器解决. 2.比如每个人执行action之前,我可以查看他们有没有这个权限执行这个action. 如果不设置拦截器,你要在每种action方法之前设置判定程序,非常繁琐. 拦

  • struts2自定义拦截器的示例代码

    题目:使用struts2自定义拦截器,完成用户登陆才能访问权限的实现 在session中存放user变量表示用户登陆,若user为空则用户没有登陆,反之登陆 显示提示信息(请先登录) 定义拦截器 在struts.xml中定义拦截器使用标签<Intercaptors>.<Intercapter>. <interceptors> <interceptor name="test" class="Intercaptor.Intercaptor

  • Struts2拦截器Interceptor的原理与配置实例详解

    一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故

  • 防止未登录用户操作—基于struts2拦截器的简单实现

    一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.我还记得很久以前我的做法:在某个jsp页面中查看session中是否有值(当然,在用户登录逻辑中会将用户名或者用户对象存入session中),如果session中用户信息为空,那么redirect 到登录页面.然后在除了登录页面外的其它所有需要验证用户已登录的页面引入这个jsp . 比如,我们将检查用户是否登录的代码放入一个jsp页面中,如 checkUser.jsp <%@

  • 详解Struts2拦截器机制

    Struts2的核心在于它复杂的拦截器,几乎70%的工作都是由拦截器完成的.比如我们之前用于将上传的文件对应于action实例中的三个属性的fileUpload拦截器,还有用于将表单页面的http请求参数设置成action中对应的属性的param拦截器等.总之,在整个Struts框架中拦截器的作用是相当大的,本篇将从以下几点详细介绍下有关Struts拦截器的内容: 拦截器在Struts中的作用 自定义拦截器实现类 配置拦截器(包含配置默认拦截器) 引用拦截器 配置拦截指定方法的拦截器 拦截器的拦

  • Struts2源码分析之ParametersInterceptor拦截器

    前言 ParametersInterceptor拦截器其主要功能是把ActionContext中的请求参数设置到ValueStack中,如果栈顶是当前Action则把请求参数设置到了Action中,如果栈顶是一个model(Action实现了ModelDriven接口)则把参数设置到了model中. 下面是该拦截器的doIntercept方法源码: @Override public String doIntercept(ActionInvocation invocation) throws Ex

  • Struts2学习教程之拦截器机制与自定义拦截器

    前言 拦截器体系是Struts2框架的重要组成部分,不夸张的说,没有拦截器体系,也就没有这么好用的Struts2框架了.在Struts2框架中,大量的拦截器完成了很多基础的功能,比如,params拦截器负责解析HTTP请求的参数,并设置Action的属性:servlet-config拦截器直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action:fileUpload拦截器则负责解析请求参数中的文件域,并将一个文件域设置成Actio

  • Struts2学习教程之输入校验示例详解

    前言 数据校验几乎是每个应用都要做的工作.用户输入的数据,发送到服务器端,天知道用户输入的数据是否是合法的,是否为恶意输入.所以一个健壮的应用系统必须对用户的输入进行校验,将非法的输入阻止在应用之外,防止这些非法的输入进入系统,从而保证系统的稳定性.安全性. 我们都知道,为了更好的用户体验,以及更高的效率,现在的Web应用都存在以下两重数据校验: 客户端数据校验 服务器端数据校验 对于客户端数据校验主要是通过JavaScript代码来完成:而对于服务器端数据校验是整个应用阻止非法数据的最后防线,

  • Struts2学习教程之自定义类型转换器的方法

    前言 为什么要在struts2中类型转换器? :struts2 只能够对java中的8种原态类型以及String.Date等常用类型提供自动转换. 但是这绝对不能满足我们的需求,如果我们想将页面的数据整合成一个javabean.到Action中去时Action得到的是一个对象,那么这个需求就需要我们使用类型转换器. 大部分时候,使用Struts2框架提供的内建的类型转换器和基于OGNL的类型转换器,就能满足大部分的类型转换需求:但是也存在一些特殊的情况下,可能需要将一个指定格式的字符串转换成一个

  • Struts2学习教程之入门小白的开始基础

    Struts2 概述: Struts2 是一个用来开发 MVC 应用程序的框架,他提供了 Web 应用程序开发过程中的一些常见问题的解决方案,比如对于用户输入信息合法性的验证,统一的布局,国际化等,既然有 Struts2 那么肯定有 Struts1,但是从本质上讲 Struts2 不是从 Struts1 扩展而来的,更应该说是一种换了品牌标签的 WebWork 更合适. struts1 VS struts2 struts1 里使用 ActionServlet 作为控制器,Struts2 使用过滤

  • 解决mybatis分页插件PageHelper导致自定义拦截器失效

    目录 问题背景 mybatis拦截器使用 使用方法: 注解参数介绍: setProperties方法 bug内容: 自定义拦截器部分代码 PageInterceptor源码: 解决方法: 解决方案一 调整执行顺序 解决方案二 修改拦截器注解定义 问题背景 在最近的项目开发中遇到一个需求 需要对mysql做一些慢查询.大结果集等异常指标进行收集监控,从运维角度并没有对mysql进行统一的指标搜集,所以需要通过代码层面对指标进行收集,我采用的方法是通过mybatis的Interceptor拦截器进行

  • SpringMVC自定义拦截器实现过程详解

    SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自定义一些拦截器来实现特点的功能. 过滤器与拦截器的区别:拦截器是AOP思想的具体应用. 过滤器 servlet规范中的一部分,任何java web工程都可以使用 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截 拦截器 拦截是SpringMVC框架自己的,只要使用SpringMVC框架的工程才能使用 拦截器只会拦截访问的控制方法,如果访问的是jsp/

  • SpringMVC超详细介绍自定义拦截器

    目录 1.什么是拦截器 2.自定义拦截器执行流程图 3.自定义拦截器应用实例 1.快速入门 2.注意事项和细节 3.Debug执行流程 4.多个拦截器 1.多个拦截器执行流程示意图 2.应用实例 3.主要事项和细节 1.什么是拦截器 说明 Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能. 自定义的拦截器必须实现 HandlerInterceptor 接口 自定义拦截器的三个方法 preHandle():这个方法在业务处理器处理请求之前被调用,在该方

  • Spring MVC中自定义拦截器的实例讲解

    1. 引言 拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter. 我们可以让普通的Bean实现HandlerIntercpetor接口或继承HandlerInterceptorAdapter类来实现自定义拦截器. 通过重写WebMvcConfigurerAdapter的addIntercetors方法来注册一个计算每一次请求的处理时间的拦截器. 2. 自定义拦截器的实现 2.1 定义拦截器 新建LogInterceptor类,并继承Ha

  • 浅谈Java自定义类加载器及JVM自带的类加载器之间的交互关系

    JVM自带的类加载器: 其关系如下: 其中,类加载器在加载类的时候是使用了所谓的"父委托"机制.其中,除了根类加载器以外,其他的类加载器都有且只有一个父类加载器. 关于父委托机制的说明: 当生成 一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统类加载器将成为该类加载器的父类加载器 下面,自定义类加载器.自定义的类加载器必须继承java.lang.ClassLoader类 import java.io.*; public class MyClassLoader extend

随机推荐