【发布时间】:2014-02-10 14:10:48
【问题描述】:
我想在确认页面上创建一个带有特殊操作的普通表单向导。
- 获取表单数据(表单预填充了会话属性)
- 按 OK,通过发布 JSON 保存表单数据并更新 会话属性
- 在摘要页面上显示更新会话属性的表单
- 按 OK,将表单数据保存到我的存储中。按“正确”后,我返回第 1 步(表单已预先填写更新的会话属性)。
- 显示确认页面(带有成功消息)并显示
“打印”按钮(这是另一个页面)并通过调用
SessionStatus#setComplete()删除会话属性
我的问题是当用户想要在确认页面上打印时(他转到打印页面),但我的会话属性已在第 5 步被破坏。我丢失了我的模型数据。
如果我删除 SessionStatus#setComplete(),当用户返回第 1 步时,会预先填充以前的数据而不是新数据。
那么,我该怎么做呢?
@SessionAttributes({"addressForm", "userContactDetails", "newAddressInformation"})
public class AddressProfileController {
//....
@ModelAttribute("addressForm")
public AddressForm getAddressForm() {
// Form is pre-filled
return webModelMapper.processMapping(new AddressForm(), getUserContactDetails().getAddressInformation());
}
@ModelAttribute("newAddressInformation")
public AddressInformation getNewAddressInformation() {
return new AddressInformation();
}
@ModelAttribute("userContactDetails")
public ContactDetails getUserContactDetails() {
return profilService.getUserContactDetails();
}
//....
在第 2 步中,我正在使用新的 addressForm 值更新 newAddressInformation
因此,如果我回到第 1 步,新值会预先填写在表单上。
第五步,删除确认页面的会话属性:
@RequestMapping(value = "/dcr/dcr-confirmation-adresse.html")
public String confirmUserAddressForm(@ModelAttribute("newAddressInformation") AddressInformation newAddressInformation, @ModelAttribute("userContactDetails") ContactDetails contactDetails, Model model, SessionStatus sessionStatus) {
// do something
sessionStatus.setComplete(); // invalidate session attributes
在第5步之后,会话属性不可用(与以前的数据):
@RequestMapping(value = "/print-address.html")
public String printUserAddressForm(@ModelAttribute("newAddressInformation") AddressInformation newAddressInformation, @ModelAttribute("userContactDetails") ContactDetails contactDetails, Model model) {
// newAddressInformation is empty bean, because session attributes has been previously detroyed
【问题讨论】:
标签: forms session spring-mvc controller