Struts
拦截器
概述
在struts2中,拦截器(Interceptor)是用来动态拦截Action执行的对象。
拦截器是struts2的一个重要特性,Struts2框架的大多数核心功能都是通过拦截器来实现的,像避免表单重复提交、类型转换、对象组装、验证、文件上传等,都是在拦截器的帮助下实现的。拦截器之所以称为“拦截器”,是因为它可以在Action执行之前和执行之后拦截调用
优点
Struts2将它的核心功能放到拦截器中实现,而不是分散到Action中实现,有利于系统的解耦,使得功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。
拦截器执行流程
流程简略图
流程详细图
自定义拦截器
实现Interceptor接口
public class MyInterceptor implements Interceptor { public void init() {} public void destroy() {} public String intercept(ActionInvocation invocation) throws Exception { return null; } }在package标签中配置Interceptors
<interceptors> <interceptor name="myInterceptor" class="org.itheima.struts.web.interceptor.MyInterceptor" /> </interceptors>在action标签中引用配置的Interceptor
<interceptor-ref name="myInterceptor"></interceptor-ref>完成Interceptor实现类中的intercept方法,完成拦截逻辑
public String intercept(ActionInvocation invocation) throws Exception { System.out.println("拦截前"); String result = invocation.invoke(); System.out.println("拦截后"); return result; }- invocation
Interceptor接口
- init方法
struts框架启动时调用此方法初始化拦截器
- destroy方法
struts框架停止时调用此方法销毁拦截器 - intercept方法
请求过程中拦截action - AbstractInterceptor抽象类
Interceptor接口的实现类,省去了init和destroy方法。
建议继承此抽象类来实现拦截器。
MethodInterceptor
方法级别的拦截<interceptor name="myMethodInterceptor" class="com.opensymphony.xwork2.interceptor.MethodFilterInterceptor">
<param name="excludeMethods">test01</param>
</interceptor>
通过配置param来设置需要拦截的方法或者不拦截的方法
- excludeMethods不拦截某些方法
- includeMethods拦截某些方法
interceptor-stack配置
拦截器栈:一组拦截器。拦截器栈的配置:在package标签的interceptors标签中配置
<interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="a" /> <interceptor-ref name="b" /> </interceptor-stack> </interceptors>- 拦截器执行的顺序
自上而下的顺序执行。先配置的先执行
标签库
概述
Struts2标签库是一个比较完善,且功能强大的标签库,它将所有标签都统一到一个标签库中,从而简化了标签的使用,它还提供主题和模板的支持,极大地简化了视图页面代码的编写。分类
- 普通标签
- 流程控制标签
- 数据标签
- UI标签
- form标签
struts标签的引入(掌握)
在jsp页面中引入标签库
<%@ taglib uri="/struts-tags" prefix="s" %>
流程控制标签(掌握)
if标签,elseif标签,else标签<% request.setAttribute("score", 70); %> <!-- if elseif else --> <!-- 流程控制标签可以直接访问值栈 --> <s:if test="#request.score == 100"> 满分 </s:if> <s:elseif test="#request.score > 90"> 优秀 </s:elseif> <s:elseif test="#request.score > 80"> 良好 </s:elseif> <s:elseif test="#request.score > 60"> 及格 </s:elseif> <s:else> 不合格 </s:else>注意:
struts的流程标签只支持 值栈操作,不支持EL表达式
iterator标签<% List<String> list = new ArrayList<String>(); list.add("张三"); list.add("李四"); list.add("王五"); list.add("赵六"); request.setAttribute("list", list); %> <s:iterator var="item" begin="0" end="2" status="s" step="2" value="#request.list"> var : <s:property value="#item" /> <br /> s: <s:property value="#s.count" /> <br /> </s:iterator><% Map<String, String> map = new HashMap<String, String>(); map.put("a", "张三"); map.put("b", "李四"); map.put("c", "王五"); map.put("d", "赵六"); request.setAttribute("map", map); %> <s:iterator var="item" status="s" value="#request.map"> var : <s:property value="#item" /> <br /> s: <s:property value="#s.count" /> <br /> </s:iterator>- var: 用来声明循环的条目对象名称
- id: 用来声明循环的条目对象名称
- id和var不能共存,如果用var声明需要通过#访问,id声明不需要#
- begin:开始遍历的索引。只适用于List遍历。
- end:遍历的结束索引。只适用于List遍历。
- step:遍历的步长。只适用于List遍历。
- status:计数器对象
- count 已经遍历的集合元素个数
- index 当前遍历元素的索引值
- odd 是否奇数行
- even 是否偶数行
- first 是否第一行
- last 是否最后一行
数据标签
property标签:ognl表达式显示<s:property value="'hi'.length()" />a标签<s:a href="control.jsp">访问jsp</s:a> <s:a namespace="/tags" action="action01">访问action</s:a> <s:a namespace="/tags" action="action01" method="test01">访问action的method</s:a>- href:指定url路径。可以省去上下文路径。
- action:请求的动作名称(类名)
- namespace:动作名称所在的名称空间
- id:指定id
- method:指定Action调用方法。要使用时,需要开启动态方法调用的常量配置。
url标签<s:url namespace="/tags" action="action01" var="url"></s:url> <a href="<s:property value='#url'/>">url标签</a>>
- action:动作名称
- namespace:名称空间
- var:取值是一个普通字符串。会把action和namespace组成一个url作为value,把var的取值作为一个key,存入到值栈的上下文中
debug标签:调试值栈结构的<s:debug />date标签<% request.setAttribute("date", new Date()); %> data标签 :<s:date name="#request.date" format="yyyy/MM/dd hh:mm:ss" var="vdate"/> <br /> vdate : <s:property value="#vdate"/> br /> $vdate : ${vdate}- name属性:取值是一个ognl表达式,表示要格式化的日期对象
- format属性:指定格式
- var属性:取值是一个普通的字符串。 把格式化好的日期字符串作为value,把var的取值作为key。存入到值栈的上下文区中
表单标签(了解)
表单标签通用属性
| 属性名 | 主题 | 数据类型 | 说明 |
|---|---|---|---|
| title | simple | String | 设置表单元素的title属性 |
| disabled | simple | String | 设置表单元素是否可用 |
| label | xhtml | String | 设置表单元素的label属性 |
| labelPosition | xhtml | String | 设置label元素的显示位置,可选值 : top 和 left(默认) |
| name | simple | String | 设置表单元素的name属性,与Action中的属性名对应 |
| value | simple | String | 设置表单元素的值 |
| cssClass | simple | String | 设置表单元素的class |
| cssStyle | simple | String | 设置表单元素的style属性 |
| required | xhtml | Boolean | 设置表单元素为必填项 |
| requiredpositon | xhtml | String | 设置必填标记(默认为*)相对于label元素的位置,可选值:left 和right(默认) |
| tabindex | simple | String | 设置表单元素的tabindex属性 |
form标签:表单
| 属性名 | 是否必填 | 数据类型 | 说明 |
|---|---|---|---|
| action | 否 | String | 指定提交时对应的action,不需要action后缀 |
| enctype | 否 | String | HTML表单enctype属性 |
| method | 否 | String | HTML表单method属性 |
| namespace | 否 | String | 所提交action的命名空间 |
textfield标签:文本输入框password标签:密码框
| 属性名 | 说明 |
|---|---|
| name | 用于指定密码输入框的名称 |
| size | 用于指定密码输入框的显示宽度,以字符数为单位 |
| MaxLength | 用于限定密码输入框的最大输入字符串个数 |
| showPassword | 是否显示初始值,即使显示也仍为密文显示,用掩码代替 |
radio标签:单选框
| 属性名 | 是否必填 | 数据类型 | 说明 |
|---|---|---|---|
| list | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成单选框中的集合 |
| listKey | 否 | String | 指定集合对象中的哪个属性作为选项的value |
| listValue | 否 | String | 指定集合对象中的哪个属性作为选项的内容 |
checkbox标签:单个多选框checkboxlist标签:多选框
| 属性名 | 是否必填 | 数据类型 | 说明 |
|---|---|---|---|
| list | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成多选框的集合 |
| name | 否 | String | 指定该元素的name |
| listKey | 否 | String | 生成checkbox的value属性 |
| listValue | 否 | String | 生成checkbox后面显示的文字 |
* select标签:下拉选择框
| 属性名 | 是否必填 | 数据类型 | 说明 |
|---|---|---|---|
| list | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成下拉框的集合 |
| listKey | 否 | String | 生成选项的value属性 |
| listValue | 否 | String | 生成选项的显示文字 |
| headerKey | 否 | String | 在所有的选项前再加额外的一个选项作为其标题的value值 |
| headerValue | 否 | String | 显示在页面中header选项的内容 |
| multiple | 否 | Boolean | 指定是否多选,默认为 false |
| emptyOption | 否 | Boolean | 是否在标题和真实的选项之间加一个空选项 |
| size | 否 | Int | 下拉框的高度,即最多可以同时显示多少个选项 |
file标签:文件上传列表textarea标签:文本区域hidden标签:隐藏标签submit标签:提交标签reset标签:重置标签
struts2注解开发(了解)
开发流程
- 导入struts的环境jar,导入注解的插件jar
struts2-convention-plugin-x.x.x.jar - 在action类中配置注解标签
注解
- Namespace 注解
用来模拟package标签的
namespace属性的。
需要在Action的类上配置。
- ParentPackage 注解
用来模拟package标签的extends属性的。
需要在Action的类上配置。- Action注解
用来模拟action标签的。需要在action类中的action方法上配置。
* value注解参数用来模拟action标签中的name属性
* results注解参数用来模拟action标签内的result标签- Result注解
用来模拟result标签的。可以在action类上配置或者在action方法上配置。
action类上配置就是全局的。action方法上的配置是局部的。
* name注解参数用来模拟result标签的name属性
* type注解参数用来模拟result标签的type属性
* locaction注解参数用来模拟result标签的标签内容
* params注解参数用来模拟result标签的内部param标签
本文介绍了Struts2中的拦截器概念及其配置方式,包括自定义拦截器、拦截器栈等,并详细讲解了Struts2标签库的使用方法,如流程控制标签、数据标签和UI标签等。
2万+

被折叠的 条评论
为什么被折叠?



