什么时候用SpringMVC中得到@SessionAttributes去掉? (带代码样品)(W

2019-08-03 13:30发布

在什么确切的情况不@SessionAttributes被清除? 我发现试图在一个页面中使用两种模式,当一些容易混淆的行为。

当我做一个GET,接着使用该控制器通过后...

@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) {

......那么对象2不会被从模型中清除,可我的视图页面上。

对于@SessionAttributes的Javadoc说:

......一旦处理程序指示其对话会议结束后的属性将被删除。

但我不知道我是如何在第一个例子,但不是在第二个例子中所示的对话会议上完成。

任何人都可以解释这种现象或者是一个错误吗?

Answer 1:

您可以通过调用表示谈话结束

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(); }

而看看如何比较用手把属性模型。



Answer 2:

您可以删除单个会话级别的ModelAttribute是这样的:

鉴于ModelMap modelHttpSession session ,你这样做:

if (categoryId != null) 
    model.addAttribute("categoryId", categoryId);
else {
    model.remove("categoryId");
    session.removeAttribute("categoryId");
}


文章来源: When do @SessionAttributes in SpringMVC get removed? (With code sample)