Search code examples
javamysqlhttp-redirectservletsprepared-statement

I can not get updated data on the page after Update request to the database (data updated only after restart applications)


I trying to stop current reservations, by clicking on CANCEL button, which call stopReservation method. Data updated in database, but redirect return the same list as was, without chages. Only after restart I get updatetd list with data. Network show 302 to cancel and 200 to allreservs, but there no chages in list.

     @WebServlet("/cancel")
    public class CancelReservationServlet extends HttpServlet {
    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getRequestDispatcher("/WEB-INF/pages/cancel.jsp").forward(req, resp);
        }
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, NumberFormatException {
            String reservId = req.getParameter("id");
            if (reservId.isEmpty()) {
                resp.sendRedirect(req.getContextPath() + "/cancel");
            } else {
                ReservationService reservationService = new ReservationService();
                try {
                    reservationService.stopReservation(Integer.parseInt(reservId));
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                resp.sendRedirect(req.getContextPath() + "/allreservs");
            }
        }
    }
    
    @WebServlet("/allreservs")
    public class AllReservationsServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ReservationService reservationService = new ReservationService();
            Set<ReservationDto> reservations = null;
            try {
                reservations = reservationService.getListOfReserves();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            req.setAttribute("reservations", reservations);
            RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/pages/allreservs.jsp");
            requestDispatcher.forward(req, resp);
        }
    }

STOP METHOD FROM SERVICE CLASS

    public void stopReservation(Integer reservationId) throws IOException, ClassNotFoundException, SQLException {
            Connection connection = ConnectionFactory.getConnection();
            try {
                preparedStatement = connection.prepareStatement("UPDATE reservation set isActive = false where reservationId = ?");
            preparedStatement.setInt(1, reservationId);
            preparedStatement.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

JSP

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>All reservation</title>
        <link href="https://fonts.googleapis.com/css2?family=Baloo+Tamma+2:wght@500;600;700&display=swap" rel="stylesheet">
        <style>
            <%@include file="/styles/style.css"%>
        </style>
    </head>
    <body>
    <p>
        <a href='<c:url value="/"/>'><- main page</a>
    </p>
    <table>
        <thead>
        <tr>
            <th>ID</th>
            <th>FULL NAME</th>
            <th>MANIPULATION</th>
            <th>DESCRIPTION</th>
            <th>START TIME</th>
            <th>END TIME</th>
            <th>IS ACTIVE</th>
            <th>ROOM NUMBER</th>
            <th colspan="2">    CANCEL   </th>
        </tr>
        </thead>
        <c:forEach items="${reservations}" var="reservations">
            <tbody>
            <tr>
                <td>${reservations.id}</td>
                <td>${reservations.fullName}</td>
                <td>${reservations.manipulationName}</td>
                <td>${reservations.description}</td>
                <td>${reservations.startTime}</td>
                <td>${reservations.endTime}</td>
                <td>${reservations.isActive}</td>
                <td>${reservations.roomNumber}</td>
                <td><form action="${pageContext.request.contextPath}/cancel" method="post">
                <td>
                    <button onclick="location.href='/cancel'">cancel</button>
                <input type="hidden" name="id" value="${reservations.id}">
                </td>
                </form></td>
            </tr>
            </tbody>
        </c:forEach>
    </table>
    </body>
    </html>

additional:

    public Set<ReservationDto> getListOfReserves() throws IOException, ClassNotFoundException, SQLException {
            Connection connection = ConnectionFactory.getConnection();
            preparedStatement = connection.prepareStatement(GET_RESERVE_DATA);
            result = preparedStatement.executeQuery();
            while (result.next()) {
                reservs.add(new ReservationDto(
                        result.getInt("reservationId"),
                        result.getString("fullName"),
                        result.getString("manipulationName"),
                        result.getString("description"),
                        result.getTimestamp("startTime"),
                        result.getTimestamp("endTime"),
                        result.getBoolean("isActive"),
                        result.getInt("roomNumber")));
            }
            return reservs;
        }
     private static final String GET_RESERVE_DATA = "SELECT rsrv.reservationId, CONCAT(empl.name, ' ', empl.surname) as fullname, " +
                "rsrv.manipulationName, rsrv.description, rsrv.startTime, " +
                "rsrv.endTime, rsrv.isActive, r.roomNumber, empl.employeeId, r.roomId FROM reservation AS rsrv " +
                "JOIN room as r ON rsrv.roomid = r.roomId " +
                "JOIN employee as empl ON rsrv.emplId = empl.employeeId ";

Solution

  • Declare the reservs set inside the function. As it seems that their are previous values in this set, since you must have declared it outside the function. If you don't want that, you can clear the set before adding any new values to it.

    Method 1

    Inside getListOfReserves() declare Set<ReservationDto> reservs = new HashSet<>();

    Method 2

    Just before iterating the result. User clear to remove all the previous values from the set. reservs.clear()