我有一个要求,用户从表单中选择一些数据,我们需要在下一页上显示选择的数据。
目前我们正在使用会话属性执行此操作,但这样做的问题是,如果在另一个浏览器选项卡中打开第一页,它会覆盖数据,再次选择并提交数据。所以我只想在将数据从一个控制器传输到另一个控制器时摆脱这个会话属性。
注意:我使用的是基于 XML 的 Spring 配置,因此请展示使用 XML 而非注释的解决方案。
我有一个要求,用户从表单中选择一些数据,我们需要在下一页上显示选择的数据。
目前我们正在使用会话属性执行此操作,但这样做的问题是,如果在另一个浏览器选项卡中打开第一页,它会覆盖数据,再次选择并提交数据。所以我只想在将数据从一个控制器传输到另一个控制器时摆脱这个会话属性。
注意:我使用的是基于 XML 的 Spring 配置,因此请展示使用 XML 而非注释的解决方案。
在从第一页处理的方法中定义RedirectAttributes
方法参数:handler
form submission
@RequestMapping("/sendDataToNextPage", method = RequestMethod.POST)
public String submitForm(
@ModelAttribute("formBackingObj") @Valid FormBackingObj formBackingObj,
BindingResult result,
RedirectAttributes redirectAttributes) {
...
DataObject data = new DataObject();
redirectAttributes.addFlashAttribute("dataForNextPage", data);
...
return "redirect:/secondPageURL";
}
flash 属性在重定向之前临时保存(通常在会话中),并且在重定向之后可用于请求并立即删除。
上述重定向将导致客户端(浏览器)向/secondPageURL
. 因此,您需要有一个处理程序方法来处理此请求,并且您可以DataObject data
在处理程序方法中访问该集合submitForm
:
@RequestMapping(value = "/secondPageURL", method = RequestMethod.GET)
public String gotoCountrySavePage(
@ModelAttribute("dataForNextPage") DataObject data,
ModelMap model) {
...
//data is the DataObject that was set to redirectAttributes in submitForm method
return "pageToBeShown";
}
这DataObject data
是包含来自该submitForm
方法的数据的对象。
I worked with this requirement and I used RedirectAttributes, then you can add this redirect attributes to your model. This is an example:
@RequestMapping(value = "/mypath/{myProperty}", method = RequestMethod.POST)
public String submitMyForm(@PathVariable Long myProperty, RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("message", "My property is: " + myProperty);
return "redirect:/anotherPage";
}
@RequestMapping(method = RequestMethod.GET)
public String defaultPage(Model model, @RequestParam(required = false) String message) {
if(StringUtils.isNotBlank(message)) {
model.addAttribute("message", message);
}
return "myPage";
}
Hope it helps.
您可以使用 RedirectAttributes ;模型接口的一种特殊化,控制器可以使用它来选择重定向场景的属性。
public interface RedirectAttributes extends org.springframework.ui.Model
另外这个接口还提供了一种存储“Flash Attribute”的方式。Flash 属性在 FlashMap 中。
FlashMap:FlashMap 为一个请求提供了一种方法来存储打算在另一个请求中使用的属性。这在从一个 URL 重定向到另一个 URL 时最常需要。快速示例是
@RequestMapping(value = "/accounts", method = RequestMethod.POST)
public String handle(RedirectAttributes redirectAttrs) {
// Save account ...
redirectAttrs.addFlashAttribute("message", "Hello World");
return "redirect:/testUrl/{id}";
}