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

时间:2016-05-25 10:05:06

标签: spring spring-mvc

实际上,我已经用Google搜索了解如何在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"; } 声明另一个控制器。我已经在我的控制器中测试了这段代码,但它确实有效。

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

      return "account";  
     }  

和另一个:

JSP

但我有另一个案例:我有两个 @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"; } 页面: 第一个是将用户添加到数据库中。我想恢复刚刚插入的用户的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";

}

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

method = RequestMethod.POST

我想问题是2个控制器是使用方法GET声明的,它应该是一个POST和另一个GET。但在这种情况下,我如何恢复用户的id以便将其插入数据库? 当我用SELECT distinct mycall, sm, mm, SUM(IF(sm != '', 1,0)) AS 'a_lake', SUM(IF(mm != '', 1,0)) AS 'w_lake' FROM ss_log WHERE conf = '1' GROUP BY `mycall` ORDER BY `ss_log`.`mycall` DESC 声明第二个控制器时,插入数据库失败了!

需要你的帮助:(

1 个答案:

答案 0 :(得分:2)

设置为flash属性的对象仅在设置了第一个请求后才可用。 (正如the reference guide中所述)。

假设在您的帐户控制器中,您有一个基于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";
}

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

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

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

<form:hidden path="id" />