什么时候删除SpringMVC中的@SessionAttributes?(带有代码示例)
问题内容:
在什么确切情况下会清除@SessionAttributes?尝试在页面中使用两个模型时,我发现了一些令人困惑的行为。
当我使用此控制器执行GET后跟POST时…
@Controller
@RequestMapping("/myPage*")
@SessionAttributes(value = {"object1", "object2"})
public class MyController {
@RequestMapping(method = RequestMethod.GET)
public String get(Model model) {
model.addAttribute("object1", new Object1());
model.addAttribute("object2", new Object2());
return "myPage";
}
@RequestMapping(method = RequestMethod.POST)
public String post(@ModelAttribute(value = "object1") Object1 object1) {
//do something with object1
return "myPage";
}
}
…对象2已从模型中清除。它不再作为@SessionAttribute存在,并且无法在我的视图页面上访问。
但是,如果将第二种方法的签名修改为此…
public String post(@ModelAttribute(value = "object1") Object1 object1,
@ModelAttribute(value = "object2") Object2 object2) {
…然后object2不会从模型中清除,并且可以在我的视图页面上找到。
@SessionAttributes的Javadoc说:
一旦处理程序指示其会话会话完成,…属性将被删除。
但是我看不到在第一个示例中如何表明对话会话的完成,而在第二个示例中没有表明。
任何人都可以解释这种行为还是一个错误?
问题答案:
您通过致电表示对话已完成
SessionStatus.setComplete
public void post(...., SessionStatus status) {
status.setComplete();
}
就是说,我不明白为什么您应该失去一个模型属性而不是另一个属性。
您是否尝试过执行以下操作:
@ModelAttribute("object1")
public Object object1() { return new Object(); }
@ModelAttribute("object2")
public Object object2() { return new Object(); }
并与将属性手动放入模型进行比较。