#java #function #jsp #servlets #service
#java #функция #jsp #сервлеты #Обслуживание
Вопрос:
итак, у меня есть этот простой веб-сайт на jsp, который содержит список задач, я уже добавил функциональность, но теперь есть проблема с функцией удаления.
<ol class="list-group">
<c:forEach items="${todos}" var="todo">
<li class="list-group-item">${todo.toDoPosition} amp;nbsp; <a class="btn btn-light" href="${pageContext.request.contextPath}/delete-todo.do?uuidDelete=${todo.uuid}">Delete</a></li>
</c:forEach>
</ol>
У каждого toDoPosition есть уникальный UUID, и функция удаления должна удалить позицию, сравнивая uuid toDoPosition с этим параметром отправки, я уже проверил, совпадают ли эти два uuid, и это так, но он по-прежнему не хочет удалять позицию из списка.
Существует сервлет, который поддерживает функцию удаления
private TodoService todoService = new TodoService();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getParameter("uuidDelete") "Should be deleted now");
todoService.deleteTodo(new Todo(request.getParameter("uuidDelete")));
response.sendRedirect("/todo.do");
}
Он перенаправляет на сервлет, у которого есть метод returnList() в doGet, и у него также есть метод doPost, который отвечает за добавление нового todo:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().setAttribute("todos", todoService.returnList() );
request.getRequestDispatcher("/WEB-INF/views/todo.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getParameter("newTodo") != null) {
todoService.addTodo(new Todo(request.getParameter("newTodo")));
}
response.sendRedirect("/todo.do");
}
И служба удаления:
protected List<Todo> toDoList = new ArrayList<>();
public List<Todo> returnList(){
return toDoList;
}
public void addTodo(Todo toDo) {
toDoList.add(toDo);
System.out.println(toDo.uuid);
}
public void deleteTodo(Todo toDo) {
if(toDoList.contains(toDo.uuid)) {
toDoList.remove(toDo);
}
}
После нажатия кнопки Удалить он отправляет запрос с UUID, обновление веб-сайта, но в списке изменений нет. Похоже, что метод delete не удаляет позицию из списка, потому что после того, как я перенаправлю его на /todo.do и позиция в списке печати, которая должна быть удалена, все еще здесь, и я понятия не имею, почему
Комментарии:
1. в первый раз, когда вы перечисляете все задачи, где именно вы заполняете список<Todo> ToDoList;
2. При загрузке страницы список пуст и не отображается на веб-сайте, я использую <form> с методом POST для добавления другой позиции
3. /todo.do у сервлета есть метод doPost, который обрабатывает добавление новой позиции в список
4. не могли бы вы опубликовать весь свой код на стороне сервера, пожалуйста.
Ответ №1:
В deleteTodo вы передаете объект Todo. Затем вы используете переданный в Todo атрибут uuid в методе List contains, который неверен. Вам нужно передать объект Todo в метод contains, а не только его идентификатор, поскольку список содержит метод и сравнивает объекты, а не их атрибут uuid. Если вы отлаживаете этот код, вы должны увидеть, что метод удаления списка никогда не вызывается. Вам также может потребоваться переопределить equals в вашем объекте Todo, чтобы это сработало, заставив equals выполнять сравнение атрибута uuid.