SpringMVC中的@SessionAttributes什么时候被删除?(含代码示例)

2022-09-04 21:01:55

在什么情况下@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";
  }
}

...object2 从模型中清除。它不再作为@SessionAttribute存在,并且无法在我的视图页面上访问。

但是,如果将第二种方法的签名修改为此...

public String post(@ModelAttribute(value = "object1") Object1 object1,
                   @ModelAttribute(value = "object2") Object2 object2) {

...则 object2 不会从模型中清除,并且可以在我的视图页面上使用。

@SessionAttributes的javadoc说:

...一旦处理程序指示其会话会话完成,属性将被删除。

但我不明白我如何在第一个示例中指示会话的完成,但在第二个示例中没有。

任何人都可以解释这种行为还是一个错误?


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

看看这与手动将属性放入模型中相比如何。


答案 2

您可以删除单个会话级别的 ModelAttribute,如下所示:

给定 ,并且您确实:ModelMap modelHttpSession session

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

推荐