零基础学Struts
上QQ阅读APP看书,第一时间看更新

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>
            <! -- 设置一个变量usernameaction范围中 -->
            <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>
            <! -- 设置一个变量usernamepage范围中 -->
            <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>
            <! -- 设置一个变量usernamerequest范围中 -->
            <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>
            <! -- 设置一个变量usernamesession范围中 -->
            <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>
            <! -- 设置一个变量usernameapplication范围中 -->
            <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">
                    <! -- 定义getValueAction,其实现类为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标签来组合ListMap 对象-->
              <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 显示排序后集合中的所有元素值