Spring MVC 在控制器之间传递相同的对象

新手上路,请多包涵

在 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 许可协议

阅读 553
1 个回答

你有3个选择

  1. 使用 @SessionAttributes 将对象存储在请求之间的会话中。
  2. 使用 @ModelAttribute 注释方法在每次请求之前检索对象
  3. 编写您自己的代码并将其存储在会话中(类似于 1,但您需要做更多的工作)。

选项1

  1. @SessionAttributes 注释添加到您的控制器类
  2. SessionStatus 作为参数添加到您的更新方法和 setComplete() 方法当您完成对象

@SessionAttributes("emp")
public class EmployeeController {
@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
    SessionStatus status) {
 // update changes in DB
 status.setComplete();
}
}

选项 2

  1. 添加从数据库中检索对象的方法,并用 @ModelAttribute 注释它
  2. 清理你的 showEmpDetails 方法,因为它应该只返回一个视图名称

public class EmployeeController {

    @ModelAttribute("emp")
    public Employee getEmployee(@RequestParam("empdId") Long id) {
        // Get employee using empId from DB
        return  emp;
    }

    @RequestMapping(value = "/showEmpDetail.html", method = RequestMethod.GET)
    public String showEmpDetails() {) {
        return "showEmpDetail";
    }
}

选项 3

  1. 在您的方法中添加 HttpSession 作为参数
  2. 在您的 showDetails 方法中,将其添加到模型旁边,将其添加到会话中
  3. 在您的 editEmpFormSubmission 中使用会话中的一个并将所有非空字段复制到会话中的对象并将其存储在数据库中。

我不会选择选项,我强烈建议选项 1,特别是在 SessionStatus 对象上包括 setComplete() 以进行清理。您还可以组合 1 和 2(有一个 @ModelAttribute 注释方法并且仍然使用 @SessionAttributes 。)。

原文由 M. Deinum 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题