Как добавить индекс цикла тега c: forEach в атрибуты HTML-тега Struts? - PullRequest
4 голосов
/ 12 мая 2011

Как я могу добавить индекс цикла тэга ac: forEach к атрибутам структуры выбора / текстового тэга?

Например.

<%@ 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 для создания строки, которая будет заполнять атрибут "property" тега 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>

Ответы [ 3 ]

8 голосов
/ 13 мая 2011

После некоторого мучительного копания я, казалось, нашел проблему и, следовательно, решение.Тег c: forEach не экспортирует varStatus в качестве переменной сценария, и поэтому переменную varStatus нельзя использовать в RT Expr для атрибута property тег 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>

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

0 голосов
/ 24 ноября 2012

Мой путь

            <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>
0 голосов
/ 12 мая 2011

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

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