在什么情况下@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说:
...属性将被删除一次 处理程序表示完成 它的会话会议。
但我没有看到我在第一个例子中表示完成了会话会话,但在第二个例子中没有表示。
任何人都可以解释这种行为或者它是一个错误吗?
答案 0 :(得分:14)
您可以通过致电
来表明对话已完成 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(); }
看看如何比较手动将属性放在模型中。
答案 1 :(得分:1)
您可以删除单个会话级别的ModelAttribute,如下所示:
给定ModelMap model
,HttpSession session
并执行:
if (categoryId != null)
model.addAttribute("categoryId", categoryId);
else {
model.remove("categoryId");
session.removeAttribute("categoryId");
}