передать ResultSet из сервлета в JSP

Я делаю следующее в своем 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 всегда равно нулю.

Что я делаю не так?


person Dave    schedule 12.11.2009    source источник


Ответы (4)


Я не понимаю, как строки могут быть null, учитывая ваше if утверждение.

В любом случае, разве это не должно быть request.getAttribute("propertyList") в DisplayProperties.jsp?

person Murali VP    schedule 12.11.2009
comment
Спасибо, Мурали... очень признателен. Это сработало как удовольствие! - person Dave; 13.11.2009

Вы также не должны использовать ResultSet в JSP. Это курсор базы данных, дефицитный ресурс. Вы можете заставить это «работать» на простой странице, но я готов поспорить, что вы не несете четкой ответственности за закрытие ResultSet, Statement или Connection в своем коде. Вы скоро иссякнете и удивитесь, почему ваш код падает с исключениями.

Ни одна из реализаций интерфейса java.sql не должна выходить за пределы четко определенного уровня постоянства. Получите соединение, получите ResultSet, сопоставьте его с объектом или структурой данных и закройте все свои ресурсы в порядке, обратном получению, затем верните объект или структуру данных в свой JSP, написанный только с помощью JSTL и без скриптов, для отображения. Это правильно.

Если вы ДОЛЖНЫ использовать SQL в JSP, используйте для этого теги JSTL ‹sql›.

person duffymo    schedule 13.11.2009
comment
+1. Это ответ, который я надеялся найти в вопросе с таким названием! (поэтому мне не нужно писать свой собственный, чтобы спросить, подходит ли сервлет для ResultSet :)) - person dantuch; 28.09.2011

У вас есть ответ, поэтому я собираюсь сделать только предложение по улучшению: не используйте скриптлеты в JSP. Используйте taglibs и EL, где это уместно. Примером создания списка может быть:

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

Вы можете сделать то же самое для HTML tables и раскрывающегося списка options. Надеюсь это поможет.

person BalusC    schedule 12.11.2009

Использовать

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

вместо

request.setAttribute("propertyList", Rows);

в вашем коде сервлета. Это будет работать отлично.

person saksham    schedule 12.07.2011