Struts秘籍之第2段:第3.5式: 在JSTL循环中使用索引属性

第3.5式. 在JSTL循环中使用索引属性
问题
你想要在在JSTL c:forEach循环而不是Struts logic:iterate循环中通过Struts html标签使用索引属性。
动作要领
为了创建一个简单索引属性的字段,可使用bean:define标签将循环计数暴露为一个可用于运行时表达式的脚本变量:
 
<c:forEach var="theItem" items="${MyForm.myItems}" varStatus="loopStatus">
  <bean:define id="itemIndex">
    <c:out value="${loopStatus.index}"/>
  </bean:define>
  <br/><html:text property='<%="myItem["+itemIndex+"]"%>'/>
</c:forEach>
 
如果索引属性是一个嵌套的bean 并且你使用的是indexed="true" 属性,那么可以将Struts logic:iterate标签替换为JSTL c:forEach:
 
<c:forEach var="theNestedItem" items="${MyForm.myNestedItems}">
  <br/><html:text name="theNestedItem" 
              property="nestedProperty"
              indexed="true"/>
</c:forEach>
 
动作变化
JSTL的c:forEach标签提供了一些额外的功能并且比logic:iterate更加易用。需要循环遍历的条目可以通过使用EL来指定。JSTL 标签允许对集合的子集上进行更多的控制,并且循环状态的细节也很容易获得。然而,如同所有JSTL标签一样,没有脚本变量被创建。我们在其他招式中所过,在处理索引属性时,不得不使用脚本变量。特别是如果你没有使用struts-el标签库更是如此。
bean:define标签从JSTL创建的范围变量中创建一个基本变量。这个bean:define标签基于取自value属性或者标签体的值创建了一个新的范围变量和对应的脚本变量。后一种方式在JSTL和Struts标签之间建立了一个桥。在这一招中,bean:define标签用于创建一个包含可用于访问索引属性的索引的变量。你可以在第3.4式中的选择喜好颜色的标但中使用这种技术。
 
What are your three favorite colors:
<c:forEach var="theColor" items="${FavoritesForm.color}"
     varStatus="loopStatus">
    <bean:define id="ctr">
        <c:out value="${loopStatus.index}"/>
    </bean:define>
    <br/><html:text property='<%="color["+ctr+"]"%>'/>
</c:forEach>
 
根据第3.4式,你可以使用Struts-El标签来消除scriptlet:
 
What are your three favorite colors:
<c:forEach var="theColor" items="${FavoritesForm.color}" 
varStatus="loopStatus">
  <br/><html-el:text property='color[${ctr}]'/>
</c:forEach>

 
如果需要为一个对象的嵌套属性创建一个HTML 输入字段,而该对象是一个索引属性,那么请在Struts html 标签中指定indexed="true" 属性。indexed属性的用法在使用JSTL c:forEach循环和使用logic:iterate循环时是一样的。下面是这种技术如何使用在第3.4式中的表单的喜好链接部分:
 
What are your favorite links?
<table>
    <tr>
        <th>Name</th>
        <th>URL</th>
    </tr>
    <c:forEach var="webLink" items="${FavoritesForm.webLinks}">
        <tr>
            <td>
                <html:text name="webLink" 
                       property="name" indexed="true"/>
            </td>
            <td>
                <html:text name="webLink" 
                       property="url" indexed="true"/>
            </td>
        </tr>
    </c:forEach>
</table>
 
渲染后的索引值被正确产生,哪怕是使用了begin, end, 和step属性来控制循环。下面的c:forEach用法演示了如何为集合的第1个和第3个元素产生输入字段:
 
<c:forEach var="webLink" items="${FavoritesForm.webLinks}"
         begin="1" end="3" step="2">
    <tr>
        <td>
            <html:text name="webLink" property="name" indexed="true"/>
        </td>
        <td>
            <html:text name="webLink" property="url" indexed="true"/>
        </td>
    </tr>
</c:forEach>
 
这将产生下面的HTML:
 
<tr>
    <td><input type="text" name="webLink[1].name" value=""></td>
    <td><input type="text" name="webLink[1].url" value=""></td>
</tr>
         
<tr>
    <td><input type="text" name="webLink[3].name" value=""></td>
    <td><input type="text" name="webLink[3].url" value=""></td>
</tr>
 
为了在循环中渲染动态数据以供显示,JSTL 工作的很好,并且比对赢得Struts 标签更易使用。你可以看到,JSTL 在访问索引属性方面比Struts 标签支持的更好。例如,下面的代码就展示了喜好颜色可以如何显示:
 
<c:forEach var="color" items="${favs.color}">
    <li><c:out value="${color}"/></li>
</c:forEach>
 
相关招式
第3.4式演示了索引属性的类似用法。
你可以参考JSTL 的相关文档和信息,以及书籍。JSTL规范参见 http://java.sun.com/jsp/jstl.

原文链接: http://www.dlog.cn/nicholascoder/diary/8946

你可能感兴趣的:(Struts秘籍之第2段:第3.5式: 在JSTL循环中使用索引属性)