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集合就可以输出最深处的属性值了。