在JSP Expression </c:foreach>中访问JSTL <c:foreach> varStatus

时间:2015-03-04 08:36:17

标签: java jsp jstl el

我有一个导入接口的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尚未解决。如何在表达式中访问它?

2 个答案:

答案 0 :(得分:3)

在页面范围中创建的变量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>

但是如果你将它与J​​STL 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>

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

一样访问它
<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?

答案 1 :(得分:2)

如果您已经在迭代这些问题,为什么还需要索引?为什么使用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}