将ResultSet从servlet传递到JSP页面

3

我正在我的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始终为空。

我做错了什么?

4个回答

7
您不应该在JSP中使用ResultSet,它是一个稀缺资源,是数据库游标。您可能会在简单的页面上使其“工作”,但我敢打赌您没有清晰地负责关闭代码中的ResultSet、Statement或Connection。很快您就会用尽这些资源并惊讶于为什么代码会因异常而崩溃。
java.sql接口实现中的任何一个都不应该逃脱出一个定义良好的持久层。获取连接、获取ResultSet,将其映射到一个对象或数据结构中,并按照获取顺序的相反顺序关闭所有资源,然后将对象或数据结构返回给您的JSP,只使用JSTL而没有scriplets进行显示。这才是正确的做法。
如果您必须在JSP中使用SQL,请使用JSTL<sql>标签来完成。

+1。这正是我希望在那样的问题中找到的答案!(这样我就不需要自己写了,问一下servlet是否是ResultSet的好地方:) - dantuch

5

我不理解在你的if语句中如何可能存在为空的行。

无论如何,在DisplayProperties.jsp中应该是request.getAttribute("propertyList")吧?


谢谢Murali...非常感激。那个方法真的很有效! - Dave

3

使用

request.getSession().setAttribute("propertyList", Rows);

替代

request.setAttribute("propertyList", Rows);

在您的servlet代码中,它将完美地工作。

3

您已经有了答案,所以我只会提出一个增强建议:在JSP中不要使用脚本片段。在适当的情况下,请使用标签库和EL表达式。生成列表的示例代码如下:

<ul>
    <c:forEach items="${propertyList}" var="item">
        <li>${item}</li>
    </c:forEach>
</ul>

你可以对HTML表格和下拉选项执行相同的操作。希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接