Невозможно установить атрибут ResultSet в сервлете

В моем проекте я получаю результат запроса из базы данных в свой сервлет и передаю результат в JSP после установки атрибута для ResultSet и последующего доступа к нему в JSP. Но каким-то образом я могу установить и получить доступ ко всем другим своим атрибутам в JSP и сервлеты, кроме 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>

А вот фрагмент сервлета:

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

Я не знаю, ЧТО происходит?? Я потратил на это много времени. И моя база данных не пуста. Так что res.next() действителен.

Одна вещь работает. Когда я разбиваю свой ResultSet в своем коде сервлетов, используя getInt и getString, а затем отправляю их в JSP по отдельности вместо отправки всего ResultSet, тогда getAttribute в JSP работает, и я могу распечатать свой результат. Но не делайте этого. знаю, почему весь ResultSet не идет. Я использую Netbeans 8.0.1.

Пожалуйста помоги.


person awhitesong    schedule 11.11.2014    source источник
comment
Вы можете сохранить его в сеансе session.setAttribute("cart", res); (вы можете получить HttpSession, выполнив request.getSession().setAttribute("cart"); Затем извлеките его в свой jsp, например session.getAttribute("cart");, затем удалите его из сеанса в своем jsp после извлечения, например session.removeAttribute("cart");   -  person brso05    schedule 12.11.2014
comment
Вы не должны использовать набор результатов. Вернуть дто.   -  person Hannes    schedule 12.11.2014
comment
Вы пытаетесь найти способ обмануть JVM, вызвав утечку памяти? Потому что ты преуспел.   -  person Boris the Spider    schedule 12.11.2014
comment
Является ли SQL-инъекция звонком в колокол?   -  person    schedule 12.11.2014
comment
@Boris Что ты имеешь в виду? Я помню, что получил одну ошибку памяти от netbeans.   -  person awhitesong    schedule 12.11.2014
comment
@RC. нет, кто-то прислал SELECT RING_BELL...WHERE ID=1; DROP TABLE BELLS --.   -  person Boris the Spider    schedule 12.11.2014
comment
Вы не закрываете набор результатов. Вы не закрываете заявление. Вы не закрываете соединение. Вы пропускаете ресурсы, как решето, оставленное снаружи ржаветь на несколько десятков лет.   -  person Boris the Spider    schedule 12.11.2014
comment
Еще одна вещь. У меня есть еще одна страница с тем же материалом. Но на этой странице и ее сервлете все работает нормально. Что происходит с этой?   -  person awhitesong    schedule 12.11.2014
comment
Поместите данные из набора результатов в массив, карту, список или что-то в этом роде. Затем закройте набор результатов и верните его.   -  person developerwjk    schedule 12.11.2014
comment
См. Эффективный способ обработки ResultSet в Java   -  person developerwjk    schedule 12.11.2014
comment
Он не работает. Тщательно закрыл все операторы, наборы результатов и соединения. Уменьшил память, но все равно все работает, кроме набора результатов этой страницы. Что происходит?   -  person awhitesong    schedule 12.11.2014
comment
У меня есть класс Java, содержащий от пяти до шести статических функций. Это влияет?   -  person awhitesong    schedule 12.11.2014
comment
@Ханнес Спасибо. ResultSet был проблемой, которая вызывала утечку памяти. Нужно кое-что узнать. Теперь сделано.   -  person awhitesong    schedule 13.11.2014


Ответы (1)


По моим наблюдениям, я думаю, что ваш запрос SELECT prod,price,count(*) FROM cart WHERE c_id="+cust+" GROUP BY i_id возвращает только одну строку.

Прежде всего, вы не должны использовать res.next(); непосредственно перед возвратом объекта RESULTSET. Это неправильный способ разработки функции. Что getCart(int item,int cust) должен сделать, так это просто вернуть RESULTSET.

Проблема, которую я предполагаю, которая, кажется, здесь, заключается в том, что ваш query просто возвращает одну строку. Поскольку вы вызываете res.next(); непосредственно перед возвратом объекта RESULTSET. resultset cursor уже указывает на первую строку результата.

Когда вы вызываете <%while(r.next()){%> , на этот раз он получает NULL , потому что следующая строка в наборе результатов не существует. Поэтому результат не может быть распечатан.


То, что я заметил сейчас, когда вы сделали опечатку в вашем коде jsp. <%=re.getString(1)%> должно быть <%=r.getString(1)%> потому что вы создаете <%ResultSet r=(ResultSet)request.getAttribute("cart");%> переменную набора результатов с именем r, но используете re . Но re в файле нет. Я думаю, что JSP даже не должен компилироваться, потому что переменная re никогда не определяется.

Thats the reason its не работает.

person Anurag Anand    schedule 12.11.2014
comment
Есть достаточно строк, чтобы дать ответ даже после группировки. И как я могу напечатать свое исключение в сервлетах? Я знаю, что я поставил два next() для первого раза, но учитывая, что у меня было более 2 строк, и это должно работать, я протестировал, и это не сработало. - person awhitesong; 12.11.2014
comment
Вопрос 1 Вопрос 2 Вы можете прочитать здесь об исключении печати в jsp. - person Anurag Anand; 13.11.2014
comment
Я отредактировал свой ответ, в вашем коде опечатка. Теперь это должно работать. - person Anurag Anand; 13.11.2014
comment
@awhitesong ты пробовал мой ответ - person Anurag Anand; 14.11.2014
comment
Я исправил опечатку перед запуском моей программы, иначе она не скомпилировалась бы. Во-вторых, теперь, когда она запущена, у меня есть более одной строки в моей таблице, и я уже имел представление об этих двух функциях ResultSet next(). Поэтому я исправил все эти, но он все еще не работал. Я думаю, что лучше всего не передавать ResultSet в качестве атрибута, потому что в это время он не может быть сериализован или закрыт. Поэтому это вызывает большую утечку памяти. Поэтому лучше всего использовать теги odt или JSTL. - person awhitesong; 15.11.2014
comment
@awhitesong всегда есть обходные пути. Вы можете поместить значения набора результатов в коллекцию и передать ее. Использование odt и JSTL тоже хорошая идея. - person Anurag Anand; 15.11.2014