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 拦截器的主要内容,如果未能解决你的问题,请参考以下文章