我在SampleServlet.java中执行以下操作
//Fill resultset from db
....
try {
ArrayList Rows = new ArrayList();
while (resultSet.next()){
ArrayList row = new ArrayList();
for (int i = 1; i <= 7 ; i++){
row.add(resultSet.getString(i));
}
Rows.add(row);
}
request.setAttribute("propertyList", Rows);
RequestDispatcher requestDispatcher = getServletContext().getRequestDispatcher("/DisplayProperties.jsp");
requestDispatcher.forward(request,response);
然后在我的jsp DisplayPropeties.jsp中我有
<%
ArrayList rows = new ArrayList();
if (request.getSession().getAttribute("propertyList") != null) {
rows = (ArrayList ) request.getSession().getAttribute("propertyList");
}
%>
但rows
始终为空。
我做错了什么?
答案 0 :(得分:7)
您也不应该在JSP中使用ResultSet。这是一个数据库游标,一种稀缺资源。你可以在一个简单的页面上“工作”,但我敢打赌你没有明确的责任在代码中关闭ResultSet,Statement或Connection。你很快就会用完,并想知道为什么你的代码会因异常而崩溃。
java.sql接口实现中没有一个应该从明确定义的持久层中逃脱。获取连接,获取ResultSet,将其映射到对象或数据结构中,然后按照获取的相反顺序关闭所有资源,然后将对象或数据结构返回到JSP,仅使用JSTL写入,不使用scriplet进行显示。这是正确的做法。
如果必须在JSP中使用SQL,请使用JSTL&lt; sql&gt;标签来做到这一点。
答案 1 :(得分:5)
我不明白在null
声明的情况下行如何if
。
无论如何,request.getAttribute("propertyList")
DisplayProperties.jsp
不应该是{{1}}
答案 2 :(得分:3)
你有答案,所以我只会做一个增强建议:不在JSP中使用scriptlet。在适当的地方使用taglib和EL。生成列表的示例如下:
<ul>
<c:forEach items="${propertyList}" var="item">
<li>${item}</li>
</c:forEach>
</ul>
您可以对HTML table
和下拉option
执行相同的操作。希望这会有所帮助。
答案 3 :(得分:3)
使用
request.getSession().setAttribute("propertyList", Rows);
而不是
request.setAttribute("propertyList", Rows);
在您的servlet代码中。它会完美地运作。