在JSTL中迭代ArrayList时获取空白页

时间:2013-03-31 07:46:18

标签: jsp servlets jstl javabeans

这是我的Servlet,其中将文本框值添加到ArrayList。我也在使用JavaBeans。

protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        String companyName = request.getParameter("txtCompany");
        double price = Double.parseDouble(request.getParameter("txtPrice"));
        HttpSession session = request.getSession();
        // Invoice r = new Invoice();

        ArrayList<Invoice> list = (ArrayList<Invoice>) session
                .getAttribute("EInvoice.list");

        if (list == null) {
            list = new ArrayList<Invoice>();
        }
        list.add(new Invoice(companyName, price));

        session.setAttribute("EInvoice.list", list);

        String url = "/Show.jsp";

        RequestDispatcher rd = getServletContext().getRequestDispatcher(url);
        rd.forward(request, response);

    }

这是Show.jsp

   <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Show</title>
    </head>
    <body>
        <c:forEach var="list" items="${EInvoice.list}">
            <h1>${list.companyName} ${list.price}</h1>
        </c:forEach>
    </body>
    </html>

我希望它能显示输入的文本框值,但我得到的只是一个空白页面。知道为什么吗?请原谅任何愚蠢的代码错误,因为我正在学习JSTL。

1 个答案:

答案 0 :(得分:4)

expression language (EL)中,句点.是一个特殊的运算符,它将属性与bean分开。它不应该在属性名称中使用,或者您必须使用括号表示法显式指定范围映射。您的具体问题是由于它正在搜索具有确切名称“EInvoice”的属性,然后它将尝试调用getList()方法。但是,EL范围中不存在这样的属性,因此无需迭代。

如上所述,您可以使用范围图上的括号表示法来引用它:

<c:forEach var="list" items="${sessionScope['EInvoice.list']}">

但是,我建议只重命名属性名称。 E.g:

session.setAttribute("invoices", invoices);

并且相当于:

<c:forEach var="invoice" items="${invoices}">
    <h1>${invoice.companyName} ${invoice.price}</h1>
</c:forEach>

请注意,我还立即使变量名更加自我记录。当查看变量名称“list”时,人们将无法确切知道它包含哪些项目。此外,在循环中命名列表“列表”的每个迭代项也没有意义。