Как добавить циклический индекс тега c: forEach к атрибутам HTML-тега Struts?

Как я могу добавить индекс цикла тега c: forEach к атрибутам тега select/text struts?

Например.

<%@ 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: select?

ОБНОВЛЕНИЕ

Также был опробован следующий фрагмент, но он тоже не сработал <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>

person Salman Paracha    schedule 11.05.2011    source источник


Ответы (3)


После некоторого мучительного копания я, казалось, нашел проблему и, следовательно, решение. Тег c:forEach не экспортирует varStatus как переменную сценария, поэтому переменную varStatus нельзя использовать в RT Expr для свойства атрибут тега html:select.

Однако 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>

Я не думаю, что это чистое решение (но может быть единственным решением). Поэтому я позволю сообществу сначала проголосовать за этот ответ (или написать лучший ответ), прежде чем принять его как окончательный ответ.

person Salman Paracha    schedule 13.05.2011
comment
прождав целых два дня... и не получив никаких других ответов на эту проблему, я принимаю свой собственный ответ - person Salman Paracha; 15.05.2011

Это было бы вложенным выражением, которое не разрешено, попробуйте вместо этого использовать это

<html:select property='title_guest${gC.index}'>
person Pål Brattberg    schedule 12.05.2011

Мой метод

            <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>
person a.k.a Mark    schedule 24.11.2012