【问题标题】:Unable to set attribute of ResultSet in Servlet无法在 Servlet 中设置 ResultSet 的属性
【发布时间】:2015-01-08 14:48:39
【问题描述】:

在我的项目中,我将查询结果从数据库获取到我的 servlet 并在设置 ResultSet 的属性后将结果传递给 JSP,然后在 JSP 中访问它。但不知何故我能够设置和访问我在 JSP 和 servlet 中的所有其他属性,除了 ResultSet。

这是我的数据库访问函数getcart()

public static ResultSet getCart(int item,int cust){
ResultSet rs=null,res=null;
String i_name;
int price;
try{
    rs=stmnt.executeQuery("SELECT i_name,price FROM items WHERE i_id="+item);
    rs.next();
    i_name=rs.getString(1);
    price=rs.getInt(2);
    stmnt.executeUpdate("INSERT INTO cart(prod,price,c_id,i_id) VALUES('"+i_name+"',"+price+","+cust+","+item+")");
    res=stmnt.executeQuery("SELECT prod,price,count(*) FROM cart WHERE c_id="+cust+" GROUP BY i_id"); 
    res.next();
}catch(SQLException e){}
return res;

}

这里是 JSP

<%ResultSet r=(ResultSet)request.getAttribute("cart");%>
<div id="pageContent">
        <div style="margin:24px; text-align:left;"><br />
        <table width="100%" border="2" cellspacing="0" id ="table1">
            <tr>
            <td width="15%" bgcolor="#000000" align="center"><strong>Product</strong></td>
            <td width="10%" bgcolor="#000000" align="center"><strong>Price</strong></td>
            <td width="12%" bgcolor="#000000" align="center"><strong>Quantity</strong></td>
            <!--<td width="9%" bgcolor="#000000" align="center"><strong>Total</strong></td>-->
            </tr>
            <%while(r.next()){%>
            <tr class="spaceUnder">
                <td width="15%" bgcolor="#FFFFFF" align="center"><font color="#000"> <%=re.getString(1)%></font></td>
                    <td width="10%" bgcolor="#FFFFFF" align="center"><font color="#000"> <%=re.getInt(2)%></font></td>
            <td width="12%" bgcolor="#FFFFFF" align="center"><font color="#000"> <%=re.getInt(3)%> </font></td>
            </tr>
            <%}%>
        </table> 
            <div class="container">
        <left><h3 style="color:#FFFFF;padding-top:30px;"><font color="#000">Total: <%=total%> </font></h3></left>
            </div>
        </div>
</div>

这里是 servlet sn-p:

                res=accessDB.getCart(it,ci);
                request.setAttribute("cart",res);
                view=request.getRequestDispatcher("cart.jsp");
                view.forward(request, response);         

我不知道发生了什么?我现在在这上面花了很多时间。而且我的数据库不是空的。所以 res.next() 是有效的。

有一件事在起作用。当我使用getIntgetString 在我的servlet 代码中分解我的ResultSet,然后将它们单独发送到JSP 而不是发送整个ResultSet,然后getAttribute JSP 工作,我可以打印我的结果。但不知道为什么整个 ResultSet 不去。我使用的是 Netbeans 8.0.1。

请帮忙。

【问题讨论】:

  • 您可以将其存储在会话session.setAttribute("cart", res); 中(您可以通过request.getSession().setAttribute("cart"); 获取HttpSession 然后在您的jsp 中检索它,如session.getAttribute("cart"); 然后在检索后将其从您的jsp 中的会话中删除,如session.removeAttribute("cart");
  • 您不应该使用结果集。返回一个 dto。
  • 您是否试图找到一种方法来欺骗 JVM 泄漏内存?因为你成功了。
  • “SQL 注入”是否敲响了警钟?
  • @RC。不,有人发了SELECT RING_BELL...WHERE ID=1; DROP TABLE BELLS --

标签: java jsp servlets jdbc setattribute


【解决方案1】:

根据我的观察,我认为您的查询 SELECT prod,price,count(*) FROM cart WHERE c_id="+cust+" GROUP BY i_id 只返回一行。

首先你不应该在返回RESULTSET对象之前使用res.next();。 这是设计函数的错误方式。 getCart(int item,int cust) 应该做的只是返回 RESULTSET

我认为的问题似乎是,你的query 只返回一行。 当您在返回 RESULTSET 对象之前调用 res.next(); 时。 resultset cursor 已经指向结果的第一行。

当您调用 &lt;%while(r.next()){%&gt; 时,这次它会得到 NULL ,因为结果集中的下一行不存在。 这就是无法打印结果的原因。


我现在观察到,您在 jsp 代码中打错了字。 &lt;%=re.getString(1)%&gt; 它应该是 &lt;%=r.getString(1)%&gt; 因为您正在创建 &lt;%ResultSet r=(ResultSet)request.getAttribute("cart");%&gt; Resultset variable named r 但您正在使用 re 。 但是文件中不存在re。我认为 JSP 甚至不应该编译,因为从未定义过 re 变量。

Thats the reason its 不工作。

【讨论】:

  • 即使在 group by 之后也有足够的行来给出答案。我怎样才能在 servlet 中打印我的异常?我知道我第一次放了两个 next() 但考虑到我有超过2 行,它应该可以工作,我测试了它,它没有工作。
  • Question 1 Quetion 2 你可以在这里阅读jsp中的打印异常。
  • 我已经编辑了我的答案,您的代码中有错字。它现在应该可以工作了。
  • @awhitesong 你试过我的回答吗
  • 我在运行我的程序之前更正了错字“r”,否则它不会编译。其次,现在它正在运行,我的表中有不止一行,并且已经对这两个有一个想法ResultSet next() 函数。所以我纠正了所有这些,但它仍然没有运行。我觉得最好的办法就是不要把ResultSet作为属性传递,因为那个时候不能序列化或者关闭。所以会造成大量的内存泄漏。所以最好的办法是要么使用odt,要么使用JSTL标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多