Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SpringMVC中,如何在两个控制器之间传递对象?_Spring_Spring Mvc - Fatal编程技术网

在SpringMVC中,如何在两个控制器之间传递对象?

在SpringMVC中,如何在两个控制器之间传递对象?,spring,spring-mvc,Spring,Spring Mvc,实际上,我在谷歌上搜索了一下如何在springmvc中将数据从一个控制器传递到另一个控制器,我发现使用flash属性可以完成这项工作。 它包括用RequestMapping=GET声明一个控制器,用RequestMapping=POST声明另一个控制器。我已经在我的控制器中测试了这段代码,它成功了 @RequestMapping(value ="/ajouter", method = RequestMethod.POST) public String add(@ModelAttr

实际上,我在谷歌上搜索了一下如何在
springmvc
中将数据从一个
控制器传递到另一个
控制器,我发现使用
flash属性可以完成这项工作。
它包括用
RequestMapping=GET
声明一个控制器,用
RequestMapping=POST
声明另一个控制器。我已经在我的控制器中测试了这段代码,它成功了

 @RequestMapping(value ="/ajouter", method = RequestMethod.POST)  
     public String add(@ModelAttribute User user,final RedirectAttributes redirectAttributes) {  
         redirectAttributes.addFlashAttribute("user", user);
      return "redirect:/account";  
     }  
另一方面:

 @RequestMapping(value ="/account", method = RequestMethod.GET)  
     public String addAccount(@ModelAttribute("user") User user,@ModelAttribute Account account) { 
                System.out.println(user.getId());

      return "account";  
     }  
但我有另一个例子:我有两个
JSP
页面: 第一个将向数据库中添加一个用户。我想恢复刚刚插入的用户id,将其设置为帐户的外键(提交用于添加用户的页面后,将出现用于添加帐户的第二个页面)

我已经测试了这段代码:

此控制器将向数据库中插入一个用户,并恢复刚刚插入的用户

 @RequestMapping(value ="/addUser", method = RequestMethod.POST)  
     public String add(@ModelAttribute User user,final RedirectAttributes redirectAttributes) {  
        this.userService.insertData(user);
         redirectAttributes.addFlashAttribute("user", user);
      return "redirect:/account";  
     }      
     @RequestMapping(value= "/ajouterCompte", method = RequestMethod.POST)
public String addCompte(@ModelAttribute("account") Account compte,@ModelAttribute("user") User user){
    System.out.println(user.getId());  //this code shows 0

    System.out.println(compte.getPwd());

     String hashPassword = passwordEncoder.encode(compte.getPwd());
     System.out.println(hashPassword);
     compte.setPwd(hashPassword);
    compte.setId(user.getId()); 
       this.compteService.insertCompte(compte);

    return "redirect:/users";

}
此控制器将向数据库中插入一个帐户,但无法恢复刚刚插入的用户的用户id

 @RequestMapping(value ="/addUser", method = RequestMethod.POST)  
     public String add(@ModelAttribute User user,final RedirectAttributes redirectAttributes) {  
        this.userService.insertData(user);
         redirectAttributes.addFlashAttribute("user", user);
      return "redirect:/account";  
     }      
     @RequestMapping(value= "/ajouterCompte", method = RequestMethod.POST)
public String addCompte(@ModelAttribute("account") Account compte,@ModelAttribute("user") User user){
    System.out.println(user.getId());  //this code shows 0

    System.out.println(compte.getPwd());

     String hashPassword = passwordEncoder.encode(compte.getPwd());
     System.out.println(hashPassword);
     compte.setPwd(hashPassword);
    compte.setId(user.getId()); 
       this.compteService.insertCompte(compte);

    return "redirect:/users";

}
我想问题是这两个控制器是用一个方法声明的,该方法是
method=RequestMethod.POST
,它应该是一个
GET
,另一个
POST
。但在这种情况下,如何恢复用户的id,以便将其插入数据库? 当我用
GET
声明第二个控制器时,数据库插入失败


需要您的帮助,请:(

设置为flash属性的对象仅适用于设置后的第一个请求。(如中所述)

假设在您的帐户控制器中,您有一个用于
/account
的基于GET的方法,用该点的信息预填充
帐户

public String account(@ModelAttribute("user") User user, Model model) {
    Account account = new Account();
    account.setId(user.getId());
    model.addAttribute("account", account);
    return "account";
}
现在,您可以使用
@SessionAttribute(“account”)
对控制器进行注释,以便在请求之间的会话中存储
帐户
。如果是这样,则必须修改POST处理方法,以包括
SessionStatus
对象,并在其上存储调用
setComplete()

public String addCompte(@ModelAttribute("account") Account compete, SessionStatus sessionStatus){
    ...
    sessionStatus.setComplete();
    return "redirect:/users";
}
或者将预先填写的信息存储在隐藏的表单字段中,以便将其与以下请求一起传递,并且可以重建
帐户

<form:hidden path="id" />


问题在于flash属性已被清除。它仅适用于第一个请求,post是第二个请求,因此没有更多flash作用域。只需将用户id作为隐藏字段添加到表单中,并将其作为隐藏字段进行检索。或者在用于显示帐户页面的GET方法中(GET后执行的方法)将用户重新添加为flash属性(bit dirty imho)。我可能会在get方法中创建一个
帐户
,并预先填充传递给用户的必填字段,然后将这些属性放入表单中的隐藏字段中(或者暂时将帐户设为会话属性)非常感谢,你救了我一天!你能把它作为一个回应贴出来吗?这样我就可以把你的答案标记为正确的答案了?