从弹簧控制器返回模型对象

时间:2014-03-06 06:56:14

标签: spring spring-mvc

我有一个弹簧控制器,其中有CURD方法。

     @Controller
  public class EditEmployeeController { 

@Autowired
private EmployeeManager employeeManager; 

@RequestMapping(value = "/", method = RequestMethod.GET) 
public String listEmployees(ModelMap map) 
{ 
    map.addAttribute("employee", new TestEmployee());
    map.addAttribute("employeeList", employeeManager.getAllEmployees()); 
    System.out.println("calling listEmployees");
    return "editEmployeeList"; 
} 

@RequestMapping(value = "/add", method = RequestMethod.POST) 
public String addEmployee(@ModelAttribute(value="employee") TestEmployee     employee,          BindingResult result) 
{ 
    employeeManager.addEmployee(employee); 
    return "redirect:/"; 
} 

@RequestMapping("/delete/{employeeId}") 
public String deleteEmplyee(@PathVariable("employeeId") Integer employeeId) 
{ 
    employeeManager.deleteEmployee(employeeId); 
    return "redirect:/"; 
} 

@RequestMapping("/update/{employeeId}")
public String updateEmployee(@PathVariable("employeeId") Integer employeeId, ModelMap map)
{
    TestEmployee emp  = employeeManager.updateEmployee(employeeId);
    map.addAttribute("employee", emp);
    return "redirect:/";

}

jsp页面就像这样

  <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> 
  <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
  <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
  <html> 
  <head> 
  <title>Spring Hibernate Integration</title> 
  </head> 
 <body> 

  <h2>Employee Management Screen</h2> 

 <form:form method="post" action="add" commandName="employee"> 

<table> 
<tr> 
    <td><form:label path="firstname"><spring:message       code="label.firstname"/></form:label></td> 
    <td><form:input path="firstname" /></td> 
</tr> 
<tr> 
    <td><form:label path="lastname"><spring:message code="label.lastname"/></form:label></td> 
    <td><form:input path="lastname" /></td> 
</tr> 
<tr> 
    <td><form:label path="email"><spring:message code="label.email"/></form:label></td> 
    <td><form:input path="email" /></td> 
</tr> 
<tr> 
    <td><form:label path="telephone"><spring:message   code="label.telephone"/></form:label></td> 
    <td><form:input path="telephone" /></td> 
</tr> 
<tr> 
    <td colspan="2"> 
        <input type="submit" value="<spring:message code="label.add"/>"/> 
    </td> 
</tr> 
  </table>  
  </form:form>
  <h3>Employees</h3> 
     <c:if  test="${!empty employeeList}"> 
     <table class="data"> 
     <tr> 
    <th>FirstName</th>
    <th>LastName</th> 
    <th>Email</th> 
    <th>Telephone</th> 
    <th>Action</th> 
      </tr> 
      <c:forEach items="${employeeList}" var="emp"> 
    <tr> 
        <td>${emp.firstname}</td> 
        <td>${emp.lastname}</td>
        <td>${emp.email}</td> 
        <td>${emp.telephone}</td> 
        <td><a href="delete/${emp.id}">Delete</a>|
            <a href="update/${emp.id}">Update</a>
        </td> 
    </tr> 
     </c:forEach> 
    </table> 
    </c:if> 

   </body> 
   </html>

这是我的web.xml文件

 <servlet> 
    <servlet-name>employee</servlet-name> 
    <servlet-class> 
        org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>employee</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping>

除了Update方法之外,所有功能都正常工作,因为当我尝试从DB获取对象时,它正在被提取但在渲染之前正在调用listEmployees方法,它再次为渲染分配空白对象。

我的问题是为什么当我返回重定向时再次调用这个listEmployee方法:/来自带有Map中对象的update方法。 请帮忙。

2 个答案:

答案 0 :(得分:0)

更新方法完成后,您将向客户端发送HTTP重定向响应。 因此,您向他发送一个重定向到/的请求,而不是给他一个网页。 这是你的索引页面。

现在客户端浏览器发送/的请求,然后您回复一个员工列表。

有道理吗?

这是指POST-redirect-GET模式,described here

答案 1 :(得分:0)

因为重定向路径映射到listEmployee方法而调用listEmployee方法的原因。

所以改为将重定向提供给另一个视图。