Сервлет не отвечает должным образом после отправки запроса

#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.