Struts2控制标签
Struts2的控制标签,主要用于完成流程控制控制标签可以完成输出流程的控制,例如循环、分支等操作,也可以完成对集合的合并、排序等操作。
1、if、else if、else标签
if标签用来控制基本的条件处理流程,通常和else标签或者elseif标签连用。
其参数、属性为
<%@page contentType=text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>控制标签的使用</title>
</head>
<body>
<s:set var="score" value="60"/>
<s:if test="#score>=90">优秀</s:if>
<s:elseif test="#score>=80">良好</s:elseif>
<s:elseif test="#score>=70">中等</s:elseif>
<s:elseif test="#score>=60">及格</s:elseif>
<s:else>不及格</s:else>
</body>
</html>
这个例子是通过if、elseif、else控制标签连用的,跟Java语法下的if、else if、else是十分相似的,上面这个例子中,使用if控制标签的test属性,为true的话就执行if控制标签的内容,为false的话就去判断elseif控制标签的test属性,为true的话就执行elseif控制标签的内容,为false的话就去直接去执行else控制标签里的内容了,这里明显为true,所以显示的就为elseif控制标签里的内容了!
2、iterator标签
用于迭代一个集合,可以是Collection,Map,Enumeration,Iterator,array。迭代过程会把每一个对象暂时压入值栈,这样标签的内部就可以直接访问对象的属性和方法,标签完毕后,值栈内容被删除。
其参数,属性为:
IteratorStatus实例包含以下几个方法:
-
int getConut() 返回当前迭代了几个元素。
-
int geIndex() 返回当前元素的索引。
-
boolean isEven() 返回当前迭代的索引是否是偶数。
-
boolean isOdd() 返回当前迭代的索引是否是奇数。
-
boolean isFirst() 返回当前迭代的索引是否是第一个元素。
-
boolean isLast() 返回当前迭代的索引是否是最后一个元素。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>iterator标签的使用</title>
</head>
<body>
<h2>iterator标签的使用</h2>
<hr>
<s:iterator value="{'Java程序设计与项目实训教程(第2版)', 'JSP程序设计技术教程(第2版)','JSP程序设计与项目实训教程(第2版)','Struts2+Hibernate框架技术教程','Web框架技术(Struts2+Hibernate5+Spring5)教程(第2版)'}"
var="bookName">
<s:property value="bookName"/><br>
</s:iterator>
</body>
</html>
iterator.jsp页面中我们使用iterator控制标签来迭代一个集合,该标签的value值即为我们所迭代的集合,并通过property标签获取该集合
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>iterator标签的使用</title>
</head>
<body>
<h2>iterator标签的使用</h2>
<hr>
<table border="1">
<s:iterator value="{'Java程序设计与项目实训教程(第2版)', 'JSP程序设计技术教程(第2版)','JSP程序设计与项目实训教程(第2版)','Struts2+Hibernate框架技术教程(第2版)','Web框架技术(Struts2+Hibernate5+Spring5)教程(第2版)'}"
var="bookName" status="st">
<tr <s:if test="#st.odd">style="background-color:red"</s:if>>
<td><s:property value="bookName"/><br></td>
</tr>
</s:iterator>
</table>
</body>
</html>
使用#st.odd来指定if标签的test属性,odd又是IteratorStatus的方法,返回当前迭代的集合的索引是否是奇数,即如果迭代的集合中的索引为奇数的话,就把迭代到的索引对应的内容样式的背景颜色改为红色,使用<s:property value=“bookName”/>来获取到上面指定的iterator标签的集合,是通过iterator标签的id属性值来获得的
3、append标签
用于将多个集合对象拼接起来,组成一个新的集合,通过这种拼接,从而允许通过一个<s:iterator/>标签就完成多个集合的迭代。在append标签内部,使用param标签指定集合。通常和iterator标签一起使用!
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>append标签的使用</title>
</head>
<body>
<h2>append标签的使用</h2>
<hr>
<s:append var="newList">
<s:param value="{'Java程序设计与项目实训教程(第2版)', 'JSP程序设计与项目实训教程(第2版)','Web框架技术(Struts2+Hibernate5+Spring5)教程(第2版)'}"/>
<s:param value="{'Java程序设计', 'JSP程序设计','SSH技术'}"/>
</s:append>
<table border="1">
<s:iterator value="#newList" status="st">
<tr <s:if test="#st.odd">style="background-color:red"</s:if>>
<td><s:property /></td>
</tr>
</s:iterator>
</table>
</body>
</html>
4、merge标签
与append标签十分类似,它们都是将多个集合拼接成一起,它们的区别在于拼接后集合元素顺序的不同。
假设有两个集合的话,区别如下:
append方式拼接,新元素的顺序为:
-
第一个集合中的第一个元素;
-
第一个集合中的第二个元素;
-
第二个集合中的第一个元素;
-
第二个集合中的第二个元素;
merge方式拼接,新元素的顺序为:
-
第一个集合中的第一个元素;
-
第二个集合中的第一个元素;
-
第一个集合中的第一个元素;
-
第二个集合中的第二个元素;
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>merge标签的使用</title>
</head>
<body>
<h3>merge标签的使用</h3>
<hr>
<s:append var="newList_append">
<s:param value="{'集合1中的元素1','集合1中的元素2','集合1中的元素3'}"/>
<s:param value="{'集合2中的元素1','集合2中的元素2'}"/>
</s:append>
<s:merge var="newList_merge">
<s:param value="{'集合1中的元素1','集合1中的元素2','集合1中的元素3'}" />
<s:param value="{'集合2中的元素1','集合2中的元素2'}" />
</s:merge>
<br>
迭代输出由append标签产生的新集合
<s:iterator value="#newList_append" status="st">
<br>
<s:property />
</s:iterator>
<br>
迭代输出由merge标签产生的新集合
<s:iterator value="#newList_merge" status="st">
<br>
<s:property />
</s:iterator>
</body>
</html>
5、generator标签
generator标签可以将指定字符串按指定分隔符分割成多个字串。 生成的多个字串可以用iterator标签进行迭代输出。
名字 | 是否必选 | 描述 |
---|---|---|
val属性 | 必填属性 | 指定被解析的字符串 |
count属性 | 可选属性 | 指定生成集合中元素的总数 |
separator属性 | 必填属性 | 指定用于分割字符串的分隔符 |
converter属性 | 可选属性 | 指定一个转换器,转换器负责将生成的集合中的每个字符串转换成对象 |
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>generator标签的使用</title>
</head>
<body>
<h3>generator标签的使用</h3>
<hr>
<s:generator val="'Java程序设计与项目实训教程(第2版),JSP程序设计与项目实训教程(第2版),Web框架技术(Struts2+Hibernate5+Spring5)教程(第2版)'" separator=",">
<s:iterator status="st">
<br>
<s:property />
</s:iterator>
</s:generator>
</body>
</html>
通过上面这个例子的代码可以看到,一个字符串==" Java程序设计与项目实训教程(第2版),JSP程序设计与项目实训教程(第2版),Web框架技术(Struts2+Hibernate5+Spring5)教程(第2版)"==通过号分隔符将它分割了4个字串,并根据iterator迭代标签将分割后的内容显示出来。结果如下:*
6、subset标签
用于取得集合的子集,该标签的底层通过:org.apache.struts2.util.SubsetIteratorFilte类提供实现。
其属性有:
名字 | 是否必选 | 描述 |
---|---|---|
source | 可选属性 | 指定源集合 |
count | 可选属性 | 代表子集中的元素个数,如果没有指定代表源集合的全部元素 |
start | 可选属性 | 从第几元素开始截取 |
decider | 可选属性 | 指定由开发者自己决定是否选中该元素 |
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>subset标签的使用</title>
</head>
<body>
<h3>subset标签的使用</h3>
<hr>
<s:subset source="{'Java程序设计与项目实训教程(第2版)', 'JSP程序设计与项目实训教程(第2版)','JSP程序设计技术教程(第2版)','Struts2+Hibernate框架技术教程(第2版)','Web框架技术(Struts2+Hibernate5+Spring5)教程(第2版)'}" start="1" count="3">
<s:iterator status="st">
<br>
<s:property />
</s:iterator>
</s:subset>
</body>
</html>
==start=“1” count=“3”==表示从原集合中第2个元素开始,向后截取3个元素,由此生成一个新集合。并用iterator标签进行迭代
7、sort标签
用于对指定集合元素进行排序,进行排序时,必须提供自己的排序规则,即实现自己的Comparator,自己的Comparator需要实现java.util.Comparator接口。
名字 | 是否必选 | 描述 |
---|---|---|
comparator | 必填属性 | 指定进行排序的comparator的实例 |
source | 可选属性 | 指定排序的集合 |
package com.zzuli.util;
import java.util.Comparator;
public class MyComparator implements Comparator{
@Override
public int compare(Object element2, Object element1){
return element1.toString().length()-element2.toString().length();
}
}
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sort标签的使用</title>
</head>
<body>
<h3>使用sort标签对集合进行排序</h3>
<hr>
<s:bean var="mc" name="com.zzuli.util.MyComparator" />
<s:sort source="{'a','aa','aaa'}"
comparator="#mc">
<s:iterator status="st">
<br>
<s:property />
</s:iterator>
</s:sort>
</body>
</html>
示例解析,通过==<s:sort source="{‘a’,‘aa’,‘aaa’}" comparator="#mc">这行代码,由属性source可知指定排序的集合是’a’,‘aa’,‘aaa’==,由comparator可知道指定排序的Comparator实例是由bean标签指定的SortComparator类,这个类通过两个长度的比较进行排序并且是返回值是第二个数的长度减去第一个数的长度,所以是从长度长的排下去。