铁手剑谱

上善若水
数据加载中……
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.

 

posted on 2005-06-01 14:43 铁手 阅读(3982) 评论(1)  编辑  收藏 所属分类: JavaStruts系列

评论

# Struts 秘籍(CookBook)[TrackBack] 2005-11-12 18:29 阿泠

本系列源改编自O'Reily的Strus Cookbook
[引用提示]阿泠引用了该文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: