Struts2 常用标签使用

date标签 

作用:用来格式化显示日期的格式。

它可以用一种你指定的格式来显示 (如:“yyyy-MM-dd”),可以生成通俗易懂的注释(如:in 2 hours,14 minutes),或者用预先定义的一个格式来显示(如在properties配置文件中配置'struts.date.format').如果没有找到 这个struts.date.format,则会找默认的DateFormat.MEDIUM来格式化你的日期对象。当然如果在值栈中没有找你对应的日期对象,则会返回空格。

可配置的标签属性有:

· name

· nice

· format

下面这些功能的使用决定于nice属性与format属性。

1、nice属性为true

i18n key

default

struts.date.format.past

{0} ago

struts.date.format.future

in {0}

struts.date.format.seconds

an instant

struts.date.format.minutes

{0,choice,1#one minute|1<{0} minutes}

struts.date.format.hours

{0,choice,1#one hour|1<{0} hours}{1,choice,0#|1#, one minute|1<, {1} minutes}

struts.date.format.days

{0,choice,1#one day|1<{0} days}{1,choice,0#|1#, one hour|1<, {1} hours}

struts.date.format.years

{0,choice,1#one year|1<{0} years}{1,choice,0#|1#, one day|1<, {1} days}

2、nice属性为 false,format属性指定的格式 如:dd/MM/yyyy

在这种情况下,format属性将被使用。

3、nice属性为false,format属性没有指定。

i18n key

default

struts.date.format

if one is not found DateFormat.MEDIUM format will be used

4、参数

Name

Required

Default

Evaluated

Type

Description

format

false

 

false

String

日 期格式

id

false

 

true

String

 与普通html的id一样

name

true

 

true

String

日 期的值

nice

false

false

true

Boolean

是否打印出更nicely的格式

例子:

国际化文件的使用

<s:date name="person.birthday" format="dd/MM/yyyy" />
   <s:date name="person.birthday" format="%{getText('some.i18n.key')}" />
   <s:date name="person.birthday" nice="true" />
   <s:date name="person.birthday" />

日期格式API

 

字母

日期或时间元素

表示

示例

G

Era 标志符

Text

AD

y

Year

1996; 96

M

年中的月份

Month

Julyde>; de>Julde>; de>07de>

w

年中的周数

Number

de>27de>

W

月份中的周数

Number

de>2de>

D

年中的天数

Number

de>189de>

d

月份中的天数

Number

de>10de>

F

月份中的星期

Number

de>2de>

E

星期中的天数

Text

de>Tuesdayde>; de>Tuede>

a

Am/pm 标记

Text

de>PMde>

H

一天中的小时数(0-23)

Number

de>0de>

k>

一天中的小时数 (1-24)

Number

de>24de>

K

am/pm 中的小时数(0-11)

Number

de>0de>

h

am/pm 中的小时数(1-12)

Number

de>12de>

m

小时中的分钟数

Number

de>30de>

s

分钟中的秒数

Number

de>55de>

S

毫秒数

Number

de>978de>

z

时区

General time zone

de>Pacific Standard Timede>; de>PSTde>; de>GMT-08:00de>

Z

时区

RFC 822 time zone

de>-0800de>


如果用oracle的话,如果你写的正确的日期格式,用String也可以的。Oracle的to_date函数可以将CHAR、VARCHAR2、 NCHAR、NVARCHAR2类型数据转换成DATE数据类型的值. 如果不指定格式,则会用默认的格式。默认的格式包为:NLS_TERRITORY。更多的信息应该参考Oracle的文档了。

action

 

 使用action标签,可以允许在jsp页面中直接调用Action,(类似AJAX页面调用)在调用Action时候,可以指定需要被调用的Action的name和namespace.如果指定了executeResult参数的属性值为true,该标签会把Action的处理结果(视图资源)包含到本页面中. 使用action标签指定属性有: 

id: 可选属性,作为该Action的引用ID    
   
name:必选属性,指定调用Action
   
namespace:可选属性,指定该标签调用Action所属namespace    
   
executeResult:可选属性,指定是否将Action的处理结果包含到本页面中.默认值为false,不包含.    
   
ignoreContextParam:可选参数,指定该页面的请求参数是否需要传入调用的Action中,默认值是false,即传入参数. 

<s:action name="login" executeResult="true" namespace="/"></s:action> 

传递参数 

<s:action name="actinName" executeResult="true" namespace="/"> 
    <s:param name="currentPage" value="传递的值"></s:param> 
   </s:action> 

<s:param ></s:param>是以request方式的值的,而不是以参数传值 

所以request.getParameter("")会获取不到值 

通过request.getAttribute("")方式可以获取 

另外:使用<s:param ></s:param> value指代的是action定义的对象的名称,而不是一个值 

和 <s:textfield>中的name是一个意思,所以要要传递字符串的不能把值写value中而应该写到 

<s:param >写到这里</s:param> 

 

bean

 

下面我们使用一个货币转换例子来说明bean标签的使用,在这个例子里我们将美元转换为人民币。
下面是CurrencyConverter类
package com.zcl.struts.beantag;

public class CurrencyConverter {
    private float rmb ;
    private float dollars ;
    public float getRmb() {
        return dollars * 7;
    }
    public void setRmb(float rmb) {
        this.rmb = rmb;
    }
    public float getDollars() {
        return rmb/7;
    }
    public void setDollars(float dollars) {
        this.dollars = dollars;
    }
}

下一步就是在jsp文件里使用bean标签创建一个CurrencyConverter bean的实例,我们也能使用bean标签将值压入ValueStack里或者设置一个top-level在ActionContext里引用它。

下面是index.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=populateRegister.action">
<html>
  <head>
    <title>bean tag</title>
  </head>
  <body>
    using the bean tag: 
      <s:bean name="com.zcl.struts.beantag.CurrencyCoverter">
          <s:param name="dollars" value="100" />
          100 Dollars = <s:property value="rmb"/> RMB
      </s:bean><br>
      push the value onto the ValueStack:
      <s:bean name="com.zcl.struts.beantag.CurrencyCoverter" var="converter">
          <s:param name="dollars" value="200" />
      </s:bean>
      200 Dollars = <s:property value="#converter.rmb"/> RMB
  </body>
</html>

 

 

sort

Java代码
package com.struts2.tag.exer.web.utils;

import java.util.Comparator;

public class MyComparable implements Comparator<Object> {
        //根据字符串长度排序。
    public int compare(Object obj1, Object obj2) {
        return ((String)obj1).length()-((String)obj2).length();
    }
}

sort.jsp: 

Html代码
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
    <head><title>Sort</title></head>
    <body>
    
        <table border="1" width="200">
            <tr>
                <td colspan="2">Sort</td>
            </tr>
            
            <tr>
                <td>Book Name</td>
                <td>Author</td>
            </tr>        
        
        <s:bean id="mycomparator" name="com.struts2.tag.exer.web.utils.MyComparable"/>
        <s:sort source="{'AJAX in Action','MyBatis','JavaScrpit','SQL Server'}" comparator="#mycomparator">
            
            <s:iterator status="st">
                <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
                    <td><s:property/></td>
                </tr>
            </s:iterator>
            
        </s:sort>
                
        </table>
        
    </body>
</html>

subset

 

subset标签用于取得集合的子集,该标签的底层通过org.apache.Struts2.util.Subset.IteratorFilter类提供实现。使用subset标签可以指定如下几个属性:
1
count:可选属性,指定子集中元素的个数,默认取得源集合的所有元素
2
source:可选属性,指定源集合,如果不指定,默认取得valueStack栈顶的集合,一般都会指定
3
start:可选属性,指定从源集合的第几个元素开始截取,,默认从第一个元素(即start=0)开始
4
decider:可选属性,由开发者自己决定是否选中该元素
?
一般用法如下:
?
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>使用s:subset标签截取集合元素</title>
</head>
<body>
<table border="1" width="200">
<s:subset source="{'Java','Spring2.0','J2EE','Ajax','WebWork'}"
start="1" count="3">
<s:iterator status="st">
<tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
<td><s:property/></td>
</tr>
</s:iterator>
</s:subset>
</table>

 

generator

 

generator标签,该标签可以将指定字符串按指定分隔符分割成多个字串。生成的多个字串可以用iterator标签进行迭代输出。可以这么理解:generator标签将一个字符串转换成一个List集合。在该标签体内,整个临时生成的集合将为Valuestack的顶端,但一旦该标签结束,生成的集合将被移除Valuestack。generator标签有如下几个属性:
1、count属性:指定生成集合中元素的总数。可选属性。
2、val属性:必填属性,指定被解析的字符串。
3、separator属性:这是一个必填属性,指定用于分割字符串的分隔符。
4、converter属性:可选属性,指定一个转换器,转换器负责将生成的集合中的每个字符串转换成对象,通过这个转换器可以将一个含有分隔符的字符串解析成对象的集合。转换器必须一个继承org.apache.struts2.util.IteratorGenerator.Converter的对象。
5、var属性,可选属性。如果指定了该属性,则将生成的集合保存在Stack Context中。如果不指定该属性,则将生成的集合放入ValueStack的顶端,该标签一结束,生成的集合就被移除。该属性也可替换成id。
 
我在JsP上测试的代码为:
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<head>
    <title>使用s:generator生成集合</title>
</head>
<body>
<s:debug/>

<s:generator val="'a,b, c'" separator="," id="iter1">
</s:generator>
使用generator标签将指定字符串解析成List集合0
<table border="1" width="240">
<!-- 在generator标签内,得到的List集合位于ValueStack顶端 -->
<s:generator val="'Struts 2权威指南,轻量级Java EE企业应用实战,
    疯狂Ajax讲义'" separator="," id="iter">
<!-- 没有指定迭代哪个集合,直接迭代ValueStack顶端的集合 -->
<s:iterator status="st">
    <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
        <td><s:property/></td>
    </tr>
</s:iterator>
</s:generator>
</table>

<BR><BR><BR><BR>
使用generator标签将指定字符串解析成List集合1
<table border="1" width="240">
<s:iterator status="st" value="#request.iter1" id="name">
    <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
        <td><s:property value="name"/></td>
    </tr>
</s:iterator>
</table>

<BR><BR><BR><BR>
使用generator标签将指定字符串解析成List集合2
<table border="1" width="240">
<s:iterator status="st" value="#iter1" id="name">
    <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
        <td><s:property value="name"/></td>
    </tr>
</s:iterator>
</table>
<s:property value="#attr"/>
<BR>
<s:property value="#iter"/>
<BR><BR><BR>
<a href="s-generator-count.jsp" mce_href="s-generator-count.jsp">s-generator-count.jsp</a>
</body>
</html>

 

append

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>   
<!--  引入struts2的标签库 -->   
<%@ taglib uri="/struts-tags" prefix="s"%>   
<%   
    String path = request.getContextPath();   
    String basePath = request.getScheme() + "://"  
            + request.getServerName() + ":" + request.getServerPort()   
            + path + "/";   
%>   
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
<html>   
    <head>   
        <base href="<%=basePath%>">   
    </head>   
    <body>   
        <h1>Struts2控制标签案例</h1>   
        <!--     
      <h3>OGNL中的集合操作</h3>   
      <h5>OGNL直接生成List类型的集合</h5>   
         
         语法格式:{e1,e2,e3,e4,.......}   
         以上的语法中就直接生成了一个List类型的集合,该集合中包含的元素有:e1,e2,e3,e4,   
         如果需要更多的集合元素,则元素之间可以使用英文逗号分隔.   
          
       <h5>OGNL直接生成Map类型的集合</h5>   
          
       语法格式:# {key:value,key1:value1,key2:value2,.....}   
       以上的语法中就直接生成了一个Map类型的集合,该Mapd对象中的每个key-value对象之间用英文的冒号隔开   
       ,多个元素之间用逗号分隔。   
          
       <h5>OGNL提供的对集合的操作符</h5>   
          
          OGNL提供了两个元素符:in 和not in   
            in代表的是:判断某个元素是否在指定的集合中   
            not in代表的是:某个元素是否不在指定的集合中   
          除此之外:OGNL还允许通过某个规则取得集合的子集。取得子集的操作符有:   
          1、? : 取出所有符合选择逻辑的元素   
          2、^ : 取出符合选择逻辑的第一个元素   
          3、$ : 取出符合选择逻辑的最后一个元素   
              
       <h4>控制标签</h4>   
          
         Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。   
         数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作   
         也可以完成对集合的合并,排序等操作。常见的控制标签有:   
         if :用于控制选择输出的标签   
         elseif:与if标签结合使用,用于控制选择输出的标签   
         else :与if标签结合使用,用于控制选择输出的标签   
         iterator:是一个迭代器,用于将集合迭代输出   
         sort:用于对集合排序   
         append:用于将多个集合拼接成一个新的集合   
         generator:是一个字符串解析器,用于将一个字符串解析成一个新的集合   
         merge:用于将多个集合拼接成一个新的集合,但与append的拼接方式有所有不同   
         subset:用于截取集合的部分元素,形成一个新的集合   
            
       -->   
        <h5>   
            if/elseif/else标签   
        </h5>   
           
            这三个标签都是用于进行分支控制的,它们都是根据一个Boolean表达式的值,来决定是否计算、输出 标签体的内容   
            test:为boolean表达式 如果为真执行标签体 否则不执行   
            <s:set name="score" value="80"></s:set>   
<s:if test="%{#attr.score>60}"> 成绩及格了..... </s:if> <s:elseif test="%{#attr.score>35}"> 成绩实在是太烂了....   </s:elseif> <s:else> 成绩以及惨不忍睹....... </s:else> 上面的if/elseif/else标签组合使用与Java语言中的if/else if/else条件控制结构相似 <s:debug></s:debug> <h4> Iterator标签的使用 </h4> Iterator标签主要用于对集合进行迭代,这里的集合包含List、Set和数组,也可以对Map类型的对象 进行迭代输出 可以指定3个属性: value :这是一个可选属性,value属性指定的就是被迭代的集合,被迭代的集合通常 使用OGNL表达式指定。如果没有指定value属性,则使用ValueStack栈顶的集合 id:这是可选属性,该属性指定了集合里的元素的ID status:可选属性,该属性指定了迭代时的IteratorStatus实例,通过该实例即可以判定当前 迭代的元素的属性。 例如:是否是最后一个元素,以及当前迭代元素的索引等。 IteratorStatus实例包含以下几个方法: int getCount()返回当前迭代了几个元素 int getIndex();返回当前元素的索引 boolean isEven();返回当前迭代的索引是否是偶数 boolean isFirst();返回当前迭代的索引是否是第一个元素 boolean isLast();返回当前迭代的索引是否是最后一个元素 boolean isOdd();返回当前迭代的索引是否是奇数 var:当前迭代的元素 begin:开始的位置 end:结束的位置 step:跨度 <table border="1px" cellpadding="0" cellspacing="0"> <caption> 图书名称信息 </caption> <tr> <th> 图书的名称 </th> </tr> <s:iterator var="name" value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}" status="st"> <s:if test="#st.odd"> <tr style="background-color: red;"> <td> <s:property value="name" /> </td> </tr> </s:if> <s:else> <tr style="background-color: green;"> <td> <s:property value="name" /> </td> </tr> </s:else> </s:iterator> </table> 作业实现表格各行换色 <table border="1px" cellpadding="0" cellspacing="0"> <caption> 图书信息 </caption> <tr> <th> 图书的名称 </th> <th> 图书的作者 </th> </tr> <s:iterator var="name" value="#{'HTML入门':'redarmy','Java基础':'lihui','CSS入门':'baobao','JavaWeb实战':'yq'}"> <tr> <td> <s:property value="key" /> </td> <td> <s:property value="value" /> </td> </tr> </s:iterator> </table> <h5> append标签的使用 </h5> append标签用于将多个对象拼接起来,形成一个新的集合 <h5> List集合拼接 </h5> <s:append var="newList"> <s:param value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}"></s:param> <s:param value="{'HIbernate教程','Struts2教程'}"></s:param> </s:append> <table border="1px" cellpadding="1px" cellspacing="1px"> <caption> 图书信息2 </caption> <tr> <th> 图书名称 </th> </tr> <s:iterator value="#newList"> <tr> <td> <s:property /> </td> </tr> </s:iterator> </table> <h5> Map集合的拼接 </h5> <s:append var="newMap"> <s:param value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param> <s:param value="#{'HIbernate教程':'李刚','Struts2教程':'redarmy'}"></s:param> </s:append> <table border="1px" cellpadding="1px" cellspacing="1px"> <caption> 图书信息2 </caption> <tr> <th> 图书名称 </th> <th> 图书作者 </th> </tr> <s:iterator value="#newMap"> <tr> <td> <s:property value="key" /> </td> <td> <s:property value="value" /> </td> </tr> </s:iterator> </table> <h5> map List集合的拼接 </h5> <s:append var="newLM"> <s:param value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param> <!-- List方式要写成Map的形式 但没有value值 --> <s:param value="#{'HIbernate教程','Struts2教程'}"></s:param> </s:append> <table border="1px" cellpadding="1px" cellspacing="1px"> <caption> 图书信息2 </caption> <tr> <th> 图书名称 </th> <th> 图书作者 </th> </tr> <s:iterator value="#newLM"> <tr> <td> <s:property value="key" /> </td> <td> <s:property value="value" /> </td> </tr> </s:iterator> </table> <h5> merge标签 </h5> merge标签的用法看起来非常像append标签,但是有区别: <s:append var="ast"> <s:param value="{'html','css','ajax'}"></s:param> <s:param value="{'java','jsp','servlet'}"></s:param> <s:param value="{'struts2','mysql','hibernate'}"></s:param> </s:append> <s:merge var="mst"> <s:param value="{'html','css','ajax'}"></s:param> <s:param value="{'java','jsp','servlet'}"></s:param> <s:param value="{'struts2','mysql','hibernate'}"></s:param> </s:merge> <h3> append标签拼接 </h3> <s:iterator value="#ast"> <s:property /> </s:iterator> <h4> merge标签拼接 </h4> <s:iterator value="#mst"> <s:property /> </s:iterator> 以上看出:append标签的拼接方式是: 第1个集合中的第一个元素 第1个集合中的第二个元素 第1个集合中的第三个元素 第2个集合中的第一个元素 第2个集合中的第二个元素 第2个集合中的第三个元素 第3个集合中的第一个元素 第3个集合中的第二个元素 第3个集合中的第三个元素 merge标签的拼接方式是: 第1个集合中的第一个元素 第2个集合中的第一个元素 第3个集合中的第一个元素 第1个集合中的第二个元素 第2个集合中的第二个元素 第3个集合中的第二个元素 第1个集合中的第三个元素 第2个集合中的第三个元素 第3个集合中的第三个元素 <h5> generator标签 </h5> 将制定的字符串按指定的分隔符分隔成多个字串. count:可选属性,指定生成集合中元素的总数 separator:必填属性:指定解析字符串的分隔符 val:必填属性:指定解析字符串 converter:可选属性,转换器,该转换器负责将集合中的每个字符串转换成对象 id:可选属性,如果指明该属性则生成的集合放入到pageContext属性中 注释:generator分隔的字符串 ,如果在标签体内,整个临时生成的集合将位于ValueStack的顶端 .但标签结束时,被移出ValueStack。 <table border="1px"> <tr> <th> 名称 </th> </tr> <s:generator val="'this,is,a,doctor'" separator=","> <!-- 由于在generator标签体内,该集合位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 --> <s:iterator var="bname"> <tr> <td> <s:property value="bname" /> </td> </tr> </s:iterator> </s:generator> </table> <!-- 通过id标识此解析的集合存入到pageContext中 --> <s:generator separator="," val="'this,is,a,man'" id="bks"></s:generator> <h1> 标签体外打印解析的字符串集合 </h1> <s:iterator value="#attr.bks"> <s:property /> </s:iterator> <h1> subset标签 </h1> subset标签用于取得集合的子集,该标签的底层通过:org.apache.struts2.uitl.SubsetIteratorFilte类提供实现 属性: count:可选属性:代表子集中的元素个数,如果没有指定代表源集合的全部元素 source:可选属性:指定源集合,如果没有指定代表是valueStack的栈顶集合 start:可选属性:从第几元素开始截取 decider:可选属性:指定由开发者自己决定是否选中该元素。 注意事项: 在subset标签内时,subset标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集 将被移出valueStack栈。 <s:subset source="{'java','test','mybook','txs','lihui'}" start="1" count="3"> <!-- 由于在subset标签体内,该子集位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 --> <s:iterator> <s:property /> </s:iterator> <!-- 注意1代表的是第二元素 --> </s:subset> <h5> 实现自己的Decider实例 </h5> <s:bean name="edu.dc.MyDecider" id="mydecider"></s:bean> <h6> 通过自己定义的Decider实例来截取目标集合,生成子集 </h6> <s:subset source="{'01Java入门','JSP入门','Servlet入门','02Java基础案例','基于Java的经典案例'}" decider="#mydecider"> <s:iterator> <s:property /> </s:iterator> </s:subset> <h1> sort标签 </h1> 用于对指定集合元素进行排序,进行排序时,必须提供自己的排序规则,即实现自己的 Comparator,自己的Comparator需要实现java.util.Comparator接口 属性: comparator:必填属性,指定进行排序的comparator的实例 source:可选属性:指定排序的集合,如果没有指定代表是valueStack的栈顶集合 备注: 在sort标签内时,sort标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集 将被移出valueStack栈。 <s:bean var="mycomparator" name="edu.dc.MyComparator"></s:bean> <s:sort comparator="#mycomparator" source="{'JavaEE','css','JavaHTMl'}"> <s:iterator> <s:property /> </s:iterator> </s:sort> </body> </html> /**以上用到的Subset标签用到的bean类如下*/ package edu.dc; import org.apache.struts2.util.*; /** 自定定义Decider类,实现SubsetIteratorFilter.Decider */ public class MyDecider implements SubsetIteratorFilter.Decider { /** 实现Decider接口中的decide方法,该方法决定集合中的元素是否被选入到子集中 */ public boolean decide(Object arg0) throws Exception { System.out.println("----------------"); /** 把arg0造型为字符串 */ String str = (String) arg0; /** 如果集合中包含java 那么即可被选入到子集中 */ System.out.println("----------------" + (str.indexOf("Java") > 0)); return (str.indexOf("Java") > 0); } } /**以下是sort标签实例中用到的备案实例*/ package edu.dc; import java.util.Comparator; /** 需要实现Comparator接口 */ public class MyComparator implements Comparator<String> { /** * 如果该方法返回一个大于0的整数,则第一个元素大于第二元素,如果为0则相同 如果小于零,则第一个元素小于第二元素 */ public int compare(String o1, String o2) { /** 根据字符串的长度决定字符串的大小 */ return (o1.length() - o2.length()); } }
 

iterator

 

在说明s:iterator标签的使用前,先了解下struts2中的Value Stack。这里参考了webwork中对Value Stack的描述,由于struts2是在webwork的基础上进行升级的,因此webwork对于Value Stack的表述同样适用于struts2。在这里不描述Value Stack具体做什么,但有两点需要注意:

 一个value stack本质上是一个List;
在栈中调用[n]将返回一个从位置n开始的子栈;
对于2举个例子说明。假定Value Stack包含了[model,action,others],那么

[0] --- 返回 [model,action,others];
[1] --- 返回 [action,others];
[2] --- 返回 [others];
现在将开始介绍s:iterator的一些使用。以下代码片段均在开发环境eclipse3.4 wtp、tomcat5.5、jdk5上使用struts2.1.6测试通过。

1)、访问 days

defined  List<String>  days   ["Monday","Thursday","Friday","Sunday"]

[xhtml] view plaincopy
<s:iterator value="days"><s:property /></s:iterator>  

2)、使用top 关键字使用(过滤掉Monday)

defined  List<String>  days   ["Monday","Thursday","Friday","Sunday"]

[xhtml] view plaincopy
<s:iterator value="days">  
    <s:if test="top!='Monday'">  
        <s:property />  
    </s:if>  
</s:iterator>  

top 指代当前迭代元素,可以为对象;
这里的top可用[0].top替代,但不能使用[0]。[0]代表整个栈对象。如果单纯调用[0]将会调用其toString()方法输出对象信息;


3)、使用 last / first 关键字 defined String[][] aTs = { { "一", "二", "三", "四" },{ "一一", "二二", "三三", "四四"} }; [xhtml] view plaincopy
<!--遍历二维数组,The trick here is to use 'top' as the value for the inner iterator--> <s:iterator value="aTs" status="of"> <s:if test="#of.last"><br/></s:if> <s:iterator value="top"> <!--亦可用[0].top替代。如果单纯用[0],则会同时打印该处栈对象信息--> <s:property /> </s:iterator> </s:iterator> iterator 标签中的status属性代表当前迭代的位置; #of.last用于判断当前迭代到的元素是否为最后一个元素; last返回一个boolean类型; first返回一个boolean类型;
4)、使用 odd / even 关键字 下面的例子要实现每行输出颜色不同的效果。 defined List
<String> days ["Monday","Thursday","Friday","Sunday"] [xhtml] view plaincopy <!--奇数行显示为红色,偶数行显示为绿色--> <s:iterator value="days" status="offset"> <s:else> <s:if test="#offset.odd==true"> <li style="color: red" mce_style="color: red"><s:property /></li> </s:if> <s:else> <li><s:property /></li> </s:else> </s:else> </s:iterator> odd关键字用来判断当前迭代位置是否为奇数行。odd返回boolean类型; even关键字用来判断当前迭代位置是否为偶数行。even返回boolean类型
5)、总结下,当声明iterator的status属性时,通过#statusName.method可以使用以下方法: even : boolean - 如果当前迭代位置是偶数返回true odd : boolean - 如果当前迭代位置是奇数返回true count : int - 返回当前迭代位置的计数(从1开始) index : int - 返回当前迭代位置的编号(从0开始) first : boolean - 如果当前迭代位置是第一位时返回true last : boolean - 如果当前迭代位置是最后一位时返回true modulus(operand : int) : int - 返回当前计数(从1开始)与指定操作数的模数
6)、最后再来看下在iterator中调用value stack的用法。 假定countries是一个List对象,每一个country有一个name属性和一个citys List对象,并且每一个city也有一个name属性。那么我们想要在迭代citys时访问所属country的name属性就的用如下方式: [xhtml] view plaincopy
<s:iterator value="countries"> <s:iterator value="cities"> <s:property value="name"/>, <s:property value="[1].name"/><br> </s:iterator> </s:iterator> 这里的 <ww:property value="name"/>取的是ctiy.name;<ww:property value="[1].name"/>取得是country.name <ww:property value="[1].name"/> 等价于 <ww:property value="[1].top.name"/> we refer to a specific position on the stack: '[1]'. The top of the stack, position 0, contains the current city, pushed on by the inner iterator; position 1 contains the current country, pushed there by the outer iterator.(city处于当前栈,即top或者[0],而[1]指明了外层iterator对象,即country) '[n]'标记引用开始位置为n的子栈(sub-stack),而不仅仅是位置n处的对象。因此'[0]'代表整个栈,而'[1]'是除top对象外所有的栈元素。

 

posted @ 2015-01-08 22:26  贝壳风铃  阅读(198)  评论(0)    收藏  举报