什么时候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"; } }
… object2从模型中清除。 它不再作为@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(); }
并且看看如何比较手动将属性放入模型中。
您可以删除单个会话级别的ModelAttribute,如下所示:
给定ModelMap model
, HttpSession session
和你做:
if (categoryId != null) model.addAttribute("categoryId", categoryId); else { model.remove("categoryId"); session.removeAttribute("categoryId"); }