получение значений NULL из базы данных - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь отобразить некоторые данные из моей базы данных следующим способом, но он показывает только значения NULL.Я не уверен, что имею правильную реализацию метода, поэтому, если есть что-то, что я должен изменить при вызове метода select ().Заранее благодарю за любую помощь.

// Метод SELECT

public Res select(int id) {
            Res res = new Res();
            Connection connection = null;
            PreparedStatement preparedStm = null;
            ResultSet resultSet = null;

            try {
                connection = ConnectionConfiguration.getConnection();
                preparedStm = connection.prepareStatement("SELECT * FROM res WHERE id = ?");
                preparedStm.setInt(1, id);
                resultSet = preparedStm.executeQuery();

                while(resultSet.next()) {

                    res.setId(resultSet.getInt("id"));
                    res.setDay(resultSet.getString("res"));
                    res.setNoRooms(resultSet.getString("rooms"));
                    res.setNoNights(resultSet.getString("nights"));
                    res.setRoomType(resultSet.getString("room_type"));
                    res.setUser_email(resultSet.getString("email"));

                }

            } catch(Exception e) {
                e.printStackTrace();
            } finally {
                if (resultSet != null) {
                    try {
                        resultSet.close();
                    } catch (SQLException e) {

                        e.printStackTrace();
                    } 
                }
                if (preparedStm != null) {
                    try {
                        preparedStm.close();
                    } catch (SQLException e) {

                        e.printStackTrace();
                    }
                }
                if (connection != null) {
                    try {
                        connection.close();
                    } catch (SQLException e) {

                        e.printStackTrace();
                    }
                }
            }

            return res;

        }

// Отображение страницы JSP

<h1 align="center"> Reservation </h1><br>
<% Reservation r = new Reservation(); 
   Res rb = new Res();
   r.select(rb.getId());
%>
<table border="1" width="50%" align="center">
<tr><th colspan="3">Date</th><th>Rooms</th><th>Nights</th><th>Room type</th><th>
Comments</th><th>Status</th></tr>
<tr><td><%= rb.getDay() %><td>
<%=rb.getRooms() %></td><td><%=rb.getNights() %></td><td><%=rb.getRoomType() %></td>
</table>

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Я изменил его и поместил код в сервлет, как показано ниже, и теперь я отображаю данные, используя адрес электронной почты, поскольку это облегчает все.Я сделал это следующим образом.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession s = request.getSession();
    ResBean res = new ResBean();
    Connection connection = null;
    PreparedStatement preparedStm = null;
    ResultSet resultSet = null;
    String user_email = String.valueOf(s.getAttribute("uemail"));

    PrintWriter out = response.getWriter();
    out.println("<html><body><center><h1> Reservation Status</h1></center><br><h4 align=\"center\"> Rezervimi nga perdoruesi me email: " + user_email);
    out.println("<table border=\"1\" width=\"50%\" align=\"center\">");
    out.println("<tr><th colspan=\"3\">Data</th><th>Numri i dhomave</th><th>Numri i neteve</th>"
            + "<th>LLoji i dhomes</th><th>\r\n" + 
            "Kerkesa</th><th>Statusi</th></tr>");

    try {
        connection = ConnectionConfiguration.getConnection();
        preparedStm = connection.prepareStatement("SELECT * FROM reservations WHERE user_email = ?");
        preparedStm.setString(1, user_email);
        resultSet = preparedStm.executeQuery();

        while(resultSet.next()) {

            res.setDay(resultSet.getString("res_day"));
            res.setMonth(resultSet.getString("res_month"));
            res.setYear(resultSet.getString("res_year"));
            res.setNoRooms(resultSet.getString("no_rooms"));
            res.setNoNights(resultSet.getString("no_nights"));
            res.setRoomType(resultSet.getString("room_type"));
            res.setComments(resultSet.getString("add_comments"));
            res.setStatus(resultSet.getString("res_status"));
            res.setUser_email(resultSet.getString("user_email"));


            out.println("<tr><td>" + res.getDay() +"</td><td>"+ res.getMonth() + "</td><td>" + res.getYear() +"</td><td>"
                    + res.getNoRooms() + "</td><td>" + res.getNoNights() + "</td><td>" + res.getRoomType() + "</td><td>" +
                    res.getComments() + "</td><td>" + res.getStatus() + "</td></tr>");


        }

    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {

                e.printStackTrace();
            } 
        }
        if (preparedStm != null) {
            try {
                preparedStm.close();
            } catch (SQLException e) {

                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {

                e.printStackTrace();
            }
        }
    }
    out.println("</table></body></html>"); 

}

}

0 голосов
/ 27 октября 2018

Во-первых, стоит упомянуть, что мы больше не используем скриптлеты. Вот некоторая информация, объясняющая почему:

Использование скриптлетов (этих <% %> вещей) в JSP действительно крайне не рекомендуется с рождения taglibs (например, JSTL ) и EL ( Язык выражений , эти ${} вещи) назад 2001

