1.在說明s:iterator標籤的使用前,先了解下struts2中的Value Stack。
這裡參考了webwork中對Value Stack的描述,由於struts2是在webwork的基礎上進行升級的,
因此webwork對於Value Stack的表述同樣適用於struts2。在這裡不描述Value Stack具體做什麼,但有兩點需要注意:
2. 一個value stack本質上是一個List;
3.在棧中呼叫[n]將返回一個從位置n開始的子棧;
4.對於2舉個例子說明。假定Value Stack包含了[model,action,others],那麼
5.
6.[0] --- 返回 [model,action,others];
7.[1] --- 返回 [action,others];
8.[2] --- 返回 [others];
9.現在將開始介紹s:iterator的一些使用。以下程式碼片段均在開發環境eclipse3.4 wtp、tomcat5.5、jdk5上使用struts2.1.6測試通過。
10.
11.1) 、訪問 days
12.
13.defined List<String> days ["Monday","Thursday","Friday","Sunday"]
14.
15.view plaincopy to clipboardprint?
16.<s:iterator value="days"><s:property /></s:iterator>
17.<s:iterator value="days"><s:property /></s:iterator>
18.
19.2) 、使用 top 關鍵字使用(過濾掉Monday)
20.
21.defined List<String> days ["Monday","Thursday","Friday","Sunday"]
22.
23.view plaincopy to clipboardprint?
24.<s:iterator value="days">
25. <s:if test="top!='Monday'">
26. <s:property />
27. </s:if>
28.</s:iterator>
29.<s:iterator value="days">
30. <s:if test="top!='Monday'">
31. <s:property />
32. </s:if>
33. </s:iterator>
34.
35.top 指代當前迭代元素,可以為物件;
36.這裡的top可用[0].top替代,但不能使用[0]。
[0]代表整個棧物件。如果單純呼叫[0]將會呼叫其toString()方法輸出物件資訊;
37.
38.3)、使用 last / first 關鍵字使用
39.
40.defined String[][] aTs = { { "一", "二", "三", "四" },{ "一一", "二二", "三三", "四四"} };
41.
42.view plaincopy to clipboardprint?
43.<!--遍歷二維陣列,The trick here is to use 'top' as the value for the inner iterator-->
44. <s:iterator value="aTs" status="of">
45. <s:if test="#of.last"><br/></s:if>
46. <s:iterator value="top">
47.<!--亦可用[0].top替代。如果單純用[0],則會同時列印該處棧物件資訊-->
48. <s:property />
49. </s:iterator>
50. </s:iterator>
51.<!--遍歷二維陣列,The trick here is to use 'top' as the value for the inner iterator-->
52. <s:iterator value="aTs" status="of">
53. <s:if test="#of.last"><br/></s:if>
54. <s:iterator value="top">
55.<!--亦可用[0].top替代。如果單純用[0],則會同時列印該處棧物件資訊-->
56. <s:property />
57. </s:iterator>
58. </s:iterator>
59.
60.
61.iterator 標籤中的status屬性代表當前迭代的位置;
62.#of.last用於判斷當前是否跌到的最後一個元素;
63.last返回一個boolean型別;
64.first 返回一個boolean型別;
65.4)、使用 odd / even 關鍵字
66.
67.下面的例子要實現每行輸出顏色不同的效果。
68.
69.defined List<String> days ["Monday","Thursday","Friday","Sunday"]
70.
71.view plaincopy to clipboardprint?
72.<!--奇數行顯示為紅色,偶數行顯示為綠色-->
73. <s:iterator value="days" status="offset">
74. <s:else>
75. <s:if test="#offset.odd==true">
76. <li style="color: red" mce_style="color: red"><s:property /></li>
77. </s:if>
78. <s:else>
79. <li><s:property /></li>
80. </s:else>
81. </s:else>
82.</s:iterator>
83. <!--奇數行顯示為紅色,偶數行顯示為綠色-->
84. <s:iterator value="days" status="offset">
85. <s:else>
86. <s:if test="#offset.odd==true">
87. <li style="color: red" mce_style="color: red"><s:property /></li>
88. </s:if>
89. <s:else>
90. <li><s:property /></li>
91. </s:else>
92. </s:else>
93. </s:iterator>
94.
95.odd關鍵字用來判斷當前迭代位置是否為奇數行。odd返回boolean型別;
96.evne關鍵字用來判斷當前迭代位置是否為偶數行。even返回boolean型別
97.5)、總結下,當宣告iterator的status屬性時,通過#statusName.method 可以使用以下方法:
98.
99.even : boolean - 如果當前迭代位置是偶數返回true
100.odd : boolean - 如果當前迭代位置是奇數返回true
101.count : int - 返回當前迭代位置的計數(從1開始)
102.index : int - 返回當前迭代位置的編號(從0開始)
103.first : boolean - 如果當前迭代位置是第一位時返回true
104.last : boolean - 如果當前迭代位置是最後一位時返回true
105.modulus(operand : int) : int - 返回當前計數(從1開始)與指定運算元的模數
106.6)、最後再來看下在iterator中呼叫value stack的用法。
107.
108.假定countries是一個List物件,每一個country有一個name屬性和一個citys List物件,並且每一個city也有一個name屬性 。
那麼我們想要在迭代cities是訪問countries的name屬性就的用如下方式:
109.
110.
111.view plaincopy to clipboardprint?
112.<s:iterator value="countries">
113. <s:iterator value="cities">
114. <s:property value="name"/>, <s:property value="[1].name"/><br>
115. </s:iterator>
116.</s:iterator>
117. <s:iterator value="countries">
118. <s:iterator value="cities">
119. <s:property value="name"/>, <s:property value="[1].name"/><br>
120. </s:iterator>
121. </s:iterator>
122.
123.這裡的 <ww:property value="name"/>取的是ctiy.name;<ww:property value="[1].name"/>取得是country.name
124.<ww:property value="[1].name"/> 等價於 <ww:property value="[1].top.name"/>
125.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)
126. '[n]'標記引用開始位置為n的子棧(sub-stack),而不僅僅是位置n處的物件。
因此'[0]'代表整個棧,而'[1]'是除top物件外所有的棧元素。