2016-06-30 57 views
0

我用Spring MVC和JSP做了一个小控制器,它显示了Student对象的列表。在这个控制器中,我也做了处理POST请求的方法。 POST方法传递学生ID参数和控制器应删除具有此ID的学生。Spring MVC jQuery重定向不起作用

这工作正常,但删除后我希望页面重新加载自己而无需用户页面重新加载点击,但这是行不通的。我在POST处理程序中尝试了"redirect:students",并在调试器中看到它传递给GET方法,但是当我在浏览器中检查获取响应时 - 它看起来像Student没有被删除,所以页面看起来与POST之前相同 - 这是问题。当我在浏览器中重新加载页面时,它显示更新的数据(没有删除学生)。 POST方法通过jQuery无页面形式发送,我不使用AJAX。

请帮助POST请求后刷新页面。

控制器:

@RequestMapping(value = "/students", method = RequestMethod.GET) 
public ModelAndView home() { 
    ModelAndView mv = new ModelAndView("students"); 
    mv.addObject("studentsList", studentDAO.getStudents()); 
    return mv; 
} 

@RequestMapping(value = "/deleteStudent", method = RequestMethod.POST) 
public String deleteStudent(Model model, @RequestParam("id") String idString) { 
    studentDAO.deleteStudent(Long.parseLong(idString)); 
    return "redirect:students"; 
} 

JQuery的发布

$.post("deleteStudent", 
     {id:$(this).children('.id').text()}) 

JSP

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page session="false" %> 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 

<!DOCTYPE html> 
<html> 
<head> 
    <title>Students</title> 
    <link href="<c:url value="/resources/css/students.css" />" rel="stylesheet"> 
</head> 
<body> 
<h1> 
    Students list 
</h1> 

    <div class="table"> 
     <div class="row studentsHeader"> 
      <div class="cell id">ID</div> 
      <div class="cell">First Name</div> 
      <div class="cell">Last Name</div> 
      <div class="cell">Birth Date</div> 
     </div> 

     <c:if test="${not empty studentsList}"> 
      <c:forEach var="student" items="${studentsList}"> 
       <div class="row studentData"> 
        <div class="cell id">${student.id}</div>     
        <div class="cell firstName">${student.firstName}</div> 
        <div class="cell lastName">${student.lastName}</div> 
        <div class="cell birthdate"><fmt:formatDate pattern="MM/dd/yyyy" value="${student.birthdate}" /></div> 
       </div> 
      </c:forEach> 
     </c:if> 
    </div> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
    <script src="<c:url value="/resources/js/students.js" />"></script> 
</body> 
</html> 

回答

0

你可以试试这个

var element=$(this).children('.id'); 
var jqxhr = $.post("deleteStudent", 
    {id:$(element).text()}).done(function() { 
      $(element).remove() 
    }); 

当删除操作成功时,此代码将删除学生元素。 在控制器代码中,您不必写入重定向,并且此方法应返回字符串数据或您可以在客户端的done方法中使用的某个对象执行某些逻辑。

+0

不,这不起作用。想想如果控制器无法删除,但UI学生将被删除?这就是我要重新加载所有页面数据的原因。 – Pavlo

+0

这就是为什么控制器应该返回一些字符串,如“成功”或“失败”,并借助它可以确定学生是否被删除。如果控制器的回应是成功的,那么您将删除学生,否则您不会在客户端删除学生 –