在 Spring MVC 中,如何在两个控制器方法之间传递对象?我有一个更新表单和一个 updateController。在控制器中,我有 2 种方法,一种用于获取数据并将其显示在视图中。当用户单击带有修改更改的更新按钮时,将调用控制器的第二个方法。我观察到的是,我在控制器的第二个方法中获得的对象与我在第一个控制器方法调用中传递给视图的对象不同。它是一个新对象,所有表单字段都映射到它。如何确保将同一个对象传递给由第一个控制器方法提供给视图的第二个控制器方法?
@RequestMapping(value = "/showEmpDetail.html", method = RequestMethod.GET)
public String showEmpDetails(
@RequestParam(value = "page", required = false) Integer page,
HttpServletRequest request, @RequestParam("empId") Long empId,
ModelMap model) {
// Get employee using empId from DB
model.addAttribute("emp",emp);
return "showEmpDetail";
}
上面的控制器方法从 Db 获取 emp 值并在视图中正确显示它。现在用户更改了一些细节并单击提交按钮。调用以下控制器方法。
@RequestMapping(value = "/editEmpFormSubmission.html", method = RequestMethod.POST)
public String editEmpFormSubmission(
@RequestParam(value = "page", required = false) Integer page,
@ModelAttribute("emp") Employee emp, BindingResult result,
ModelMap model, HttpServletRequest request) {
// update changes in DB
}
在上面的控制器方法中,当我检查 emp 对象时,它与我在之前的控制器调用中传递的对象不同。不支持表单但具有值的字段已更改为空。我怎样才能确保相同的对象被视图传递。我不想将对象添加为 sessionAttribute,因为用户可能会在会话中修改许多员工。
原文由 Pratik Shelar 发布,翻译遵循 CC BY-SA 4.0 许可协议
你有3个选择
@SessionAttributes
将对象存储在请求之间的会话中。@ModelAttribute
注释方法在每次请求之前检索对象选项1
@SessionAttributes
注释添加到您的控制器类SessionStatus
作为参数添加到您的更新方法和setComplete()
方法当您完成对象选项 2
@ModelAttribute
注释它showEmpDetails
方法,因为它应该只返回一个视图名称选项 3
HttpSession
作为参数showDetails
方法中,将其添加到模型旁边,将其添加到会话中editEmpFormSubmission
中使用会话中的一个并将所有非空字段复制到会话中的对象并将其存储在数据库中。我不会选择选项,我强烈建议选项 1,特别是在
SessionStatus
对象上包括setComplete()
以进行清理。您还可以组合 1 和 2(有一个@ModelAttribute
注释方法并且仍然使用@SessionAttributes
。)。