Основные недостатки скриптлетов :

  1. Возможность повторного использования: вы не можете повторно использовать скриптлеты.
  2. Заменимость: Вы не можете сделать скриптлеты абстрактными.
  3. OO-способность: вы не можете использовать наследование / композицию.
  4. Отладка: если скриптлет выбрасывает исключение на полпути, все, что вы получаете, это пустая страница.
  5. Тестируемость: скриптлеты не тестируются на юнитах.
  6. Ремонтопригодность: за один раз требуется больше времени для поддержания логики смешанного / загроможденного / дублированного кода.

Вс Сам Oracle также рекомендует в JSP-кодировании , чтобы избежать использования скриптлетов , когда то же самое функциональность возможна с помощью (тега) классов. Вот несколько ссылок на Актуальность:

Из спецификации JSP 1.2 настоятельно рекомендуется использовать библиотеку стандартных тегов JSP (JSTL) в вашем веб-приложении, чтобы помочь уменьшает потребность в JSP-скриптлетах на ваших страницах. Страницы, использующие JSTL, в общем, легче читать и поддерживать.

...

Где возможно, избегать JSP скриптлетов всякий раз, когда библиотеки тегов предоставляют эквивалентную функциональность. Это облегчает чтение страниц и поддерживать, помогает отделить бизнес-логику от логики представления, и сделает ваши страницы легче превращаться в страницы в стиле JSP 2.0 (Спецификация JSP 2.0 поддерживает, но исключает использование скриптлеты).

...

В духе принятия шаблона проектирования модель-представление-контроллер (MVC) для уменьшения связи между уровнем представления данных и бизнес-логика, JSP скриптлеты не должны использоваться для написания бизнес логика. Скорее, JSP скриптлеты используются при необходимости для данные преобразования (также называемые «объектами значений»), возвращаемые из обработки запросы клиента в правильном формате, готовом для клиента. Даже тогда, это было бы лучше сделать с сервлетом фронт-контроллера или кастомом тег.

Цитата выше взята из этого замечательного ответа: Как избежать использования кода Java в файлах JSP?

Хорошо, теперь вы понимаете, почему вы не должны использовать скриптлеты. Так как еще мы должны делать то, что хотим на наших страницах JSP? Вот тут-то и вступают JSTL и EL. Все, что вам нужно сделать, чтобы использовать JSTL в вашем проекте (если вы не используете maven), это загрузить файл JSTL .jar: https://mvnrepository.com/artifact/javax.servlet/jstl/1.2 и включить его в свой файл. Папка lib (которая находится внутри WEB-INF). Если у вас нет папки, создайте ее и добавьте туда файл .jar. Здесь - отличный ресурс, показывающий все, что вы можете с ним сделать.

Затем, чтобы использовать его в своем JSP, просто включите базовую библиотеку вверху файла JSP:

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

Теперь вернемся к вашему вопросу. Проблема лежит здесь:

Reservation r = new Reservation(); 
   Res rb = new Res();
   r.select(rb.getId());

когда вы используете rb.getId () и вам это нравится, вы получаете нулевое значение, потому что по сути дела это делаете:

SELECT * FROM reservations WHERE id = null

потому что вы создали новый объект прямо перед этой строкой без установки идентификатора (или чего-либо еще)

Res rb = new Res();

Что вам нужно сделать, это передать объект из вашего сервлета, а затем вы можете использовать его. (без создания нового объекта res)

например, если вы сделаете это, оно должно работать:

   Reservation r = new Reservation(); 
   Res rb = new Res();
   rb.setId(1); //set the id 
   r.select(rb.getId());

Но опять же, вы не хотите делать это так. Потому что это включает скриптлеты. И они отстой. Поскольку в вашем проекте теперь есть jstl, вот пример того, как сделать это с JSTL:

ReservationStatus.jsp:

<h1 align="center"> Reservation </h1><br>
<table border="1" width="50%" align="center">
<tr>
<th colspan="3">Date</th>
<th>Rooms</th>
<th>Nights</th>
<th>Room type</th>
<th>Comments</th>
<th>Status</th>
</tr>
<tr>
<td>${Reservation.day}</td>
<td>${Reservation.month}</td>
<td>${Reservation.year}</td>
<td>${Reservation.noRooms}</td>
<td>${Reservation.noNights}</td>
<td>${Reservation.roomType}</td>
<td>${Reservation.comments}</td>
<td>${Reservation.status}</td>
</table>

Уэйи, верно? Вам на самом деле не нужен JSTL для этого, потому что вы используете здесь только EL.

Но опять же, если вы просто попытаетесь посетить страницу jsp напрямую, вы ничего не увидите. Вам нужен сервлет для передачи данных в JSP. Чтобы облегчить вам тестирование, я бы изменил doPost на doGet в вашем сервлете RESERVATION. Таким образом, если в вашем браузере ввести URL-адрес, сопоставленный для этого сервлета: http://localhost:9191/ReservationServletUrl, он запустит сервлет и перенаправит подробности в jsp. (потому что doPost не доступен через URL-адрес напрямую, только doGet)

Надеюсь, это поможет. Дайте мне знать, если у вас есть проблемы с пониманием чего-либо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...