ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-01 03:01:53  阅读:97  来源: 互联网

标签:java spring 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对象时,它与我在之前的控制器调用中传递的对象不同.未形成后备但具有值的字段已更改为null.如何确保视图传递相同的对象.我不想将对象添加为sessionAttribute,因为用户可能会修改会话中的许多员工.

解决方法:

你有3个选择

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

选项1

>将@SessionAttributes注释添加到控制器类
>在完成对象后,将SessionStatus作为参数添加到update方法和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

>添加从数据库中检索对象的方法,并使用@ModelAttribute对其进行注释
>清理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

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

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

标签:java,spring,spring-mvc
来源: https://codeday.me/bug/20191001/1837691.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有