Struts2 <s:lterator>標簽的一個復雜應用 解析
官網對iterator標簽的描述:
Description
Iterator will iterate over a value. An iterable value can be any of: java.util.Collection, java.util.Iterator,
| Parameters | |||||
Name |
Required |
Default |
Evaluated |
Type |
Description |
|---|---|---|---|---|---|
| id | false | false | String | Deprecated(棄用). Use 'var' instead | |
| status | false | false | false | Boolean | If specified, an instanceof IteratorStatus will be pushed into stack upon each iteration |
| value | false | false | String | the iteratable source to iterate over, else an the object itself will be put into a newly created List | |
| var | false | false | String | Name used to reference the value pushed into the Value Stack | |
下面來看一段相關的代碼:
<s:form id="materialForm" action="addMaterial" theme="simple">
<table>
<tr>
<td>材料名</td>
<td>價格</td>
<td>庫存量</td>
<td>過期日期</td>
</tr>
<s:iterator value="new int[4]" status="m">
<tr>
<td><s:textfield name="%{'materialList['+#m.index+'].material'}" /></td>
<td><s:textfield name="%{'materialList['+#m.index+'].bid'}" /></td>
<td><s:textfield name="%{'materialList['+#m.index+'].mount'}" /></td>
<td><sx:datetimepicker name="%{'materialList['+#m.index+'].expireDate'}" /></td>
</tr>
</s:iterator>
<tr>
<td colspan="4"><s:submit value="提交"></s:submit>
</tr>
</table>
</s:form> 此段代碼的頁面顯示為:

<s:iterator value="new int[4]" status="m">,解析:迭代創建一個新的包含4個元素的整型(只能是int或能直接轉成int的類型如byte也可以,String、double就不行)數組集合,迭代的次數就是元素個數4,創建的Object將會放入此集合里面去,如果value="new int[3]",則頁面只顯示3行文本框。此迭代器的"迭代狀態碼"設為"m",每一次迭代對應一個狀態數據,"迭代狀態碼"有屬性index和count,其中"count" is 1-based, "index" is 0-based。
對于上面的代碼name="%{ 'materialList['+#m.index+'].bid' }"(其中要傳遞的materialList是List<Material>類型的),解析:“%{}”:取大括號里面的OGNL表達式的字符串類型值,#m.index:取當前"迭代狀態碼"的index屬性值,在第一次迭代時它的值就是0,materialList[x]:要去傳遞的materialList實例屬性(此屬性可能就是其他類的實例)的第x+1個元素,materialList[x].bid:即集合materialList實例的第x+1個元素的bid屬性。materialList集合實例有4個Material類型元素,每個元素都有material、bid、mount、expireDate這四個屬性。總的意思:創建一個文本框,它要提交的數據是materialList這個包含了Material元素(此元素又包含了相關屬性)的集合實例。
再看一個迭代輸出的例子:
<s:iterator value="materialList" >
<tr>
<td><s:property value="material" ></s:property></td>
<td><s:property value="bid" ></s:property></td>
<td><s:property value="mount" ></s:property></td>
<td><s:property value="expireDate" ></s:property></td>
</tr>
</s:iterator> 以上代碼是迭代輸出materialList集合中Material類型元素中的所有屬性值。雖然materialList中沒有直接的material bid mount expireDate屬性,但它的Material類型的元素有,這樣通過迭代materialList集合就可以輸出最深處的屬性值了。