2011-05-11 81 views
4

如何將c:forEach標記的循環索引附加到struts select/text標記的屬性?如何將c:forEach標記的循環索引附加到Struts HTML標記屬性?

例如。

<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%> 

<c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC"> 
    <div class="section guest-details"> 
     <html:select property='title_guest<c:out value="${gC.index}"/>'> 
      <html:options collection="titles" property="code" labelProperty="value" /> 
     </html:select> 
    </div> 
</c:forEach> 

引發以下錯誤

javax.servlet.jsp.JspException at org.apache.struts.taglib.html.SelectTag.calculateMatchValues(SelectTag.java:246)

現在,當我在<html:select ...調試代碼它表明,當財產屬性將它設置,其設定爲"title_guest<c:out value="${gC.index}"/>"這可能是事故的原因上面的例外。

另外,我應該提到的是,如果我使用上述格式將循環索引附加到標準html標籤屬性(如<select>標籤),則代碼正常工作。

例如

<c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC"> 
    <div class="section guest-details"> 
     <select name='title_guest<c:out value="${gC.index }"/>'> 
      <option value="">Select Title</option> 
     </select> 
    </div> 
</c:forEach> 

正確輸出預期的HTML

我在做什麼錯了,我應該使用EL創建將填充HTML的「財產」屬性中的字符串:選擇標籤?

UPDATE

下面的代碼片段也嘗試了,但這並沒有工作,要麼 <html:select property="title_guest${gC.index}">

而且,無論是做這項工作

<c:set var="guestTitle">title_guest${gC.index}</c:set> 
<html:select property="${guestTitle}" styleClass="{required: true}"> 
<html:options collection="titles" property="code" labelProperty="value" /> 
</html:select> 

回答

8

經過一番痛苦的挖掘,我似乎找到了問題,因此找到了解決辦法。所述C:的forEach標籤不所述varStatus導出爲腳本變量,因此varStatus變量不能在RT Expr的用於HTML的屬性屬性:選擇標籤。

但是,c:forEach確實會將varStatus變量導出爲pageContext屬性,該屬性可以被檢索並用於提取索引/計數。唯一的問題是您必須導入javax.servlet.jsp.jstl.core.LoopTagStatus類,並使用它來手動重新創建varStatus變量,以便它可以在腳本中使用。

下面是代碼片段那工作

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    import="javax.servlet.jsp.jstl.core.LoopTagStatus" 
%> 
... 
<c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC"> 
    <% LoopTagStatus gN = (LoopTagStatus)pageContext.getAttribute("gC"); %> 
    <html:select property='<%="title_guest"+gN.getIndex()%>'> 
    <html:options collection="titles" property="code" labelProperty="value" /> 
    </html:select> 
</c:forEach> 

我不認爲這是一個乾淨的解決方案(但可能是唯一的解決方案)。因此,在我接受它作爲最終答案之前,我將首先讓社羣對此答案進行投票(或者寫出更好的答案)。

+0

,我接受我自己的答案 –

0

這將是一個嵌套的表達,這是不允許的,試着用這個代替

<html:select property='title_guest${gC.index}'> 
+0

未等待整整兩天......但不接受任何其他的回答這個問題後,制定出 –

0

我的方式

  <c:forEach begin="1" end="${page.totalPages}" varStatus="lp"> 
       <li><a href="<c:url value="/course?page=${pageScope.lp.index}"/>">${pageScope.lp.index}</a></li> 
      </c:forEach>