【问题标题】:Accessing JSTL <c:forEach> varStatus in JSP Expression在 JSP 表达式中访问 JSTL <c:forEach> varStatus
【发布时间】:2015-03-04 08:36:16
【问题描述】:

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

【问题讨论】:

    标签: java jsp jstl el


    【解决方案1】:

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

    【讨论】:

    • 尽管我们之前有误解,但我赞成并接受这个答案,因为它有效。特别是第 2 和第 3 代码 sn-ps 的组合。感谢您展示如何访问 ctr,我需要它来解决我在原始问题中无法提及的内容。
    • 感谢您了解 SO 上的沟通方式,很高兴它对您有帮助,可能对其他人也有帮助。
    • 你认为在 JSP 本身中设置属性违反了 MVC2 吗?
    • 不能真正从视图层与模型进行通信。
    【解决方案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}
    

    【讨论】:

    • 还有其他需要包含的uri吗? &lt;bean:define&gt; 说的是“未知标签”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2022-11-06
    相关资源
    最近更新 更多