gpt4 book ai didi

java - Spring MVC 在 Controller 之间传递相同的对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:05:27 24 4
gpt4 key购买 nike

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

@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";
}

上述 Controller 方法从 Db 获取 emp 值并在 View 中正确显示。现在用户更改了一些细节并单击提交按钮。调用以下 Controller 方法。

@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
}

在上面的 Controller 方法中,当我检查 emp 对象时,它与我在之前的 Controller 调用中传递的对象不同。不支持表单但具有值的字段已更改为空。我怎样才能确保相同的对象被 View 传递。我不想将该对象添加为 sessionAttribute,因为用户可能会在 session 中修改许多员工。

最佳答案

你有3个选择

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

选项 1

  1. @SessionAttributes 注释添加到您的 Controller 类
  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 方法,因为它应该只返回一个 View 名称

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 方法中,在将其添加到模型旁边将其添加到 session 中
  3. 在您的 editEmpFormSubmission 中使用 session 中的一个并将所有非空字段复制到 session 中的对象并将其存储在数据库中。

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

关于java - Spring MVC 在 Controller 之间传递相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21426519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com