Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 254|回复: 0

[struts学习]Struts2讲义(5):拦截器在Struts2中的缺省应用

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 02:01:59 | 显示全部楼层 |阅读模式
    通过前几章介绍,读者应该明白在Web项目中,客户先在视图界面提交一个HTTP请求,在Struts2的ServletDispatcher接 收请求时,Struts2会查找配置文件,如struts.xml文件。根据xml文件中定义的拦截器配置,会去调用拦截器。如果配置了拦截器栈,则根据 拦截器在拦截器栈中的前后顺序,一一进行调用。而Struts2自带的源代码中也提供了缺省的拦截器配置。
       

       
          在第一章中,笔者曾经介绍了Struts2的各个文件夹内容,也说过在src文件夹中包含了Struts2的所有底层实现源代码,读者们可到自己安装Struts2的文件路径下找到srccoresrcmain
    esources,其中有个名为struts-default.xml。它 是Struts2自定义的配置文件,其中有关拦截器的配置代码正是本节需要介绍的拦截器在Struts2中的缺省应用。
       

       
    技术要点
       
    本节代码说明Struts2中的拦截器缺省配置及其各拦截器的功能。
       

       
         拦截器和拦截器栈的定义配置格式。
         
    Struts2定义的各个拦截器功能介绍。
         演示代码
       

         
          
          
           java 代码
          
          
          
          <!------------------------ 文件名: struts-default.xml----------------------------->   
          <interceptors>   
            <interceptor name="alias"   
                  class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>   
                      ……………   
           <interceptor name="roles"   
          class="org.apache.struts2.interceptor.RolesInterceptor" />   
             
                      <! ―基础栈 -->   
                      <interceptor-stack name="basicStack">   
                          <interceptor-ref name="exception"/>   
                          <interceptor-ref name="servletConfig"/>   
                          <interceptor-ref name="prepare"/>   
                          <interceptor-ref name="checkbox"/>   
                          <interceptor-ref name="params"/>   
                          <interceptor-ref name="conversionError"/>   
                      </interceptor-stack>   
             
                      <! ―校验和工作流栈 -->   
                      <interceptor-stack name="validationWorkflowStack">   
                          <interceptor-ref name="basicStack"/>   
                          <interceptor-ref name="validation"/>   
                          <interceptor-ref name="workflow"/>   
                      </interceptor-stack>   
             
                      <! ―文件上传栈-->   
                      <interceptor-stack name="fileUploadStack">   
                          <interceptor-ref name="fileUpload"/>   
                          <interceptor-ref name="basicStack"/>   
                      </interceptor-stack>   
             
                      <! ―模型驱动栈  -->   
                      <interceptor-stack name="modelDrivenStack">   
                          <interceptor-ref name="modelDriven"/>   
                          <interceptor-ref name="basicStack"/>   
                      </interceptor-stack>   
             
                      <! ―action链栈 -->   
                      <interceptor-stack name="chainStack">   
                          <interceptor-ref name="chain"/>   
                          <interceptor-ref name="basicStack"/>   
                      </interceptor-stack>   
             
                      <!-- i18n 国际化栈 -->   
                      <interceptor-stack name="i18nStack">   
                          <interceptor-ref name="i18n"/>   
                          <interceptor-ref name="basicStack"/>   
                      </interceptor-stack>   
                 </interceptors>   
          
         
        <!------------------------文件名: struts-default.xml----------------------------->
    <interceptors>
                <interceptor name="alias"
                    class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
                ……………
                <interceptor name="roles"
    class="org.apache.struts2.interceptor.RolesInterceptor" />
                <!―基础栈 -->
                <interceptor-stack name="basicStack">
                    <interceptor-ref name="exception"/>
                    <interceptor-ref name="servletConfig"/>
                    <interceptor-ref name="prepare"/>
                    <interceptor-ref name="checkbox"/>
                    <interceptor-ref name="params"/>
                    <interceptor-ref name="conversionError"/>
                </interceptor-stack>
                <!―校验和工作流栈 -->
                <interceptor-stack name="validationWorkflowStack">
                    <interceptor-ref name="basicStack"/>
                    <interceptor-ref name="validation"/>
                    <interceptor-ref name="workflow"/>
                </interceptor-stack>
                <!―文件上传栈-->
                <interceptor-stack name="fileUploadStack">
                    <interceptor-ref name="fileUpload"/>
                    <interceptor-ref name="basicStack"/>
                </interceptor-stack>
                <!―模型驱动栈  -->
                <interceptor-stack name="modelDrivenStack">
                    <interceptor-ref name="modelDriven"/>
                    <interceptor-ref name="basicStack"/>
                </interceptor-stack>
                <!―action链栈 -->
                <interceptor-stack name="chainStack">
                    <interceptor-ref name="chain"/>
                    <interceptor-ref name="basicStack"/>
                </interceptor-stack>
                <!-- i18n国际化栈 -->
                <interceptor-stack name="i18nStack">
                    <interceptor-ref name="i18n"/>
                    <interceptor-ref name="basicStack"/>
                </interceptor-stack>
           </interceptors>[/code]
        代码解释
       
    (1)在xml配置文件中配置拦截器和拦截器栈都是以“<interceptors>”开头,以 “</interceptors>”结尾。
       

       
    (2)配置拦截器的格式如上面代码所示以“<interceptor/>”格式显示,其中两个属性name是拦截器名字,另一个是对应的类路径,因为之前也已经说过其实拦截器也是一个普通的Java对象。
       

       
    (3)拦截器栈的格式是以“<interceptor-stack >”开头,以“</interceptor-stack>”结尾。其中属性name是拦截器栈名字。在 “<interceptor-stack >”和“</interceptor-stack>”之间可以设置拦截器。如代码所示格式为“<interceptor-ref />”,其中name属性也是拦截器名字。如果系统运行拦截器栈都是按照拦截器栈中定义的拦截器先后顺序执行拦截器。请读者仔细查看那个基础栈配 置,其中配置的拦截器都是在xml文件中定义的拦截器。
       

       
    注意:拦截器栈中不单单可以配置拦截器,它甚至还可以配置拦截器栈。比如在“validationWorkflowStack” 拦截器栈中就配置了“basicStack”拦截器栈。这样的话,配置的子拦截器栈中的拦截器也会被执行。这就类似于父集合和子集合的概念。
       

       
    (4)针对struts-default.xml文件中各个拦截器配置,笔者一一做介绍,因为如果使用Struts2在Web项目开发中,这些拦截器都是默认缺省的会被执行的。因此了解一下Struts2底层的拦截器到底实现什么功能对开发人员来说是很有帮助的。
       
    alias:对于HTTP请求包含的参数设置别名。
       

       
    autowiring:将某些JavaBean实例自动绑定到其他Bean对应的属性中。有点类似Spring的自动绑定,在Spring部分会详细说 明。
       

       
    Chain:在Web项目开发中,以前使用Struts开发时候经常碰到两个Action互相传递参数或属性的情况。该拦截器就是让前一Action的参 数可以在现有Action中使用。
       

       
    conversionError:从ActionContext中将转化类型时候发生的错误添加到Action的值域错误中,在校验时候经常被使用到来显 示类型转化错误的信息。
       

       
    cookie:从Struts2.0.7版本开始,可以把cookie注入Action中可设置的名字或值中。
       

       
    createSession:自动创建一个HTTP的Session,尤其是对需要HTTP的Session的拦截器特别有用。比如下面介绍的 TokenInterceptor。
       

       
    debugging:用来对在视图间传递的数据进行调试。
       

       
    ExecAndWait:不显式执行Action,在视图上显示给用户的是一个正在等待的页面,但是Action其实是在“背后”正在执行着。该拦截器尤其在对进度条进行开发的时候特别有用。
       

       
    exception:将异常和Action返回的result相映射。
       

       
    fileUpload:支持文件上传功能的拦截器。
       

       
    i18n:支持国际化的拦截器。
       

       
    logger:拥有日志功能的拦截器。
       

       
    modelDriven:Action执行该拦截器时候,可以将getModel方法得到的result值放入值栈中。
       

       
    scopedModelDriven:执行该拦截器时候,它可以从一个scope范围检索和存储model值,通过调用setModel方法去设置 model值。
       
    params:将HTTP请求中包含的参数值设置到Action中。
       

       
    prepare:假如Action继承了Preparable接口,则会调用prepare方法。
       

       
    staticParams:对于在struts.xml文件中Action中设置的参数设置到对应的Action中。
       

       
    scope:在session或者application范围中设置Action的状态。
       

       
    servletConfig:该拦截器提供访问包含HttpServletResquest和HttpServletResponse对象的Map的方 法。
       

       
    timer:输出Action的执行时间。
       

       
    token:避免重复提交的校验拦截器。
       

       
    tokenSession:和token拦截器类似,但它还能存储提交的数据到session里。
       

       
    validation:运行在action-validation.xml(校验章节将介绍)文件中定义的校验规则。
       

       
    workflow:在Action中调用validate校验方法。如果Action有错误则返回到input视图。
       

       
    store:执行校验功能时候,该拦截器提供存储和检索Action的所有错误和正确信息的功能。
       

       
    checkbox:视图中如果有checkbox存在的情况,该拦截器自动将unchecked的checkbox当作一个参数(通常值为 “false”)记录下来。这样可以用一个隐藏的表单值来记录所有未提交的checkbox,而且缺省unchecked的checkbox值是布尔类型 的,如果视图中checkbox的值设置的不是布尔类型,它就会被覆盖成布尔类型的值。
       

       
    profiling:通过参数来激活或不激活分析检测功能,前提是Web项目是在开发模式下。(涉及到调试和性能检验时使用)
       
    roles:进行权限配置的拦截器,如果登录用户拥有相应权限才去执行某一特定Action。
       

       
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-17 11:35 , Processed in 0.427210 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表