简体   繁体   English

将ResultSet从servlet传递给JSP

[英]pass ResultSet from servlet to JSP

I am doing the following in my SampleServlet.java 我在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);

and then in my jsp DisplayPropeties.jsp I have 然后在我的jsp DisplayPropeties.jsp中

<% 
     ArrayList rows = new ArrayList();

     if (request.getSession().getAttribute("propertyList") != null) {
         rows = (ArrayList ) request.getSession().getAttribute("propertyList");
     }
%>

but rows is always null. rows总是为空。

What am I doing wrong? 我究竟做错了什么?

You should also not be using a ResultSet in a JSP. 您也不应该在JSP中使用ResultSet。 That's a database cursor, a scarce resource. 这是一个数据库游标,一种稀缺资源。 You may get this to "work" on a simple page, but I'd bet that you don't have clear responsibility for closing the ResultSet, Statement, or Connection in your code. 你可以在一个简单的页面上“工作”,但我敢打赌你没有明确的责任在代码中关闭ResultSet,Statement或Connection。 You'll soon run out and wonder why your code is crashing with exceptions. 你很快就会用完,并想知道为什么你的代码会因异常而崩溃。

None of the java.sql interface implementations should escape out of a well-defined persistence layer. java.sql接口实现都不应该从明确定义的持久层中逃脱。 Acquire the connection, get the ResultSet, map it into an object or data structure, and close all your resources in reverse order of acquisition, then return the object or data structure to your JSP, written only with JSTL and no scriplets, for display. 获取连接,获取ResultSet,将其映射到对象或数据结构中,然后按照获取的相反顺序关闭所有资源,然后将对象或数据结构返回到JSP,仅使用JSTL写入,不使用scriplet进行显示。 That's the right thing to do. 这是正确的做法。

If you MUST use SQL in a JSP, use the JSTL <sql> tags to do it. 如果必须在JSP中使用SQL,请使用JSTL <sql>标记来执行此操作。

I don't understand how rows can be null given your if statement there. 鉴于你的if语句,我不明白行是如何为null

Anyway, shouldn't it be request.getAttribute("propertyList") in the DisplayProperties.jsp ? 无论如何,它不应该是DisplayProperties.jsp中的request.getAttribute("propertyList")吗?

You've the answer, so I am only going to do an enhancement suggestion: do not use scriptlets in JSP. 你已经回答,所以我只打算做一个增强的建议:在JSP中使用小脚本。 Use taglibs and EL where appropriate. 在适当的地方使用taglib和EL。 An example to generate a list would be: 生成列表的示例如下:

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

You can do the same for HTML table s and dropdown option s. 您可以对HTML table和下拉option执行相同的操作。 Hope this helps. 希望这可以帮助。

Use 采用

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

instead of 代替

request.setAttribute("propertyList", Rows);

in your servlet code. 在您的servlet代码中。 It will work perfectly. 它会很完美。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM