struts2控制标签.docx
《struts2控制标签.docx》由会员分享,可在线阅读,更多相关《struts2控制标签.docx(18页珍藏版)》请在冰豆网上搜索。
![struts2控制标签.docx](https://file1.bdocx.com/fileroot1/2022-12/31/fa377563-7110-4a14-b9f1-7716bd3b9c05/fa377563-7110-4a14-b9f1-7716bd3b9c051.gif)
struts2控制标签
struts2控制标签
8.3 控制标签
控制标签关注程序的运行流程,比如用if/else来进行分支控制,用iterator来进行循环控制。
接下来就来学习Struts2的控制标签。
8.3.1 if、elseif与else标签
1:
if标签的功能:
类似于Java程序中的if,用来表达分支判断。
else标签的功能:
类似于Java程序中的else。
elseif标签的功能:
类似于Java程序中的elseif。
2:
属性:
if标签和elseif标签都只有一个test属性,它本身是一个OGNL表达式,运算结果为一个boolean值,表示是否符合条件,必须设置。
else标签没有属性。
3:
示例:
由于大家对于Java中的if-else是非常熟悉的,因此这里只需要看看,用标签如何来表达即可,示例如下:
java代码:
查看复制到剪贴板打印
1.<%@ taglib prefix="s" uri="/struts-tags" %>
2.<%
3. int length=15;
4. request.setAttribute("len",length);
5.%>
6.if test="#request['len']>=20">
7. 您输入的值大于等于20
8.
if>
9.elseif test="#request['len']<=10">
10. 您输入的值小于等于10
11.
elseif>
12.else>
13. 您输入的值在10与20之间
14.
else>
8.3.2 iterator标签
1:
功能:
iterator标签用来处理循环,可以用它遍历数组、Set和List等集合对象。
这个标签还支持在ActionContext中保持一个保存遍历状态的对象,通过这个变量可以得到当前循环的各种信息。
iterator标签在遍历一组对象的时候,它把正在循环的对象放在值栈的栈顶,所以可以直接引用这个对象的方法或属性,后面给出示例。
2:
属性:
iterator标签的主要属性:
∙value:
用来指明到底循环的是谁,这个属性的值是OGNL表达式,用来访问ActionContext和值栈中需要被循环的对象。
∙status:
这个属性在ActionContext中保存一个对象,用来返回当前循环的各种信息,可以返回的信息有:
l count:
集合含有多少个对象。
l index:
正在循环的这一项的索引。
l even:
当前遍历到的对象是不是处于列表的偶数索引位置。
l odd:
当前遍历到的对象是不是处于列表的奇数索引位置。
l first:
正在循环的是不是第一个。
l last:
正在循环的是不是最后一个。
∙begin、end、step:
指明了如果使用索引来进行循环时的开始、结束和步长。
∙var:
变量名称,用来引用存放到值栈的被循环的对象。
3:
示例:
其实在Java中处理循环的时候,主要用的是for循环和while循环,do-while循环的应用相对少一些。
接下来用iterator标签来实现类似于Java中循环的功能。
(1)实现类似于for循环的功能
假如现在要求完全使用标签,来实现循环输出1到10的值,该如何实现呢?
很明显,使用iterator标签的begin、end、step和var属性就可以了,示例代码如下:
java代码:
查看复制到剪贴板打印
1.<%@ taglib prefix="s" uri="/struts-tags" %>
2.iterator var="i" begin="1" end="10" step="1">
3. property value="#i"/>
4.
iterator>
上面的实现很类似于如下的Java代码:
java代码:
查看复制到剪贴板打印
1.<%
2. for(int i=1;i<=10;i++){
3. out.println(i);
4. }
5.%>
有朋友可能会说
(2)实现类似于while循环的功能
假如要循环输出一个List的值,那么就需要使用到var和value属性了,示例如下:
java代码:
查看复制到剪贴板打印
1.<%@ page import="java.util.*"%>
2.<%@ taglib prefix="s" uri="/struts-tags" %>
3.<%
4. //准备点循环用的数据
5. List list = new ArrayList();
6. for(int i=1;i<=10;i++){
7. list.add("str="+i);
8. }
9. request.setAttribute("list",list);
10.%>
11.iterator var="v" value="#request['list']">
12. property value="#v"/>
13.
iterator>
上面的实现很类似于如下的Java代码:
java代码:
查看复制到剪贴板打印
1.<%
2. //如果用Iterator来循环
3. Iterator it = list.iterator();
4. while(it.hasNext()){
5. out.println(it.next());
6. }
7. //如果用加强的for循环
8. for(String s :
list){
9. out.println(s);
10. }
11.%>
(3)访问复杂的对象
如果List里面放的是复杂对象呢,比如前面用过的UserModel,里面有两个属性:
userId、name。
页面上该如何循环显示呢?
示例代码如下:
java代码:
查看复制到剪贴板打印
1.<%@ page import="java.util.*"%>
2.<%@page import="cn.javass.ognl.vo.UserModel" %>
3.<%@ taglib prefix="s" uri="/struts-tags" %>
4.<%
5. //准备需要循环的数据
6. List list = new ArrayList();
7. UserModel um1 = new UserModel();
8. um1.setUserId("userId1");
9. um1.setName("张三");
10. list.add(um1);
11.
12. UserModel um2 = new UserModel();
13. um2.setUserId("userId2");
14. um2.setName("李四");
15. list.add(um2);
16.
17. request.setAttribute("users",list);
18.%>
19.
20.iterator value="#request.users">
21. userId=property value="userId"/>,
22. name=property value="name"/>
23.
iterator>
分析一下上面的代码,iterator标签的value属性指明了要循环谁,里面的OGNL表达式"#request.users"表明了要访问request的属性中名称为users的属性的值。
接下来iterator标签在循环的时候,把当前正在循环的对象放到值栈的栈顶,比如循环第一次的时候,它就会把List中的第一个对象放到值栈的栈顶,这时候,访问这个对象的getName方法,就可以直接用简单的“name”就可以了。
(4)使用status属性
如果还想输出当前循环的索引,或者是想要把循环输出的数据用表格来展示,并按照奇数行和偶数行来设置不同的背景色,也就是我们熟悉的波浪纹或者是斑马纹背景,该如何实现呢?
这当然需要使用iterator标签的status属性,把一个保存循环状态的对象放到ActionContext中,然后在iterator标签内的property标签中,就可以引用这个保存循环状态的对象了。
先来示例输出当前循环的索引,示例如下:
java代码:
查看复制到剪贴板打印
1.iterator value="#request.users" status="state">
2. 索引=property value="#state.index"/>,
3. userId=property value="userId"/>,
4. name=property value="name"/>
5.
iterator>
注意,property>引用status属性名称的时候前面要加#号,status这个对象可以使用的属性在前面的属性列表中写明了,#state.index就表示在循环内引用循环状态信息中的索引,每次循环完一个对象,state的内部状态都会相应变化。
如果要实现波浪纹或斑马纹背景的表格,该如何实现呢?
首先需要多添加点数据,才好看出效果,其次把循环的数据放置到表格中去,然后通过循环的状态对象来判断是奇数行还是偶数行,为这些行设置不同的背景颜色就可以了。
示例代码如下:
java代码:
查看复制到剪贴板打印
1.<%@ page import="java.util.*"%>
2.<%@page import="cn.javass.ognl.vo.UserModel" %>
3.
4.<%@ taglib prefix="s" uri="/struts-tags" %>
5.<%
6. //准备需要循环的数据
7. List list = new ArrayList();
8. UserModel um1 = new UserModel();
9. um1.setUserId("userId1");
10. um1.setName("张三");
11. list.add(um1);
12.
13. UserModel um2 = new UserModel();
14. um2.setUserId("userId2");
15. um2.setName("李四");
16. list.add(um2);
17.
18. UserModel um3 = new UserModel();
19. um3.setUserId("userId3");
20. um3.setName("王五");
21. list.add(um3);
22.
23. UserModel um4 = new UserModel();
24. um4.setUserId("userId4");
25. um4.setName("马六");
26. list.add(um4);
27.
28. request.setAttribute("users",list);
29.%>
30.
31.
32.
用户列表 | 33.
34.
35.
索引 | 36.
用户编号 | 37.
用户姓名 | 38.
操作 | 39.
40.
41. iterator value="#request.users" status="state">
42.
43. if test="#state.even">
44. bgcolor="#EFF8FF"
45.
if>
46. else>
47. bgcolor="#B4CFF1"
48.
else>
49. >
50.
property value="#state.index"/> | 51.
property value="userId"/> | 52.
property value="name"/> | 53.
修改 删除 | 54.
55.
iterator>
56.
运行效果如下图
图8.9 示例iterator标签
是不是看起来有点做列表页面的感觉,这就对了,以后用Struts2开发,一定少不了使用iterator标签的。
8.3.3append与param标签
1:
功能:
append标签用于把几个已经存在的集合组合成一个大集合,param标签跟它连用,用来指定组合哪些集合。
2:
属性:
append标签的主要属性:
∙var:
用来指定把组合后的大集合放到值栈里的变量名称。
3:
示例:
简单的示例如下:
java代码:
查看复制到剪贴板打印
1.<%@ taglib prefix="s" uri="/struts-tags" %>
2.set value="{1,2,3}" var="list1"/>
3.set value="{4,5,6}" var="list2"/>
4.
5.append var="list3">
6. param value="#list1"/>
7. param value="#list2"/>
8.
append>
9.
10.iterator value="#list3">
11. property/>
12.
iterator>
首先用set标签来指定两个集合,对于setvalue="{1,2,3}"var="list1"/>来说,var属性指定了这个集合被放进值栈的名字为list1,而value属性的值为{1,2,3},本身是OGNL表达式,表示直接创建一个集合,里面有1、2、3三个值。
然后,使用append标签来把list1和list2组合成一个大的集合,appendvar="list3">中的var属性指定了组合后的大集合放进值栈的名字为list3,而param标签的value属性指定了被组合的集合。
最后,用iterator标签来遍历并输出合并后的集合。
8.3.4generator标签
1:
功能:
generator标签用来切分字符串,并把切分的结果组成一个集合。
2:
属性:
generator标签的主要属性:
∙val:
指定被切分的字符串,必须指定。
∙separator:
指定切分字符串用的分隔符,必须指定。
比如要用“,”来切分字符串“a,b,c,d”,最终的结果为包含a、b、c、d四个字符串的集合。
∙count:
返回集合的最大长度。
∙converter:
用于设置自定义的Converter,必须是org.apache.struts2.util.IteratorGenerator.Converter接口的实现类。
∙var:
指定变量名称,用来访问放到值栈中的集合。
3:
示例:
来个简单的示例,把一个字符串分解成集合,然后循环输出。
示例代码如下:
java代码:
查看复制到剪贴板打印
1.<%@ taglib prefix="s" uri="/struts-tags" %>
2.generator separator="," val="'a,b,c,d'" var="myList"/>
3.iterator value="#myList">
4. property/>
5.
iterator>
上面的示例中,先使用generator标签将val的值,也就是字符串"'a,b,c,d'"用separator的值,也就是","来进行切分,把切分后的结果放入值栈,引用的名称为var属性的值arr。
最后用iterator标签输出刚刚切分创建的集合。
如果把iterator标签嵌套在generator标签内,就可以不用指定iterator标签的value属性,而直接使用generator标签拆分字符串的结果了。
java代码:
查看复制到剪贴板打印
1.<%@ taglib prefix="s" uri="/struts-tags" %>
2.generator separator="," val="'a,b,c,d'" var="myList">
3. iterator>
4. property/>
5.
iterator>
6.
generator>
8.3.5merge标签
1:
功能:
merge标签用来把几个已经存在的集合组合成一个大集合,与append标签的作用类似,只是原来集合中出现的各个元素出现在大集合中的顺序不同。
2:
属性:
merge标签的主要属性:
∙var:
用来指定把组合后的大集合放到值栈里的变量名称。
3:
示例:
沿用前面的例子,稍稍修改一下,示例如下:
java代码:
查看复制到剪贴板打印
1.<%@ taglib prefix="s" uri="/struts-tags" %>
2.set value="{1,2,3}" var="list1"/>
3.set value="{4,5,6}" var="list2"/>
4.
5.merge var="list3">
6. param value="#list1"/>
7. param value="#list2"/>
8.
merge>
9.
10.iterator value="#list3">
11. property/>
12.
iterator>
去运行测试一下,结果页面如下:
图8.10 示例merge标签
通过上面的示例可以看出,使用merge标签的时候,先出现原来各个集合中的第一个元素,然后是原来各个集合中的第二个元素,以此类推,所以结果为“1,4,2,5,3,6”。
而以前在使用append标签的时候,原来集合中的元素出现在大集合中的顺序为第一个集合的所有元素都出现之后,再出现第二个集合的所有元素,结果为“1,2,3,4,5,6”。
这就看出merge标签和append标签的区别来了。
8.3.6sort标签
1:
功能:
利用设置的比较器,来对指定的集合进行排序。
2:
属性:
sort标签的主要属性:
∙comparator:
用来指定对集合排序使用的比较器的实例
∙source:
需要排序的集合
∙var:
变量名称,把集合排序后的结果存放到pagecontext中的key值
3:
包含基本数据类型的集合排序示例:
还是通过示例来看sort的使用,先来示范对包含基本数据类型的集合的排序。
(1)先来准备比较器,就是实现java.util.Comparator接口的类,实现对整型数据进行升序排序,示例如下:
java代码:
查看复制到剪贴板打印
1.package cn.javass.tag;
2.public class MyComparator implements java.util.Comparator{
3.
4. public int compare(Object o1, Object o2) {
5. int a = Integer.parseInt(o1.toString());
6. int b = Integer.parseInt(o2.toString());
7. if(a>b){
8. return 1;
9. }else if(a
10. return -1;
11. }
12. return 0;
13. }
14.}
(2)