【问题标题】:How to display values of an ArrayList that is defined in the JSP itself, using JSTL如何使用 JSTL 显示在 JSP 本身中定义的 ArrayList 的值
【发布时间】:2013-01-23 06:21:49
【问题描述】:

我有一个在 JSP 的 scriptlet 中定义的 ArrayList。在正文部分,我想使用 JSTL forEach 循环显示项目。

通过this one 之类的教程,我编写了以下代码:

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

<%
ArrayList<String> fruits = new ArrayList<String>();
fruits.add("Orange");
fruits.add("Apple");
%>

<html>
<head>
    <title>JSTL</title>
</head>
<body>
    <c:forEach var="fruit" items="${fruits}">
        <c:out value="${fruit}" />
    </c:forEach>
</body>
</html>

但是我得到一个空白页。我在上面的代码中哪里出错了?

我能找到的所有教程似乎都在 servlet 中定义了一个 ArrayList bean,并通过 request 将它们传递给 JSP。在 forEach 循环中,他们使用c:out${bean.prop} 来打印它。我没有这样尝试过。我想做一些更简单的事情,但似乎无法让这段代码工作。

【问题讨论】:

  • 找到它们的不是 JSTL。找到它们的是 EL(那些${} 的东西)。从stackoverflow.com/tags/el/info开始
  • BalusC,感谢您的链接。它清楚地解释了它在哪里寻找对象。
  • 不客气。至于 JSTL,请查看 stackoverflow.com/tags/jstl/info(您可以通过悬停标签直到出现黑框并单击其中的 info 链接来找到那些标签 wiki 页面)。至于具体问题,您实际上应该使用预处理 servlet(您应该避免在 JSP 中使用 &lt;% %&gt;)。请参阅stackoverflow.com/tags/servlets/info 中的第二个 hello world 示例

标签: jsp arraylist foreach jstl el


【解决方案1】:

添加 pageContext.setAttribute("fruits", fruits);

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="java.util.ArrayList" %>

<%
ArrayList<String> fruits = new ArrayList<String>();
fruits.add("Orange");
fruits.add("Apple");
pageContext.setAttribute("fruits", fruits);
%>
<html>
<head>
<title>JSTL</title>
</head>
<body>
    <c:forEach var="fruit" items="${fruits}">
     <c:out value="${fruit}" />
    </c:forEach>
</body>
</html>

【讨论】:

    【解决方案2】:

    您需要将数组放入请求中。在最后一次 fruits.add() 调用之后立即执行此操作。

    <%= request.setAttribute( "fruits", fruits ); %>
    

    【讨论】:

    • 成功了,谢谢!这是否意味着,只有我使用request.setAttribute() 设置的对象才能在 JSTL 标记中使用?我可以通过什么其他方式定义/设置对象,以便它们可用于 JSTL 标记?
    • page 范围呢?
    • 虽然这项工作有效,但它不适合作为最佳实践。相关:How to avoid Java Code in JSP-Files?
    • Luiggi,我同意,这不是最佳做法。我试图做的只是回答 OP 的直接问题,而不涉及如何使用许多可用的 Java Web 堆栈之一来实现 Web 应用程序。
    • 保罗,page 范围肯定会起作用。唯一需要注意的是,如果 JSP 执行转发或重定向,则该变量将不可用于后续 JSP。所以这是 OP 在使用 page 作用域之前要理解的一个重要区别。
    【解决方案3】:

    最简单的方法是使用并使用它来定义一个变量。

    <c:set var="fruits">
       <%= fruits %>
    <c:set>
    
    <c:forEach var="fruit" items="${fruits}">
        <c:out value="${fruit}" />
    </c:forEach
    

    是您在 scriptlet 中创建的数组列表。

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 2011-09-19
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      相关资源
      最近更新 更多