如何在spring mvc中的两个控制器之间传递对象?

pie*_*età 5 spring spring-mvc

实际上,我在谷歌上搜索了如何将数据从一个传递controller到另一个Spring MVC,我发现使用flash attributes可以完成这项工作。它包括用 声明一个控制器,用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";  
     }  
Run Code Online (Sandbox Code Playgroud)

和另一个:

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

      return "account";  
     }  
Run Code Online (Sandbox Code Playgroud)

但我有另一种情况:我有两个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";  
     }      
Run Code Online (Sandbox Code Playgroud)

并且该控制器会将帐户插入数据库,但无法恢复刚刚插入的用户的用户ID。

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

}
Run Code Online (Sandbox Code Playgroud)

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

请需要您的帮助:(

M. *_*num 5

设置为 flash 属性的对象仅可用于设置后的第一个请求。(参考指南中也有解释)。

假设在您的帐户控制器中,您有一个基于 GET 的方法来/account预先填充Account此时的信息。

public String account(@ModelAttribute("user") User user, Model model) {
    Account account = new Account();
    account.setId(user.getId());
    model.addAttribute("account", account);
    return "account";
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用注释您的控制器,以@SessionAttribute("account")将其Account存储在请求之间的会话中。如果是这样,那么您必须修改 POST 处理方法以包含一个SessionStatus对象,并在存储setComplete()对其的调用之后。

public String addCompte(@ModelAttribute("account") Account compete, SessionStatus sessionStatus){
    ...
    sessionStatus.setComplete();
    return "redirect:/users";
}
Run Code Online (Sandbox Code Playgroud)

或者将预填充的信息存储在隐藏的表单字段中,以便它与以下请求一起传递,并且可以Account重建。

<form:hidden path="id" />
Run Code Online (Sandbox Code Playgroud)