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

Java Spring MVC在控制器之间传递相同的对象,java,spring,spring-mvc,Java,Spring,Spring Mvc,在SpringMVC中,如何在两个控制器方法之间传递对象?我有一个更新表单和一个UpdateControl。在控制器中,我有两种方法,一种用于获取数据并将其显示在视图中。当用户单击带有修改的更新按钮时,将调用控制器的第二个方法。我观察到的是,我在控制器的第二个方法中得到的对象与我在第一个控制器方法调用中传递给视图的对象不同。它是一个新对象,所有表单字段都映射到它。如何确保将相同的对象传递给第一个控制器方法提供给视图的第二个控制器方法 @RequestMapping(value = "/showE

在SpringMVC中,如何在两个控制器方法之间传递对象?我有一个更新表单和一个UpdateControl。在控制器中,我有两种方法,一种用于获取数据并将其显示在视图中。当用户单击带有修改的更新按钮时,将调用控制器的第二个方法。我观察到的是,我在控制器的第二个方法中得到的对象与我在第一个控制器方法调用中传递给视图的对象不同。它是一个新对象,所有表单字段都映射到它。如何确保将相同的对象传递给第一个控制器方法提供给视图的第二个控制器方法

@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值,并在视图中正确显示。现在,用户更改一些详细信息并单击submit按钮。调用以下控制器方法

@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,因为用户可能会在一个会话中修改许多员工

如何确保视图传递相同的对象。我不想将对象添加为sessionAttribute,因为用户可能会在一个会话中修改许多员工

可以在对象中创建一个字段,该字段在初始渲染时用随机数填充,然后将该对象存储在会话中。在视图中,您可以使用隐藏输入映射该字段,现在当用户发送编辑操作的请求时,您可以获取该隐藏字段,并根据隐藏字段中的编号从会话中获取原始对象。这将解决不同选项卡中的多个编辑冲突。

您有3个选项

  • 使用
    @SessionAttributes
    在请求之间的会话中存储对象
  • 在每次请求之前,使用
    @modeldattribute
    带注释的方法检索对象
  • 编写自己的代码并将其存储在会话中(类似于1,但您需要做更多工作)
  • 选择1
  • @SessionAttributes
    注释添加到控制器类中
  • 完成对象后,将
    SessionStatus
    作为参数添加到更新方法和
    setComplete()
    方法中

  • 选择2
  • 添加从数据库检索对象并用
    @modeldattribute
  • 清理
    showmpDetails
    方法,因为它应该只返回视图名称

  • 选择3
  • 在方法中添加
    HttpSession
    作为参数
  • 在将其添加到模型旁边的
    showDetails
    方法中,将其添加到会话中
  • 在您的
    editEmpFormSubmission
    中,使用来自会话的字段,将所有非空字段从会话复制到对象,并将其存储在数据库中

  • 我不会选择选项,我强烈建议选项1,尤其是在
    SessionStatus
    对象上包含
    setComplete()
    ,以进行清理。您还可以组合1和2(使用
    @modeldattribute
    带注释的方法,并且仍然使用
    @SessionAttributes

    最好在同一个控制器中使用modify方法,至少对我来说是这样!这两种方法都在同一个控制器中,+1中有一个有趣的答案可以很好地解释。选项4是映射所有字段。但至少从我的观点来看,这是不可能的。我更喜欢选项2:没有会议膨胀。您必须采取措施避免并发更新。会话仅适用于同一控制器类内的请求。@M.Deinum我有类似的要求,似乎无法使其正常工作。看这个,这就是我想做的,但是没有答案。你能帮忙吗?
    @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();
    }    
    } 
    
    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";
        }
    }