9.2 逻辑控制标签
逻辑控制标签主要用来完成流程控制,如分支和循环操作。也可以用来对集合进行合并、排序等操作。
9.2.1 set标签和property标签
下面先来看两个数据访问标签:set标签和property标签。这两个标签是最基本的数据访问标签,在使用逻辑控制标签时,同样将经常使用到这两个标签。
set标签用于将某个变量设置到指定的范围中,等同于setAttribute()方法,其包含属性如表9.3所示。
表9.3 set标签属性列表
property标签用来输出指定值,如果不指定value属性,则默认输出ValueStack栈顶值,其包含属性如表9.4所示。
表9.4 property标签属性列表
下面通过一些例子来加深对set标签和property标签的学习。首先使用set标签设置一个变量username至action范围中,然后分别使用property标签和EL表达式输出username变量值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>set标签示例</title> </head> <body> <! -- 设置一个变量username至action范围中 --> <s:set name="username" value="’小强’" scope="action"></s:set> <! -- 使用property标签输出username变量值 --> action范围:<s:property value="username"/><br> <! -- 使用EL表达式输出username变量值 --> action范围(EL):${username } </body> </html>
运行该JSP页面,在页面中可以看到结果的输出,如图9.3所示。
下面使用set标签设置一个变量username至page范围中,然后分别使用property标签和EL表达式输出username变量值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>set标签示例</title> </head> <body> <! -- 设置一个变量username至page范围中 --> <s:set name="username" value="’小强’" scope="page"></s:set> <! -- 使用property标签输出username变量值 --> page范围:<s:property value="#attr.username"/><br> <! -- 使用EL表达式输出username变量值 --> page范围(EL):${pageScope.username } </body> </html>
运行该JSP页面,在页面中可以看到结果的输出,如图9.4所示。
图9.3 输出username变量值(1)
图9.4 输出username变量值(2)
下面使用set标签设置一个变量username至request范围中,然后分别使用property标签和EL表达式输出username变量值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>set标签示例</title> </head> <body> <! -- 设置一个变量username至request范围中 --> <s:set name="username" value="’小强’" scope="request"></s:set> <! -- 使用property标签输出username变量值 --> request范围:<s:property value="#request.username"/><br> <! -- 使用EL表达式输出username变量值 --> request范围(EL):${requestScope.username } </body> </html>
运行该JSP页面,在页面中可以看到结果的输出,如图9.5所示。
下面使用set标签设置一个变量username至session范围中,然后分别使用property标签和EL表达式输出username变量值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>set标签示例</title> </head> <body> <! -- 设置一个变量username至session范围中 --> <s:set name="username" value="’小强’" scope="session"></s:set> <! -- 使用property标签输出username变量值 --> session范围:<s:property value="#session.username"/><br> <! -- 使用EL表达式输出username变量值 --> session范围(EL):${sessionScope.username } </body> </html>
运行该JSP页面,在页面中可以看到结果的输出,如图9.6所示。
图9.5 输出username变量值(3)
图9.6 输出username变量值(4)
下面使用set标签设置一个变量username至application范围中,然后分别使用property标签和EL表达式输出username变量值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>set标签示例</title> </head> <body> <! -- 设置一个变量username至application范围中 --> <s:set name="username" value="’小强’" scope="application"></s:set> <! -- 使用property标签输出username变量值 --> application范围:<s:property value="#application.username"/><br> <! -- 使用EL表达式输出username变量值 --> application范围(EL):${applicationScope.username } </body> </html>
运行该JSP页面,在页面中可以看到结果的输出,如图9.7所示。
图9.7 输出username变量值(5)
9.2.2 if/elseif/else标签
Struts 2提供了3个标签用于进行分支流程控制,分别是if标签、else if标签、else标签。其中if标签、else if标签提供了一个test属性用来进行判断。if/elseif/else标签的使用和Java语言中的if-elseif-else流程控制语言使用上是基本类似的。
下面来看一个简单的示例,在JSP中接受一个score参数,判断其参数值是否大于等于60,如果大于等于60则在页面中显示及格;如果小于60则在页面中显示不及格,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>if/elseif/else示例</title> </head> <body> <! -- 接受score参数,并将参数值赋值给score变量,并设置到page范围中 --> <s:set name="score" value="#parameters.score[0]" scope="page"/> <! -- 使用if/elseif标签进行判断,如果大于等于60 --> <s:if test="#attr.score >= 60"> 及格 </s:if> <! -- 如果小于60 --> <s:else> 不及格 </s:else> </body> </html>
运行该JSP页面,并添加如“? score=90”用来传递参数,在页面中可以看到结果的输出,如图9.8所示。
运行该JSP页面,并添加如“? score=45”用来传递参数,在页面中可以看到结果的输出,如图9.9所示。
图9.8 输出及格
图9.9 输出不及格
使用if标签可以搭配多个else if标签,下面完成一个简单示例。在该示例中对score参数值进行判断,如果大于等于90则在页面中输出A;如果大于等于80则在页面中输出B;如果大于等于70则在页面中输出C;如果大于等于60则在页面中输出D;如果小于60则输出不及格,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>if/elseif/else示例</title> </head> <body> <! -- 接受score参数,并将参数值赋值给score变量,并设置到page范围中 --> <s:set name="score" value="#parameters.score[0]" scope="page"/> <! -- 使用if/elseif标签进行判断,如果大于等于90--> <s:if test="#attr.score >= 90"> A </s:if> <! -- 如果大于等于80--> <s:elseif test="#attr.score >= 80"> B </s:elseif> <! -- 如果大于等于70 --> <s:elseif test="#attr.score >= 70"> C </s:elseif> <! -- 如果大于等于60 --> <s:elseif test="#attr.score >= 60"> D </s:elseif> <! -- 如果小于60 --> <s:else> 不及格 </s:else> </body> </html>
运行该JSP页面,并添加“? score=80”用来传递参数,在页面中可以看到结果的输出,如图9.10所示。
图9.10 输出成绩等级
9.2.3 iterator标签
Struts 2提供iterator标签用来对集合进行遍历,这里所说的集合包括List、Set和数组以及Map,其包含属性如表9.5所示。
表9.5 iterator标签属性列表
下面来看如何通过iterator标签来对数组进行遍历。首先新建一个Action,在该Action中创建一个字符串类型的数组,并将其储存至request范围中,代码如下所示。
package net.hncu.action; import java.util.Date; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class ValueAction extends ActionSupport { //execute方法 public String execute() { //新建字符串数组 String[] militaryRanks={"士兵", "少尉", "中尉", "上尉"}; //将militaryRanks储存到request范围中 ServletActionContext.getRequest().setAttribute("militaryRanks", militaryRanks); return SUCCESS; } }
在“struts.xml”文件中配置该Action,并配置Action,如果返回success字符串那么页面跳转到“testIterator.jsp”页面,代码如下所示。
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="struts2" extends="struts-default"> <! -- 定义getValue的Action,其实现类为net.hncu.action.ValueAction--> <action name="getValue" class="net.hncu.action.ValueAction"> <! -- 定义处理结果与视图资源之间的关系--> <result name="success">/testIterator.jsp</result> </action> </package> </struts>
新建“testIterator.jsp”页面,遍历request范围中的militaryRanks,将遍历的值放入militaryRank变量中,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>iterator示例</title> </head> <body> <! -- 遍历request范围中的militaryRanks,将遍历的值放入militaryRank变量中 --> <s:iterator value="#request.militaryRanks" id="militaryRank"> <s:property value="militaryRank"/> </s:iterator> </body> </html>
在浏览器中执行getValue. action,页面跳转到“testIterator.jsp”并输出该集合中的元素值,如图9.11所示。
图9.11 输出集合中的元素值
这里为了示例的演示方便,在JSP页面中创建该集合用来模拟从Action获得的集合。可以使用OGNL表达式中的“{e1, e2, e3⋯⋯}”来生成一个List类型集合,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>iterator示例</title> </head> <body> <! -- 遍历List,将遍历的值放入militaryRank变量中 --> <s:iterator value="{’士兵’, ’少尉’, ’中尉’, ’上尉’}" id="militaryRank"> <s:property value="militaryRank"/> </s:iterator> </body> </html>
通过iterator标签可以遍历Map中的key和value值。可以用OGNL表达式中的“# {key1:value2, key2:value2, key3:value3⋯⋯}”来生成一个Map,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>iterator示例</title> </head> <body> <! -- 遍历Map,将遍历的值放入militaryRank变量中 --> <s:iterator value="#{'1' :’士兵’, '2' :’少尉’, '3' :’中尉’, '4' :’上尉’}" id="militaryRank"> <s:property value="key"/> <s:property value="value"/><br> </s:iterator> </body> </html>
运行该JSP页面,在页面中可以看到Map中key和value值的输出,如图9.12所示。
通过在iterator标签中指定status属性,这样在遍历集合时会有一个IteratorStatus实例,通过该实例可以判断当前元素的索引是否为奇数,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>iterator示例</title> </head> <body> <table border="1"> <! -- 1. 遍历Map,将遍历的值放入militaryRank变量中 2. 判断当前元素的索引是否为奇数,如果为奇数设置其行颜色为红色 --> <s:iterator value="#{'1' :’士兵’, '2' :’少尉’, '3' :’中尉’, '4' :’上尉’}" id="militaryRank" status="sta" > <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property value="key"/></td> <td><s:property value="value"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中可以看到单数行的行背景颜色被设置成了红色,如图9.13所示。
图9.12 输出Map中key和value值
图9.13 单数行的行背景颜色被设置成了红色
通过IteratorStatus实例可以判断当前迭代了几个元素和当前元素索引等,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>iterator示例</title> </head> <body> <table border="1"> <tr> <td>key值</td> <td>value值</td> <td>当前迭代了几个元素</td> <td>当前元素索引</td> <td>元素索引是否为偶数</td> <td>当前索引是否为奇数</td> <td>当前元素是否为第一个</td> <td>当前元素是否为最后一个</td> </tr> <! -- 遍历Map,将遍历的值放入militaryRank变量中 --> <s:iterator value="#{'1' :’士兵’, '2' :’少尉’, '3' :’中尉’, '4' :’上尉’}" id="militaryRank" status="sta" > <tr> <! -- 输出key value值 以及IteratorStatus实例中各属性 --> <td><s:property value="key"/></td> <td><s:property value="value"/></td> <td><s:property value="#sta.count"/></td> <td><s:property value="#sta.index"/></td> <td><s:property value="#sta.even"/></td> <td><s:property value="#sta.odd"/></td> <td><s:property value="#sta.first"/></td> <td><s:property value="#sta.last"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中显示Map中的key和value值以及IteratorStatus实例的属性值,如图9.14所示。
9.2.4 append标签
Struts 2中提供append标签用于将多个集合拼接组合成一个集合,其包含属性如表9.6所示。
图9.14 IteratorStatus实例的属性值
表9.6 append标签属性列表
使用append标签时,可使用多个param标签来指定用来组合的集合。下面来看如何使用append标签来组合多个List对象,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>append示例</title> </head> <body> <table border="1"> <! -- 使用append标签来组合多个List对象 --> <s:append id="militaryRanks"> <s:param value="{’士兵’, ’少尉’, ’中尉’, ’上尉’}"></s:param> <s:param value="{’少校’, ’中校’, ’上校’, ’大校’}"></s:param> </s:append> <! -- 遍历组合后的新List --> <s:iterator value="#militaryRanks" id="militaryRank" status="sta" > <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property value="militaryRank"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中显示组合成的List对象中的元素值,如图9.15所示。
同样可以使用append标签来组合多个Map对象,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>append示例</title> </head> <body> <table border="1"> <! -- 使用append标签来组合多个Map --> <s:append id="militaryRanks"> <s:param value="#{'1' :’士兵’, '2' :’少尉’, '3' :’中尉’, '4' :’上尉’}"></s:param> <s:param value="#{'5' :’少校’, '6' :’中校’, '7' :’上校’, '8' :’大校’}"></s:param> </s:append> <! -- 遍历组合后的新Map --> <s:iterator value="#militaryRanks" id="militaryRank" status="sta" > <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property value="key"/></td> <td><s:property value="value"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中显示组合成的Map对象中的key和value值,如图9.16所示。
图9.15 显示组合成的List对象中的元素值
图9.16 显示组合成的Map对象中的key和value值
使用append标签可以组合Map对象和List对象,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>append示例</title> </head> <body> <table border="1"> <! -- 使用append标签来组合List和Map 对象--> <s:append id="militaryRanks"> <s:param value="#{'1' :’士兵’, '2' :’少尉’, '3' :’中尉’, '4' :’上尉’}"></s:param> <s:param value="#{’少校’, ’中校’, ’上校’, ’大校’}"></s:param> </s:append> <! -- 遍历组合后的新集合 --> <s:iterator value="#militaryRanks" id="militaryRank" status="sta" > <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property value="key"/></td> <td><s:property value="value"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中显示组合后新集合中的元素值,如图9.17所示。
图9.17 显示组合后新集合中的元素值
9.2.5 merge标签
merge标签同append标签类似,也是用组合集合成一个新集合。下面使用merge标签来组合多个List对象,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Merge示例</title> </head> <body> <table border="1"> <! -- 使用append标签来组合多个List --> <s:merge id="militaryRanks"> <s:param value="{’士兵’, ’少尉’, ’中尉’, ’上尉’}"></s:param> <s:param value="{’少校’, ’中校’, ’上校’, ’大校’}"></s:param> </s:merge> <! -- 遍历组合后的新List --> <s:iterator value="#militaryRanks" id="militaryRank" status="sta" > <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property value="militaryRank"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中显示组合成的List对象中的元素值,如图9.18所示。
图9.18 显示组合成的List对象中的元素值
append标签的组合方式和merge标签组合方式有什么不同吗?
使用append标签来组合集合,是先添加一个集合中所有的元素,然后再添加下一个集合中的元素。而使用merge标签是先添加所有组合集合的第一个元素,然后再添加第二个元素。通过图9.19和图9.20这个组合示意图可以加深这两种组合方式的了解。
图9.19 append标签组合集合示意图(1)
图9.20 merge标签组合集合示意图(2)
9.2.6 generator标签
下面来看generator标签,使用该标签可以将指定的字符串分隔成多个子字符串,并将这些子字符串放置到一个集合中,其包含属性如表9.7所示。
表9.7 generator标签属性列表
下面使用generator标签分隔字符串,并通过iterator标签遍历所有的子字符串。这里值得注意的是,如果没有指定id属性,那么只能将iterator标签定义在generator标签体内,这样才能获得子字符串集合,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>generator示例</title> </head> <body> <table border="1"> <! -- 使用generator标签来分隔字符串,其中分隔符为"-" --> <s:generator separator="-" val="'800-800-812-152' "> <! -- 遍历由子字符串组成的集合,输出其中的所有子字符串 --> <s:iterator status="sta"> <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property/></td> </tr> </s:iterator> </s:generator> </table> </body> </html>
如果指定id属性,那么会将子字字符串集合储存在page范围中。这时可以通过iterator标签指定其变量名从而遍历该子字符串集合,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>generator示例</title> </head> <body> <table border="1"> <! -- 使用generator标签来分隔字符串,其中分隔符为"-",变量名为nums --> <s:generator separator="-" val="'800-800-812-152' " id="nums"></s:generator> <! -- 遍历由子字符串组成的集合,输出其中的所有子字符串 --> <s:iterator status="sta" value="#attr.nums" id="num"> <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property value="num"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中显示该字符串分隔后所有的子字符串,如图9.21所示。
9.2.7 subset标签
图9.21 显示该字符串分隔后所有的子字符串
subset标签用来取得集合的子集,其包含属性如表9.8所示。
表9.8 subset标签属性列表
下面通过subset标签取得源集合中的子集,设定其start属性为1表示从第二个元素开始取得,设定其count属性为2表示取得的元素数量为2。这里值得注意的是,如果没有指定id属性,那么只能将iterator标签定义在subset标签体内,这样才能获得子集合,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>subset示例</title> </head> <body> <table border="1"> <! -- 取得源集合中的子集,从第二个元素开始取得,取得的元素数量为2--> <s:subset source="{’士兵’, ’少尉’, ’中尉’, ’上尉’}" start="1" count="2"> <! -- 遍历子集合中的所有元素 --> <s:iterator status="sta"> <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property/></td> </tr> </s:iterator> </s:subset> </table> </body> </html>
如果指定id属性,那么会将子集合储存在page范围中。这时可以通过iterator标签指定其变量名从而遍历该子集合,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>subset示例</title> </head> <body> <table border="1"> <! -- 取得源集合中的子集,从第二个元素开始取得,取得的元素数量为2 --> <s:subset source="{’士兵’, ’少尉’, ’中尉’, ’上尉’}" start="1" count="2" id="militaryRanks"></s:subset> <! -- 遍历子集合中的所有元素 --> <s:iterator status="sta" value="#attr.militaryRanks" id="militaryRank"> <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property value="militaryRank"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中显示取得的子集合中的所有值,如图9.22所示。
图9.22 显示取得的子集合中的所有值
9.2.8 sort标签
sort标签用来通过指定的Comparator对集合中的元素进行排序,其包含属性如表9.9所示。
表9.9 sort标签属性列表
下面来看如何通过sort标签来对集合中的元素进行排序。首先新建自己的Comparator类,该类必须实现java.util.Comparator接口,这里使用字符串的comparaTo方法来实现对元素的排序比较,代码如下所示。
package net.hncu.comparator; import java.util.Comparator; public class myComparator implements Comparator { public int compare(Object arg0, Object arg1) { return ((String)arg0).compareTo((String)arg1); } }
通过sort标签的source指定用来排序的集合,并指定comparator属性为myComparator实例。这里值得注意的是,如果没有指定id属性,那么只能将iterator标签定义在sort标签体内,这样才能获得排序后集合,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>sort示例</title> </head> <body> <! -- 创建myComparator实例 --> <s:bean id="myCom" name="net.hncu.comparator.myComparator"/> <table border="1"> <! -- 指定集合以及myComparator实例 --> <s:sort source="{' bfdf' , ' cfdsf' , ' dfds' , ' afdsf' }" comparator="#myCom"> <! -- 对排序后集合中的元素进行输出 --> <s:iterator status="sta"> <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property/></td> </tr> </s:iterator> </s:sort> </table> </body> </html>
如果指定id属性,那么会将排序后集合储存在page范围中。这时可以通过iterator标签指定其变量名从而遍历该排序后集合,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>sort示例</title> </head> <body> <! -- 创建myComparator实例 --> <s:bean id="myCom" name="net.hncu.comparator.myComparator"/> <table border="1"> <! -- 指定集合以及myComparator实例 --> <s:sort source="{' bfdf' , ' cfdsf' , ' dfds' , ' afdsf' }" comparator="#myCom" id="strs"> </s:sort> <! -- 对排序后集合中的元素进行输出 --> <s:iterator status="sta" value="#attr.strs" id="str"> <tr <s:if test="#sta.odd">style="background-color:red"</s:if> > <td><s:property value="str"/></td> </tr> </s:iterator> </table> </body> </html>
运行该JSP页面,在页面中显示排序后集合中的所有元素值,如图9.23所示。
图9.23 显示排序后集合中的所有元素值