鐵手劍譜

          上善若水
          數(shù)據(jù)加載中……
          Struts秘籍之第2段:第3.5式: 在JSTL循環(huán)中使用索引屬性

          第3.5式. 在JSTL循環(huán)中使用索引屬性

          問(wèn)題

          你想要在在JSTL c:forEach循環(huán)而不是Struts logic:iterate循環(huán)中通過(guò)Struts html標(biāo)簽使用索引屬性。

          動(dòng)作要領(lǐng)

          為了創(chuàng)建一個(gè)簡(jiǎn)單索引屬性的字段,可使用bean:define標(biāo)簽將循環(huán)計(jì)數(shù)暴露為一個(gè)可用于運(yùn)行時(shí)表達(dá)式的腳本變量:

           

          <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>

           

          如果索引屬性是一個(gè)嵌套的bean 并且你使用的是indexed="true" 屬性,那么可以將Struts logic:iterate標(biāo)簽替換為JSTL c:forEach:

           

          <c:forEach var="theNestedItem" items="${MyForm.myNestedItems}">
            
          <br/><html:text name="theNestedItem" 
                        property
          ="nestedProperty"
                        indexed
          ="true"/>
          </c:forEach>

           

          動(dòng)作變化

          JSTL的c:forEach標(biāo)簽提供了一些額外的功能并且比logic:iterate更加易用。需要循環(huán)遍歷的條目可以通過(guò)使用EL來(lái)指定。JSTL 標(biāo)簽允許對(duì)集合的子集上進(jìn)行更多的控制,并且循環(huán)狀態(tài)的細(xì)節(jié)也很容易獲得。然而,如同所有JSTL標(biāo)簽一樣,沒(méi)有腳本變量被創(chuàng)建。我們?cè)谄渌惺街兴^(guò),在處理索引屬性時(shí),不得不使用腳本變量。特別是如果你沒(méi)有使用struts-el標(biāo)簽庫(kù)更是如此。

          bean:define標(biāo)簽從JSTL創(chuàng)建的范圍變量中創(chuàng)建一個(gè)基本變量。這個(gè)bean:define標(biāo)簽基于取自value屬性或者標(biāo)簽體的值創(chuàng)建了一個(gè)新的范圍變量和對(duì)應(yīng)的腳本變量。后一種方式在JSTL和Struts標(biāo)簽之間建立了一個(gè)橋。在這一招中,bean:define標(biāo)簽用于創(chuàng)建一個(gè)包含可用于訪問(wèn)索引屬性的索引的變量。你可以在第3.4式中的選擇喜好顏色的標(biāo)但中使用這種技術(shù)。

           

          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>

           

          根據(jù)第3.4式,你可以使用Struts-El標(biāo)簽來(lái)消除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>

           

          如果需要為一個(gè)對(duì)象的嵌套屬性創(chuàng)建一個(gè)HTML 輸入字段,而該對(duì)象是一個(gè)索引屬性,那么請(qǐng)?jiān)赟truts html 標(biāo)簽中指定indexed="true" 屬性。indexed屬性的用法在使用JSTL c:forEach循環(huán)和使用logic:iterate循環(huán)時(shí)是一樣的。下面是這種技術(shù)如何使用在第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>

           

          渲染后的索引值被正確產(chǎn)生,哪怕是使用了begin, end, 和step屬性來(lái)控制循環(huán)。下面的c:forEach用法演示了如何為集合的第1個(gè)和第3個(gè)元素產(chǎn)生輸入字段:

           

          <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>

           

          這將產(chǎn)生下面的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>

           

          為了在循環(huán)中渲染動(dòng)態(tài)數(shù)據(jù)以供顯示,JSTL 工作的很好,并且比對(duì)贏得Struts 標(biāo)簽更易使用。你可以看到,JSTL 在訪問(wèn)索引屬性方面比Struts 標(biāo)簽支持的更好。例如,下面的代碼就展示了喜好顏色可以如何顯示:

           

          <c:forEach var="color" items="${favs.color}">
              
          <li><c:out value="${color}"/></li>
          </c:forEach>

           

          相關(guān)招式

          第3.4式演示了索引屬性的類(lèi)似用法。

          你可以參考JSTL 的相關(guān)文檔和信息,以及書(shū)籍。JSTL規(guī)范參見(jiàn)http://java.sun.com/jsp/jstl.

           

          posted on 2005-06-01 14:43 鐵手 閱讀(4129) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): JavaStruts系列

          評(píng)論

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

          本系列源改編自O(shè)'Reily的Strus Cookbook
          [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
          主站蜘蛛池模板: 攀枝花市| 荥阳市| 河池市| 福贡县| 黄浦区| 平阳县| 息烽县| 紫金县| 涿州市| 南和县| 公主岭市| 萨迦县| 青铜峡市| 巴楚县| 兰州市| 那坡县| 永康市| 温宿县| 荥阳市| 兴海县| 宜章县| 隆德县| 黄浦区| 永仁县| 辽宁省| 长垣县| 双流县| 沁水县| 遂川县| 安岳县| 深泽县| 凉城县| 饶阳县| 灵丘县| 磴口县| 天津市| 芷江| 且末县| 德阳市| 枣阳市| 安福县|