更新请求到数据库后,我无法在页面上获取更新的数据(数据仅在重启应用程序后更新)
I can not get updated data on the page after Update request to the database (data updated only after restart applications)
我试图通过单击调用 stopReservation 方法的取消按钮来停止当前预订。数据库中的数据已更新,但重定向 return 与之前相同的列表,没有变化。只有在重新启动后,我才能获得包含数据的更新列表。网络显示 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);
}
}
停止服务中的方法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>
补充:
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()
我试图通过单击调用 stopReservation 方法的取消按钮来停止当前预订。数据库中的数据已更新,但重定向 return 与之前相同的列表,没有变化。只有在重新启动后,我才能获得包含数据的更新列表。网络显示 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);
}
}
停止服务中的方法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>
补充:
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()