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集合就可以輸出最深處的屬性值了。