【问题标题】:return model object from spring controller从弹簧控制器返回模型对象
【发布时间】:2014-03-06 06:56:14
【问题描述】:

我有一个弹簧控制器,其中有 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 中对象的更新方法。 请帮忙。

【问题讨论】:

  • 因为你的重定向路径和listEmployee方法的请求映射是一样的
  • 是的,上面的评论是正确的。将其更改为 / 以外的其他内容

标签: spring spring-mvc


【解决方案1】:

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

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

有道理吗?

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

【讨论】:

  • 感谢您的回复,但我需要使用从数据库中获取的对象重定向到索引页面。请告诉我应该如何修改我的代码。
  • 你可以做两件事之一。要么重定向到 /view/id 以获得员工的特定视图,要么更常用。更新完成后,您将员工存储在会话范围内。在索引范围内,您在会话中搜索员工,并在您的视图中使用该员工。第二个选项是一种称为闪存范围的技术,您可以在其中存储以供以后请求检索。从 Spring MVC 3.1 开始,stackoverflow.com/questions/11763779/… 有一个特定的范围
【解决方案2】:

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

所以改为重定向到另一个视图。

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多