发送请求后,Servlet无法正确响应

时间:2019-03-20 16:00:25

标签: java function jsp servlets service

所以我在jsp中有一个包含待办事项列表的简单网站,我已经添加了功能,但是现在删除功能存在问题。

  <ol class="list-group">
            <c:forEach items="${todos}" var="todo">
                <li class="list-group-item">${todo.toDoPosition} &nbsp; <a class="btn btn-light" href="${pageContext.request.contextPath}/delete-todo.do?uuidDelete=${todo.uuid}">Delete</a></li>
            </c:forEach>
        </ol>

每个toDoPosition都具有唯一的UUID,删除功能应通过与带有此send参数的toDoPosition uuid进行比较来删除位置,我已经检查了这两个uuid是否相同,但是仍然不希望从中删除位置名单。

有一个支持Delete功能的servlet

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

}

它重定向到servlet,该servlet在doGet中具有returnList()方法,并且还具有doPost方法,该方法响应添加新的待办事项:

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 个答案:

答案 0 :(得分:1)

在deleteTodo中,您传入一个Todo对象。然后,您在列表包含方法中使用传入的Todo uuid属性,这是不正确的。您需要将Todo对象传递给contains方法,而不只是传递给它的ID,因为列表中的contains方法会比较对象,而不是uuid属性。如果调试此代码,则应该看到永远不会调用List remove方法。您可能还需要重写Todo对象中的equals才能使此功能正常工作,使equals对uuid属性进行比较。