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标签