使用c:foreach(JSP / JSTL)迭代ArrayList,Variable不起作用

时间:2013-01-31 12:25:06

标签: jsp arraylist foreach jstl loops

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

我正在迭代一个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 个答案:

答案 0 :(得分:8)

<%=testszenario.getSzenariosForSummary() %>会使用String方法将对象转换为String#valueOf(Object),并将其直接写入HTTP响应。这不是你想要的。更重要的是,您应该将oldschool scriptlet 与现代taglibs / EL混合使用。

您需要确保testszenario可以使用${}。因此,只需在某些servlet中将其设置为页面,请求,会话或应用程序范围的属性,如此

request.setAttribute("testszenario", testszenario);

然后您可以通常的方式访问它:

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

另见:


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

另见:

  • Our JSTL wiki page - 阅读“帮助!表达式语言(EL,那些${}事物)在我的JSTL标签中不起作用!”