鐵手劍譜

          上善若水
          數據加載中……
          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 鐵手 閱讀(4129) 評論(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
            回復  更多評論    
          主站蜘蛛池模板: 新巴尔虎右旗| 丁青县| 桦南县| 海口市| 明星| 荆州市| 隆子县| 松潘县| 黑水县| 五指山市| 饶平县| 新安县| 阳曲县| 绿春县| 山东省| 漯河市| 新巴尔虎右旗| 嘉义市| 桂平市| 原平市| 南溪县| 玉龙| 东明县| 石屏县| 屏边| 太原市| 漳州市| 象州县| 澄江县| 甘德县| 尼勒克县| 兴国县| 上虞市| 项城市| 南康市| 汾西县| 错那县| 菏泽市| 拜泉县| 临泽县| 辰溪县|