实际上,我在谷歌上搜索了如何将数据从一个传递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
,数据库插入失败!
请需要您的帮助:(
设置为 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)
归档时间: |
|
查看次数: |
14640 次 |
最近记录: |