这是我的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。
答案 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”时,人们将无法确切知道它包含哪些项目。此外,在循环中命名列表“列表”的每个迭代项也没有意义。