Struts2 学习笔记
struts2控制标签
控制标签主要是提供操作集合和有条件的生成内容的功能,与Struts1.x中的逻辑标签的功能相似,但使用要简单方便得多。其中主要包括9个标签。下面来介绍一下。
if 标签
if标签是Struts2框架提供的一个流程控制标签,针对某一逻辑的多种条件进行处理,通常表现为“如果满足某种条件,就进行某种处理,否则就进行另一种处理”,与Java语言相同,Struts2框架的标签同样支持if、else if、else的语句判断,其标签为如下:
<s:if>
是基本流程控制标签,用于在满足某个条件下的情况下,执行标签体中的内容,标签可以单独使用。
<s:elseif>
此标签需要与标签配合使用,在不满足标签中条件的情况下,判断是否满足标签中的条件,如果满足此标签中的条件,那么将执行标签体中的内容。
<s:else>
此标签需要与标签或标签配合使用,当不满足所有条件的情况下,可以使用标签来执行此标签中的内容。
注意事项:> 标签可以单独使用,用于在满足某个条件下的情况下,执行标签体中的内容,而标签与标签不可以单独使用。
与Java语言相同,Struts2框架的流程控制标签同样支持if…else if…else的条件语句判断,其使用方法如下:
<s:if test="表达式(布尔值)">
输出结果
</s:if>
<s:elseif test="表达式(布尔值)">
输出结果
</s:elseif>
可以使用多个<s:elseif>
....
<s:else>
输出结果
</s:else>
标签与标签都有一个名称为test的属性,此属性用于设置标签的判断条件,它的值是一个布尔类型的条件表达式。在上述代码中,可以包含多个标签,针对不同的条件执行不同的内容。
标签与标签都用在满足某种条件的情况下,执行指定的标签体内的内容,所以,使用标签与标签需要为其指定一定的条件表达式,而标签是在不满足所有条件的情况下执行标签体内的内容,所以,使用标签不需要为其指定条件表达式。
terator标签
iterator标签是Struts2提供的一个迭代数据的标签,它可以根据循环条件,遍历数组和集合类中的所有或部分数据。如通过iterator标签迭代一个集合或者数组,可以迭代出集合或数组的所有数据,也可以指定迭代数据的起始位置、步长以及终止位置来迭代集合或数组中的部分数据。
表1 iterator标签属性及说明
名 称
是否必须
类 型
说 明
begin
可选
Integer
指定迭代数组或集合的起始位置,它的默认值为0
end
可选
Integer
指定迭代数组或集合的结束位置,它的默认值为集合或数组的长度
status
可选
String
迭代过程中的状态
step
可选
Integer
设置迭代的步长,如果指定此值,那么,每一次迭代后,索引值将在原索引值的基础上增加step值,它的默认值为1
value
可选
String
指定迭代的集合或数组对象
var
可选
String
设置迭代元素的变量,如果指定此属性,那么所迭代的变量将放压入到值栈之中
在iterator标签的属性中,status属性用于获取迭代过程中的状态信息。在Struts2框架的内部结构中,status属性实质是获取了Struts2封装的一个迭代状态的对象,此对象为org.apache.struts2.views.jsp.IteratorStatus,通过此对象可以获取到迭代过程中的如下信息。
Struts2 标签库
在使用Struts2标签之前需要引入struts2标签库,,
<%@taglib prefix="s" url="/struts-tags"%>
1. 元素数
IteratorStatus对象提供了getCount()方法,来获取迭代集合或数组的元素数,如果status属性设置为“st”,那么就可通过“st.count”获取元素数。
2. 是否为第一个元素
IteratorStatus对象提供了isFirst()方法,来判断当前元素是否为第一个元素,如果status属性设置为“st”,那么就可通过“st.first”判断当前元素是否为第一个元素。
3. 是否为最后一个元素
IteratorStatus对象提供了isLast()方法,来判断当前元素是否为最后一个元素,如果status属性设置为“st”,那么就可通过“st.last”判断当前元素是否为最后一个元素。
4. 当前索引值
IteratorStatus对象提供了getIndex()方法,来获取迭代集合或数组的当前索引值,如果status属性设置为“st”,那么就可通过“st.index”获取当前索引值。
5. 索引值是否为偶数
IteratorStatus对象提供了isEven()方法,来判断当前索引值是否为偶数,如果status属性设置为“st”,那么就可通过“st.even”判断当前索引值是否为偶数。
6. 索引值是否为奇数
IteratorStatus对象提供了isOdd()方法,来判断当前索引值是否为奇数,如果status属性设置为“st”,那么就可通过“st.odd”判断当前索引值是否为奇数。
7. sort标签
sort标签用也用于操作集合对象,它的作用是对集合中数据进行排序,排序后它将集合中的数据压入到值栈之中,在sort标签内部可以直接访问到集合中的数据,sort标签中的属性及说明如表2所示。
表2 sort标签属性及说明
名 称是否必须类 型说 明
comparator可选java.util.Comparator指定对集合中数据进行排序所用到的比较器
source可选String指定要排序的集合
var可选String指定排序后的迭代器的引用,它将被保存到pageContext中
append标签与merge标签
append标签与merge标签都用于合并集合对象,将不同的迭代器组合在一起,它们的区别是其组合的顺序不同。
append标签组合集合的方式是以追加的方式进行组合,其组合方式效果图如图1所示,在图1中,有两个集合分别为集合1与集合2,append标签的组合方式是将第2个集合直接追加到第1个集合之后。
merge标签组合集合的方式是分别将要组合的集合拆开,然后按一次的次序分别获取到每一个集合中每一个元素,再进行进行组合,其合并集合的方式如图2所示。
append标签与merge标签都有一个名称为var属性,用于定义合并后的集合的引用变量,它保存在OGNLContext之中。
表3 generator标签属性及说明
名 称是否必须类 型说 明
converter可选Struts2的转换器Converter对象指定转换器Converter对象
count可选String指定迭代器中元素数量
separator必须String指定分隔符
val必须String指定需要解析的值
var可选String指定引用变量,此变量是一个Iterator对象,放置在pageContext之中
使用generator标签构造的Iterator对象,会将迭代器压入到值栈之中,这的用法比简单,如将一个字符串通过逗号分隔符进行分隔,其用法如下:
,
上代码的返回值为“aaa,bbb,ccc,ddd,eee,”。
在generator标签也可以使用count属性来指定返回的范围,如将上述代码修改成以下的形式:
,
那么,返回值则为“aaa,bbb,ccc,”。
如果操作比较繁琐,可以通过指定generator标签的converter属性,来设置一个转换器对象,从而进行自定义的格式处理。
### 数据标签 ###
property标签
property标签是一个非常常用的标签,它的作用是获取数据值,并将数据值直接输出到页面之中。其属性及说明如表1所示。
表1property标签属性及说明
名 称
是否必须
类 型
说 明
default
可选
String
设置默认值,如果value属性不存在或值为null,将使用此值
escape
可选
boolean
是否将value值进行HTML转义输出,如“<”转义成为“<”,它的默认值为true
escapeJavaScript
可选
boolean
是否将JavaScript脚本进行转义输出,如将“\”转义成为“\\”,它的默认值为false
value
可选
String
所输出的值
property标签的使用方法非常简单,其使用方式如下:
<%
request.setAttribute("info","<font color='red'>测试property</font>");
%>
<s:property default="没有数据!" value="#request.info" escape="false"/>
在上面的代码中,输出了request中的info属性值,如果info属性值不存在,将输出默认值“没有数据!”,同时,其输出方式并没使用HTML的转义方式。
如果将escape的值设置为true,它将在网页之中输出如下代码:
<font color='red'>测试property</font>
set标签
set标签用于定义一个变量,通过此标签可以所定义的变量赋值,及设置变量的作用域(application、request、session),在默认情况下,通过set标签所定义的变量被放置到值栈之中,set标签中所包含属性及说明如表2所示。
表2set标签属性及说明
名 称
是否必须
类 型
说 明
scope
可选
String
设置变量的作用域,它的值可以是application、request、session、page或action,它的默认值为action
value
可选
String
设置变量的值
var
可选
String
定义变量的名称
set标签的使用方法非常简单,其使用方式如下:
<s:set var="username" value="'测试set标签'" scope="request"></s:set>
<s:property default="没有数据!" value="#request.username"/>
上述代码,通过set标签定义了一个名称为username的变量,它的值是一个字符串,username的作用域在request范围之中。
3.a标签
a标签用于构建一个超链接,其最终的构建效果将形成一个HTML中的超链接,其常用属性与说明如表3所示。
表3 a标签属性及说明
名 称是否必须类 型说 明
action可选String将超链接的地址指向action
href可选String超链接地址
id可选String设置HTML中的属性名称
method可选String如果超链接的地址指向action,method同时可以为action声明所调用的方法
namespace可选String如果超链接的地址指向action,namespace可以为action声明名称空间
如果定义一个简单的超链接,a标签的使用方法如下:
<s:a id="index" href="index.jsp">主页</s:a>
上述代码将在JSP页面之中生成一个超链接,所生成的代码如下:
<a id="index" href="index.jsp">主页</a>
如果通过超链接访问Action对象,a标签的使用方法如下:
<s:a action="userAction" namespace="admin/user" method="index">用户管理</s:a>
上述代码将在JSP页面之中生成一个超链接,所生成的代码如下:
<a href="admin/user/userAction!index">用户管理</a>
技巧:
如果需要动态调用Action对象中的方法,可以使用a标签中的method属性进行设置,如上面代码所生成的“userAction!index”。
4.param标签
param标签主要用于对参数赋值,它可以当做其它标签的子标签。在param标签中,只有两个属性,其说明如表4所示。
表4param标签属性及说明
名 称是否必须类 型说 明
name可选String设置参数名称
value可选Object设置参数值
param标签的使用方法如下:
<s:param name="name" value="username"></s:param>
上述代码的作用是将OGNLContext中的参数username的值,赋值给name参数。param标签可以使用另一种表示方式,将参数值放置在param标签的中间,例如:
<s:param name="name">username</s:param>
使用此种方式,param标签将会把username看成是一个字符串数值,而通过value定义的参数值,param标签将会把username看成是一个表达式。
注意:
param标签的value属性中的值是一个表达式,如果需要将其设置成一个字符串数值,需要使用“’字符串’”的方式进行设置。
5.action标签
action标签是一个非常常用的标签,它用于执行一个Action请求,当在一个JSP页面中通过action标签执行Action请求时,可以将Action的返回结果输出到当前页面之中,也可以不输出,其常用属性及说明如表5所示。
表5 action标签属性及说明
名 称
是否必须
类 型
说 明
executeResult
可选
String
是否使Action返回到执行结果,它的默认值为false
flush
可选
boolean
输出结果是否刷新,它的默认值为true
ignoreContextParams
可选
boolean
是否将页面请求参数,传入被调用的Action,它的默认值为false
name
必须
String
Action对象所映射的名称,也就是struts.xml中配置的名称
namespace
可选
String
指定名称空间的名称
var
可选
String
引用此action的名称
6.bean标签
bean标签也是一个十分常用的标签,它与JSP中的<jsp:useBean>动作相类似,主要用于创建并实例化一个JavaBean对象,对于JavaBean中的属性可以通过param标签对其赋值,它的常用属性与说明如表6所示。
表6 Bean标签属性及说明
名 称
是否必须
类 型
说 明
name
必须
String
声明JavaBean对象的完整类名
var
可选
String
引用此JavaBean的名称
注意:
通过bean标签操作的JavaBean对象,它必须要遵循JavaBean规范,JavaBean对象要提供默认的构造方法与访问器。
在Struts2框架之中,通过bean标签实例化的JavaBean对象将被放入到OGNLContext之中,如果在bean标签内部调用JavaBean对象,此时,JavaBean实例处于值栈的顶部,可以直接进行调用,但如果在bean标签外部来调用JavaBean对象,那么JavaBean实例就不处于值栈的顶部,需要通过“#”号调用。
7.push标签
push标签用于将对象或值压入到值栈之中并放置到顶部,因为值栈中的对象是可以直接调用的,所以,push标签主要作用是起到一种简化操作的作用,它的属性只有一个,名称为value,用于声明压入值栈中的对象,其使用方法如下。
<s:push value="#request.student"></s:push>
上述代码的含义是将request作用域中的student对象压入到值栈顶部。
8.date标签
date标签用于格式化日期时间,可以通过指定的格式化样式对日期时间值进行格式化,date标签中所包含的属性及说明如表7所示。
表7 date标签属性及说明
名 称是否必须类 型说 明
format可选String设置格式化日期的样式
name必须String日期值
nice可选boolean是否输出给定日期与当前日期之的间时差,它的默认值为false,不输出时差
var可选String格式化时间的名称变量,通过此变量可以对其进行引用
说明:
在date标签中还包含id属性,但此属性已过时,它被var属性所取代。
9.include标签
Struts2框架中的include标签的作用类似于JSP中的<include>动作标签,也用于包含一个页面,但Struts2框架中的include标签的功能更加强大,它可以向目标页面中通过param标签传递请求参数。
include标签只有一个value属性,此属性是必选的属性,用于包含一个JSP页面或Servlet。
10.url标签
在Struts2框架之中,一个Action对象的URL映射地址包含名称空间、调用方法等多个参数,这样的URL可以直接进行编写,也可以使用Struts2框架提供的url标签自动生成URL地址,url标签中提供了多个属性满足不同格式的URL需求,它的常用属性及说明如表8所示。
表单UI 标签
- 常用的表单标签与通用属性
在Struts2框架之中,Struts2提供了一套表单标签,这些标签用于生成表单以及表单中的元素,如文本框、密码框、选择框等,由于这些标签由Struts2提供,它们能够与Struts2 API进行很好的交互,其常用的表单标签及说明如表1所示。
说明:
在Struts2框架中,与表单相关的标签有很多,表1之中所列出的标签是常用的表单标签。
在HTML语言中,表单中的元素拥有一些通用的属性,比如id属性、name属性以及JavaScript中的事件,这些元素在HTML表单元素中几乎都会存在,与HTML中相同,Struts2提供的表单标签也存在通用的属性,而且这此属性比较多,表单标签常用的属性及说明如表2所示。
说明:
Struts2的表单标签包含的通用属性非常多,它包含了HTML中的元素之中的属性,其中有一些属性并不是很常用,表2所列出的属性是一些常用的通用属性。
提交按钮的特殊设置
Struts2框架的设计非常巧妙,在它的配置文件之中,一个请求返回结果的类型可以设置为action、redirect、redirect-action,同时也可以通过动态的请求指定所应用的Action中的方法。而对于一个表单对象,它的应用实质就是将带有参数的请求传递到指定的地址,由这个请求地址对请求做出处理,既然表单对象也用于发送请求,那么,它也应该具有请求类型的设置。
在Struts2框架设计中,提供了对表单对象请求类型的设置,它通过submit标签中的name属性进行设置,它的属性取值如下。
action类型
用于设置当前提交按钮指向的Action,如果form表单已经设置了action属性的值,那么,单击当前按钮,按钮中所设置的Action将覆盖掉form表单已经设置了action属性,也就是说单击此按钮,请求将提交到此按钮配置的Action。
将提交按钮的请求类型设置为Action,通过name属性进行设置,其设置方法如下:
name="action:editUserAction"
例如,在下面的表单代码中,将“修改”按钮的请求类型设置为editUserAction,那么,“修改”按钮的提交动作就会覆盖掉表单之中action。
<s:form action="saveUserAction" method="post">
<s:textfield name="name" label="用户名"></s:textfield>
<s:password name="password" label="密码" ></s:password>
<s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
<s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
<s:submit value="保存"></s:submit>
<s:submit value="修改" name="action:editUserAction"></s:submit>
</s:form>
在上述的代码中,如果单击“保存”按钮,那么,请求将交给saveUserAction进行处理,如果单击“修改”按钮,那么,请求将交给editUserAction进行处理。
method处理
一个Action对象默认的请求处理方法,是使用execute()方法对请求进行处理,在submit标签中配置method,则可以指定Action对象中的任意方法,此设置相当于使用了Struts2框架中的动态请求。
在submit标签中配置method有两种实现方法,这两种实现方法如下:
配置submit标签的method属性
虽然在form标签中已经提供了method属性,但此属性并不是指动态调用Action对象中的方法,而是HTTP请求的类型(GET、POST等),如果需要动态调用Action对象中的指定方法,则可以通过配置submit标签的method属性进行实现,method属性的值对应Action对象中的方法名称,例如:
<s:form action="userAction" method="post">
<s:textfield name="name" label="用户名"></s:textfield>
<s:password name="password" label="密码" ></s:password>
<s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
<s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
<s:submit value="保存" method="save"></s:submit>
<s:submit value="修改" method="update"></s:submit>
</s:form>
在上述代码中,如果单击“保存”按钮,那么,请求则由userAction的save()方法进行处理,它相当于将表单请求的地址设置为“userAction!save.action”。如果单击“修改”按钮,请求则由userAction的update()方法进行处理,它相当于将表单请求的地址设置为“userAction!update.action”。
配置submit标签的name属性
除了使用submit标签的method属性进行配置外,还可以使用submit标签的name属性进行配置,name属性值以“method:”开头,后面加上调用Action对象的方法的名称,如,在下面的代码使用submit标签的name属性进行配置:
<s:form action="userAction" method="post">
<s:textfield name="name" label="用户名"></s:textfield>
<s:password name="password" label="密码" ></s:password>
<s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
<s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
<s:submit value="保存" name="method:save"></s:submit>
<s:submit value="修改" name="method:update"></s:submit>
</s:form>
在上述代码中,如果单击“保存”按钮,那么,请求则由userAction的save()方法进行处理,它相当于将表单请求的地址设置为“userAction!save.action”。如果单击“修改”按钮,请求则由userAction的update()方法进行处理,它相当于将表单请求的地址设置为“userAction!update.action”。
redirect类型
redirect类型用于将请求类型设置为重定向,此操作通过submit标签的name属性进行配置,name属性值以“redirect:”开头,后面加上请求重定向到的URL地址,它的使用方法如下:
<s:submit value="搜索" name="redirect:search.jsp"></s:submit>
在上述的代码中,如果单击“搜索”按钮,那么,请求将重定向到search.jsp进行处理。
在表单之中,将提交按钮的请求类型设置成为redirect类型,此种操作方式并不常用,因为请求重定向后,并不会传递表单中的参数。
redirect-action类型
用于设置当前提交按钮指向的Action,如果form表单已经设置了action属性的值,那么,单击当前按钮,按钮中所设置的Action将覆盖掉form表单已经设置了action属性,也就是说单击此按钮,请求将提交到此按钮配置的Action。
将提交按钮的请求类型设置为Action,通过name属性进行设置,其设置方法如下:
name="action:editUserAction"
如在下面的表单中,将“修改”按钮的请求类型设置为editUserAction,那么,“修改”按钮的提交动作就会覆盖掉表单之中action。
<s:form action="saveUserAction" method="post">
<s:textfield name="name" label="用户名"></s:textfield>
<s:password name="password" label="密码" ></s:password>
<s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
<s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
<s:submit value="保存"></s:submit>
<s:submit value="修改" name="action:editUserAction"></s:submit>
</s:form>
在上述的代码中,如果单击“保存”按钮,那么,请求将交给saveUserAction进行处理,如果单击“修改”按钮,那么,请求将交给editUserAction进行处理。