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

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.

 

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