使用 c:foreach (JSP/JSTL) 遍历 ArrayList,变量不起作用

Posted

技术标签:

【中文标题】使用 c:foreach (JSP/JSTL) 遍历 ArrayList,变量不起作用【英文标题】:Iterating over an ArrayList with c:foreach (JSP/JSTL), Variable doesn't work 【发布时间】:2013-01-15 13:14:32 【问题描述】:

我知道,我的问题有无数的例子,但我经历了很多,无法弄清楚我的错误在哪里。

我正在迭代一个 ArrayList(TestSzenario)。 TestSzenario 类包含一个名为 name 的字符串变量,带有适当的 getter 和 setter。

这是我的代码:

<td><select name="selectSzenario" id="selectSzenario" size="1">
                <c:forEach items="<%=testszenario.getSzenariosForSummary() %>" var="szenario"> 
                    <option>$szenario.name</option>
                </c:forEach></select></td></tr>

我的问题是,变量不起作用。对于选择框中的每个选项,我总是得到 $szenario.name。我正确地声明了 JSTL-taglib,因为完成后站点中有多个选项,我知道迭代正在工作。我还查看了 html 源代码,foreach 已解决。

HTML 输出:

        <tr><td>Szenario:</td>
        <td><select name="selectSzenario" id="selectSzenario" size="1">

                    <option>$szenario.name</option>

                    <option>$szenario.name</option>
                </select></td></tr>

编辑答案 1: 谢谢,但我之前尝试过:

ArrayList<TestSzenario> szenarioList = testszenario.getSzenariosForSummary();
request.setAttribute("aList", szenarioList);
request.setAttribute("ts", testszenario);

<c:forEach items="$aList" var="szenario">
<option>$szenario.name</option>
</c:forEach></select></td></tr>

<c:forEach items="$ts.szenariosForSummary" var="szenario">
<option>$szenario.name</option>
</c:forEach></select></td></tr>

但在任何一种情况下,它甚至都不会遍历 List,导致只有 1 个选项(List 包含 2 个元素)。

【问题讨论】:

【参考方案1】:

&lt;%=testszenario.getSzenariosForSummary() %&gt; 将使用String#valueOf(Object) 方法将对象转换为String,并将其直接写入HTTP 响应。这不是你想要的。更重要的是,您根本不应该将老式 scriptlets 与现代 taglibs/EL 混合使用。

您需要确保testszenario 可用于EL $。因此,只需在某些 servlet 中预先将其设置为页面、请求、会话或应用程序范围的属性

request.setAttribute("testszenario", testszenario);

然后你就可以正常访问它了:

<c:forEach items="$testszenario.szenariosForSummary" var="szenario"> 

另见:

How to avoid Java code in JSP files? Our Servlets wiki page - Hello World #2 可能对你有用 Our EL wiki page

更新:关于 EL 不被解释的问题,显然你的 JSTL 和 container/web.xml 版本不匹配。确保版本正确对齐。例如。 Servlet 3.0 容器,version="3.0"web.xml,JSTL 1.2。另请参阅我们的 JSTL wiki 页面。

另见:

Our JSTL wiki page - 阅读“帮助!表达式语言(EL,那些 $ 的东西)在我的 JSTL 标记中不起作用!”部分!

【讨论】:

您是对的,web.xml 中缺少整个声明。我没有通读 JSTL Wiki。非常感谢您,先生! @BalusC,关于&lt;%=testszenario.getSzenariosForSummary() %&gt; 将对象转换为字符串并将其打印到 HTTP 响应中的内容是否仅适用于 JSTL 标签的 outside 脚本?见***.com/questions/93408/… 和***.com/questions/27684162/…

以上是关于使用 c:foreach (JSP/JSTL) 遍历 ArrayList,变量不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Cannot resolve symbol ‘c:forEach‘;

JSTL--JSTL表达式:c:forEach,varstatus/begin end/循环控制标签--drp215

c:forEach c标签

Unknown tag (c:forEach) 未知的标签

Java Web EL JSTL的用法

<c:forEach;的部分相关知识点