在 JSP 表达式中访问 JSTL <c:forEach> varStatus

Accessing JSTL <c:forEach> varStatus in JSP Expression

我有一个导入接口的 JSP。界面有一个String[] QUESTION_ARRAY.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="com.mypackage.message.Questions"%>

<table>
    <c:forEach var="question" items="<%=Questions.QUESTION_ARRAY%>" varStatus="ctr">
        <tr>
            <td><%=Questions.QUESTION_ARRAY[ctr.index]%></td>
        </tr>
    </c:forEach>
</table>

[ctr.index]中,表示ctr未解决。我如何在表达式中访问它?

如果您已经在迭代问题,为什么还需要索引?为什么使用 JSTL 进行循环并使用 scriptlet 进行输出?

如果我对你的场景的理解正确,这应该如下所示:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<bean:define id="questions" type="ph.edu.iacademy.message.Questions" />

<table>
    <c:forEach var="question" items="questions.QUESTION_ARRAY" >
        <tr>
            <td>${question.text}</td>
        </tr>
    </c:forEach>
</table>

如果您真的想访问状态,那么您可以这样做:

${ctr.index}

在页面作用域中创建的变量ctr。要访问 JSP 表达式中的页面范围变量,您可以使用 pageContext 隐式对象。

<table>
  <% pageContext.setAttribute("questions", Questions.QUESTION_ARRAY); %>
  <c:forEach var="question" items="${questions}" varStatus="ctr">
    <tr>
      <td>
        <%=Questions.QUESTION_ARRAY[((LoopTagStatus)pageContext.getAttribute("ctr")).getIndex()]%>
      </td>
    </tr>
  </c:forEach>
</table>

但是如果你将它与 JSTL forEach 标签一起使用,它看起来很难看。最好构建 JSP EL 表达式。

<table>
  <% pageContext.setAttribute("questions", new Questions(){}.QUESTION_ARRAY); %>
  <c:forEach var="question" items="${questions}" varStatus="ctr">
    <tr>
      <td>
        ${questions[ctr.index]} 
      </td>
    </tr>
  </c:forEach>
</table>

如果您使用 forEach 标记的 var 属性,则即使此表达式也不是必需的,它定义了引用数组元素的变量,也在页面范围内。您可以像

一样访问它
<table>
  <% pageContext.setAttribute("questions", Questions.QUESTION_ARRAY); %>
  <c:forEach var="question" items="${questions}" >
    <tr>
      <td>
        ${question}
      </td>
    </tr>
  </c:forEach>
</table>

另请参阅此问题以了解其他替代方案:
How to reference constants in EL?