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

4 回答 4

7

您也不应该在 JSP 中使用 ResultSet。那是一个数据库游标,一种稀缺资源。您可能会在一个简单的页面上“工作”,但我敢打赌,您对关闭代码中的 ResultSet、Statement 或 Connection 没有明确的责任。您很快就会用完并想知道为什么您的代码会因异常而崩溃。

所有 java.sql 接口实现都不应脱离定义良好的持久层。获取连接,获取ResultSet,映射成对象或数据结构,并按照获取的相反顺序关闭所有资源,然后将对象或数据结构返回给你的JSP,只用JSTL编写,没有scriplets,用于显示。这是正确的做法。

如果您必须在 JSP 中使用 SQL,请使用 JSTL <sql> 标记来执行此操作。

于 2009-11-13T00:22:38.127 回答
5

我不明白如何在行中null给出您的if声明。

无论如何,它不应该request.getAttribute("propertyList")DisplayProperties.jsp吗?

于 2009-11-12T23:10:46.923 回答
3

你有答案,所以我只做一个增强建议:不要JSP 中使用 scriptlet。在适当的地方使用标记库和 EL。生成列表的示例是:

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

您可以对 HTMLtable和 dropdown执行相同option的操作。希望这可以帮助。

于 2009-11-12T23:34:59.530 回答
3

采用

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

代替

request.setAttribute("propertyList", Rows);

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

于 2011-07-12T11:17:42.097 回答