Struts2 <s:lterator>标签的一个复杂应用 解析

jopen 10年前

官网对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>

此段代码的页面显示为:

Struts2 <s:lterator>标签的一个复杂应用 解析

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