在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方法中创建一个帐户
,并预先填充传递给用户的必填字段,然后将这些属性放入表单中的隐藏字段中(或者暂时将帐户设为会话属性)非常感谢,你救了我一天!你能把它作为一个回应贴出来吗?这样我就可以把你的答案标记为正确的答案了?