Struts2 拦截器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2 拦截器相关的知识,希望对你有一定的参考价值。

                                                 
  × 过滤器与拦截器的区别
    1. 过滤器:理论上可以过滤任意内容,比如 html、jsp、servlet、图片路径
    2. 拦截器:拦截器只能拦截action

  × Servlet和Action的区别
    1. servlet默认第一次访问时候创建,仅创建一次,单实例对象
    2. action每次访问时候都创建,且创建多次,多实例对象

  × 当页面重合时,可以尝试在表单中设置表单打开方式 target="_parent" 
  × 在struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器
  × 只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器。
  × 当为包中的某个action显示指定了某个拦截器,则默认拦截器不会再起作用
  × 拦截器栈中各个拦截器的顺序很重要。
                                                

1. 拦截器概述
  Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能
    e.g. 数据转移,类型转换,数据校验

  拦截器在Action方法执行之前或者之后执行
  - 拦截器栈 
    · 从结构上看,拦截器栈相当于多个拦截器的组合
    · 从功能上看,拦截器栈也是拦截器

2. 拦截器工作原理
  1) 底层使用两个原理
    - AOP思想
      · AOP面向切面编程:不修改源代码方式扩展功能
    - 责任链模式
      · 责任链模式是Java设计模式其中的一种,与过滤链相似
  拦截器的执行过程是一个递归的过程
  技术分享

3. 自定义拦截器简介  ( Action类与拦截器需要通过配置文件的方式产生关联 )
  方式一:实现Interceptor接口
    - void init():初始化拦截器所需资源
    - void destroy:释放在init()中分配的资源
    - String intercept(ActionInvocation ai) throws Exception
      · 实现拦截器功能
      · 利用ActionInvocation参数获取Action状态
      · 返回result字符串作用逻辑视图

  方式二:继承AbstractInterceptor类 (该类底层实现了Interceptor接口)
    - 提供了init()和destroy()方法的空实现
    - 只需要实现intercept()方法即可

  方式三:继承MethodFilterInterceptor
    - 好处:能让action中某个方法不被拦截

× 拦截器 放行:return invocation.invoke() 

4. 配置action和拦截器的管理(注册拦截器)
  1) 在package标签中声明拦截器 (需要被拦截的action所在的package标签)
  2) 在action标签中使用声明的拦截器 (在具体的action标签内)
  3) 一旦使用自定义拦截器后,默认拦截器便会失效,必须在action内配置默认拦截器
    <interceptor-ref name = "defaultStack"></interceptor-ref>
  - 配置不被拦截的方法:MethodFilterInterceptor为例。(AbstractInterceptor/Interceptor需要写代码)
    在action中的interceptor标签中进行配置:excludeMethods(不包括的方法)
    <interceptor-ref name = "InterceptorName">
      <param name="excludeMethods">
        ActionMethodName1,ActionMethodName2,.....
      </param>
    </interceptor-ref>

5. Struts2 内置拦截器
  1) params拦截器:负责将请求参数设置为Action属性
  2) staticParams拦截器:将配置文件中action元素的子元素param参数设置为Action属性
  3) servletConfig拦截器:将源于Servlet API的各种对象注入到Action中,必须实现对应接口
  4) fileUpload拦截器:对文件上传提供支持,将文件和元数据设置到对应的Action属性中(内部使用Commons-FileUpload组件)
  5) exception拦截器:捕获异常,并且将异常映射到用户自定义的错误页面中
  6) validation拦截器:调用验证框架进行数据验证
  查看其他拦截器:struts-core-2-x-xx.jar --> struts-default.xml[e.g. struts-2.5.13\\src\\core\\src\\main\\resources ]

6. Struts的标签库 (常用标签)struts标签只能使用在jsp中
  < s:property />:和OGNL表达式在jsp页面中获取值栈中的数据
  < s:iterator />:获取值栈集合,并遍历集合
  < s:debug />:查看值栈结果和数据

  Struts2表单标签:

Html表单标签    Struts2表单标签
from(action、method、enctype(上传时使用))   <s:form action、method、enctype(上传时使用)></s:form>
html输入项标签        struts2输入项标签
<input name="Name" type="text" value="DefaultValue"> 普通输入项 <s:textfield name="标签名" label="前缀文本"></s:textfield>
<input name="Name" type="password" value="DefaultValue"> 密码输入项 <s:password name="标签名" label="前缀文本"></s:password>
<input name="Name" type="radio" value="DefaultValue1">
<input name="Name" type="radio" value="DefaultValue2">
单选框输入项 属性/显示值相同:<s:radio list="{‘value1‘,‘value2‘}" name="标签名" label="前缀文本"></s:radio>
属性/显示值不同:<s:radio list="#{‘key1‘:‘value1‘,‘key2‘:‘value2‘}" name="标签名" label="前缀文本"></s:radio>
<input name="Name" type="checkbox" value="DefaultValue"> 复选框输入项 属性/显示值相同:<s:checkboxlist list="{‘value1‘,‘value2‘}" name="标签名" label="前缀文本"></s:checkboxlist> 
属性/显示值不同:<s:checkboxlist list="#{‘key1‘:‘value1‘,‘key2‘:‘value2‘}" name="标签名" label="前缀文本"></s:checkboxlist>
file 文件上传项 <s:file name="标签名" label="前缀文本"></s:file>
hidden 隐藏项 <s:hidden name="标签名" value="Value"></s:hidden>
button 普通按钮 <s:submit value="提交"></s:submit>
submit 提交按钮
image 图片提交
reset 重置 <s:reset value="重置"> </s:reset>
select 下拉框输入项 属性/显示值相同:<s:select list="{‘value1‘,‘value2‘}" name="标签名" label="前缀文本"></s:select> 
属性/显示值不同:<s:select list="#{‘key1‘:‘value1‘,‘key2‘:‘value2‘}" name="标签名" label="前缀文本"></s:select>
textarea 文本域 <s:textarea name="标签名" label="前缀文本" rows="占用行数宽度" cols="占用列数宽度"></s:textarea>


      



























































以上是关于Struts2 拦截器的主要内容,如果未能解决你的问题,请参考以下文章

Struts2拦截器

Struts2拦截器

Struts2拦截器

在struts2拦截器中取得cookie

Struts2

Struts2学习笔记四:Struts2拦截器学习拦截器实现案例Struts2标签学习