簡體   English   中英

向數據庫發出更新請求后,我無法在頁面上獲取更新的數據(數據僅在重新啟動應用程序后更新)

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

我試圖通過單擊調用 stopReservation 方法的 CANCEL 按鈕來停止當前的預訂。 數據在數據庫中更新,但重定向返回與原來相同的列表,沒有變化。 只有在重新啟動后,我才會得到帶有數據的 updatetd 列表。 網絡顯示 302 取消,200 到 allreservs,但列表中沒有更改。

     @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);
        }
    }

來自服務類的停止方法

    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>

額外的:

    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 ";

聲明在函數內設置的reservs 因為它們似乎是這個集合中的先前值,因為您必須在函數之外聲明它。 如果您不想這樣做,您可以在向其添加任何新值之前清除該集合。

方法一

getListOfReserves()聲明Set<ReservationDto> reservs = new HashSet<>();

方法二

就在迭代結果之前。 用戶清除以從集合中刪除所有以前的值。 reservs.clear()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM