`

谈谈我对Struts2拦截器的理解

阅读更多

——杨波(请勿随意转载)

        Struts2设计的灵巧性,在很大程度上得益于拦截器设计,当需要扩展Struts2功能时,只需要提供对应拦截器,并将它配置在Struts2容器中即可;如果不需要该功能时,也只需要取消该拦截器的配置即可。这种可插拔式的设计,正是软件设计领域一直孜孜以求的目标。拦截器几乎完成了Struts2框架70%的工作,包括解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等。

 

由于struts2拦截器的可插拔设计,有人形象的把拦截器比作抽屉,而struts2只是一个空的容器,正是有了这些抽屉,可以随时插入,又可以随时抽出,struts2的可扩展性和灵活性才得到充分的体现。拦截器的这种机制是按照AOP来设计的,AOP与OOP并不冲突,反而是对OOP的一个很好的完善和补充。

Struts2官网上有这样一幅图,从这张图上可以看出,Struts2 架构的Action被一个或者多个拦截器,或者一个拦截器栈包围着,用户的请求会被这些拦截器所拦截。


 

刚开始用struts2的时候一直不明白为什么要加上extends="struts-default"这句话,现在终于恍悟,原来struts2中也内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default. xml文件中,其中name是拦截器的名字,就是以后使用该拦截器的唯一标识;class则指定了该拦截器的实现类,如果我们定义的package继承了Struts2的默认struts-default包,则可以自由使用下面定义的拦截器,否则必须自己定义这些拦截器。

Interceptor

Name

Description

Alias Interceptor

alias

在不同的请求之间将参数在不同的名字间转换,请求内容不变.

Chaining Interceptor

chain

让前面一个Action的属性可以被后一个Action访问

Checkbox Interceptor

checkbox

Adds automatic checkbox handling code that detect an unchecked checkbox and add it as a parameter with a default (usually 'false') value. Uses a specially named hidden field to detect unsubmitted checkboxes. The default unchecked value is overridable for non-boolean value'd checkboxes.

Cookie Interceptor

cookie

使用配置的name、value来设置cookies

Conversion Error Interceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中

Create Session Interceptor

createSession

自动地创建HttpSession,用来为需要使用到HttpSession的拦截器服务

DebuggingInterceptor

debugging

提供不同的调试用的页面来展示内部的数据状况

Execute and Wait Interceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面

Exception Interceptor

exception

将异常定位到一个页面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的locale

Logger Interceptor

logger

输出Action的名字

Message Store Interceptor

store

存储或者访问实现ValidationAware接口的Action类出现的消息、错误、字段错误等。

Model Driven Interceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在ValueStack中

Scoped Model Driven Interceptor

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model,调用Action的setModel方法将其放入Action内部

Parameters Interceptor

params

将请求中的参数设置到Action中去

Prepare Interceptor

prepare

如果Action实现了Preparable,则该拦截器调用Action类的prepare方法

Scope Interceptor

scope

将Action状态存入Session和Application的简单方法

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问

Static Parameters Interceptor

staticParams

从struts.xml文件中将<action>中的<param>下的内容设置到对应的Action中

Roles Interceptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行

Timer Interceptor

timer

输出Action执行的时间

Token Interceptor

token

通过Token来避免双击

Token Session Interceptor

tokenSession

和Token Interceptory一样,不过双击的时候把请求的数据存储在Session中

Validation Interceptor

validation

使用action-validation.xml文件中定义的内容校验提交的数据

Workflow Interceptor

workflow

调用Action的validate的方法,一旦有错返回,重新定位到INPUT页面

Parameter Filter Interceptor

N/A

从参数列表中删除不必要的参数

Profiling Interceptor

profiling

通过参数激活profile

当然除了可以使用系统提供的默认的拦截器,我们也可以自定义自己的拦截器。Struts2框架提供了一个定义拦截器的接口Interceptor接口。同时Struts2框架也提供了一个可以用于过滤拦截Action方法的类MethodFilterInterceptor。该类有两个属性excludeMethods和includeMethods。分别代表指定拦截器拒绝拦截的方法和需要拦截的方法。例:

public classFilterInterceptor extends MethodFilterInterceptor{
 private String name;
 protected String doIntercept(ActionInvocation arg0)throws Exception{
  //HelloWorld hw=(HelloWorld)arg0.getAction();
  String res=arg0.invoke();
  return res;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }

}

再看看struts.xml配置文件
    <package name="struts2tutoial"extends="struts-default">
        <interceptors>
           <interceptor name="MyInterceptor"class="interceptor.MyInterceptor"/>
           <interceptor name="FilterInterceptor"class="interceptor.FilterInterceptor"/>
        </interceptors>
        <actionname="HelloWorld" class="helloWorld">
           <result>/helloWorld.jsp</result>
           <interceptor-ref name="defaultStack"/>
            <interceptor-refname="MyInterceptor"/>
           <interceptor-ref name="FilterInterceptor">
               <param name="includeMethods">***</param>
               <param name="excludeMethods">***</param>
           </interceptor-ref>
        </action>
    </package>

那么struts2拦截器的流程到底是怎样的呢,struts2的官网上也给出了如下这张图片,看过这张图片就应该对struts2拦截器的运行机制明白多了

分享到:
评论

相关推荐

    struts2整合fileupload

    要实现这个功能,你需要在`struts.xml`配置文件中启用该插件,并设置相应的拦截器。例如: ```xml &lt;constant name="struts.multipart.parser" value="jakarta"/&gt; &lt;param name="maximumSize"&gt;10485760...

    Struts2环境配置与基本操作演示

    Struts2是一个强大的Java Web框架,它为构建MVC(模型-视图-控制器)架构的应用程序提供了全面的支持。...在实际开发中,你还可以探索更高级的主题,如拦截器、结果类型、动态方法调用等,以提升应用的功能和性能。

    自定义拦截器与Ation传递复杂对象到Request源码

    在Java Web开发中,拦截器(Interceptor)是一个重要的概念,特别是在Spring MVC和Struts2等框架中被广泛应用。拦截器可以理解为一种预处理和后处理机制,它可以在请求到达控制器之前或者离开控制器之后进行一些操作...

    基于struts2的音乐播放器

    此外,Struts2还提供了丰富的拦截器,用于日志记录、权限验证、异常处理等。在音乐播放器项目中,可能需要一个拦截器来确保用户登录后才能播放歌曲。拦截器可以通过struts.xml配置文件添加到Action或整个包。 总的...

    struts2+hibernate小项目

    此外,Struts2还引入了拦截器(Interceptor)机制,可以实现如日志记录、权限验证等功能,极大地增强了框架的可扩展性。模板技术如FreeMarker或JSP用于生成动态视图,使得界面与业务逻辑分离,有利于团队协作和代码...

    介绍struts2及struts2开发环境的搭建

    3. **拦截器(Interceptor)**:这是Struts2的一大亮点,拦截器是一个可以预处理请求并在Action执行前后进行额外操作的组件。例如,登录检查、日志记录、性能监控等都可以通过拦截器实现,增强了框架的可扩展性。 4...

    struts2+hibernate+Mysql开发图书管理系统

    在实际开发过程中,可能会遇到一些小问题,比如SQL语句的优化、Struts2拦截器的配置、Hibernate的懒加载问题等,但这些问题通常不会影响系统的正常运行,通过调试和查阅文档,都可以得到解决。 总的来说,"Struts2+...

    基于struts2的文件上传+过滤器

    Struts2提供了`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器来处理文件上传。这个拦截器会自动解析请求中的multipart/form-data类型的数据,将文件内容转换为Action类中的属性。你需要在Action类中...

    struts2课程

    本课程将深入讲解Struts2的核心特性,包括验证、拦截器、国际化、Excel文档下载、OGNL表达式、二级联动以及SSH(Spring、Struts2、Hibernate)集成等关键知识点。 首先,我们来谈谈"struts2验证"。在Struts2中,...

    struts2获取参数,解决乱码,跳转

    最后,我们来谈谈Struts2的页面跳转。在Action类的执行方法返回一个字符串,这个字符串代表了结果的名称,Struts2会根据这个名字找到对应的Result类型来决定如何处理响应。默认的Result类型是`dispatcher`,它会将...

    java+struts2实现员工管理

    接下来,我们谈谈Struts2的配置文件——struts.xml。这是整个系统的核心配置,定义了Action类、结果页面、拦截器等。例如,为了实现员工删除功能,struts.xml文件中可能有如下配置: ```xml ...

    struts帮助文档

    此外,还可以配置拦截器,这是Struts2的一大特色,它们可以用来实现如日志记录、权限检查、事务管理等功能。 过滤器Dispatcher是Struts2的入口点,它负责拦截所有HTTP请求,然后根据配置将请求分发到相应的Action。...

    struts2+spring+hibernate分页,事务,自定义切面

    在Struts2中,我们可以利用Interceptor(拦截器)和Result(结果类型)来实现。通常,我们会创建一个拦截器来计算当前页码、总页数等信息,然后在Action类中处理这些信息,最后通过一个自定义的Result类型将分页信息...

    struts1+EJB3整合(AOP控制权限)

    同时,Struts1的拦截器可以与EJB3的实体交互,以执行一些预处理或后处理任务。在配置文件(如struts-config.xml或web.xml)中,需要适当地声明和配置这些组件,以实现它们之间的依赖和交互。 综上所述,这个项目...

    Struts+数据结构

    Struts 2作为Struts的升级版,引入了更多特性,如更强大的拦截器(Interceptor)、OGNL表达式语言以及更灵活的配置机制。 接下来,我们谈谈数据结构。数据结构包括数组、链表、栈、队列、树、图等基本类型。这些...

    Spring+Struts+Hibernate 丽星私立管帐系统

    Struts2的拦截器(Interceptor)机制使得我们可以在Action执行前后添加自定义的逻辑,增强了系统的灵活性和可扩展性。 再来谈谈Hibernate,这是一个强大的对象关系映射(Object-Relational Mapping,ORM)框架,...

    struts 对应的API 及相应的扩展包org.common.lang.*等及对应的源代码

    7. **Interceptor**:拦截器是Struts2引入的重要概念,它们在Action调用之前或之后执行,提供了AOP(面向切面编程)的功能,如日志记录、权限检查等。 接下来,我们谈谈`org.common.lang.*`这个扩展包。这通常指的...

    学生个人信息管理系统

    Struts2的优势在于其强大的拦截器机制,可以方便地添加日志、权限控制等功能,同时支持多种结果类型,如JSP、FreeMarker、Velocity等,极大地提高了开发效率。 其次,Hibernate是一个优秀的对象关系映射(ORM)框架...

    权限控制功能总结.rar

    在许多框架中,如Spring MVC或Struts2,拦截器是一种可插拔的机制,可以拦截和修改控制器方法的调用。在权限控制中,拦截器常用于在请求到达实际处理逻辑之前进行权限检查。例如,一个拦截器可以检查请求路径是否...

Global site tag (gtag.js) - Google Analytics