1 回答
TA贡献1843条经验 获得超7个赞
我已将 bean 添加为模型属性,并且可以在多个页面上显示 bean:
...
`model.addAttribute("todos", todos);`
...
并不真地。这仅在当前视图中添加该属性。
为了实现这一点,你应该TodoList用@SessionScope以下注释你的类:
@SessionScope
@Component
public class TodoList {
// ...
}
然后注释需要具有todoswith对话范围的控制器@SessionAttributes,并将其注入 with @ModelAttribute。未经测试,但类似的东西:
@Controller
@SessionAttributes("todos")
public class FooController {
@GetMapping("/todos.html")
public String list(@ModelAttribute TodoList todos) {
// set the todos value
return "scopedproxytodos";
}
}
您可以在任何其他带有 注释的控制器中使用它@SessionAttributes("todos")。
要删除todos当前对话会话,请 status.setComplete()像您一样使用。
在你的情况下,你可以删除它:
@PostMapping("/end")
public ModelAndView endSession(SessionStatus sessionStatus, Model model) {
sessionStatus.setComplete();
return new ModelAndView("redirect:/");
}
并让具有会话范围的控制器根据需要重新初始化它(FooController实际上是这样做的)。
另一种方法是重新初始化它而不是删除它。
例如 :
@PostMapping("/end")
public ModelAndView endSession(@ModelAttribute TodoList todos) {
todos.clear();
return new ModelAndView("redirect:/");
}
该解决方案的优点:
更简洁/更少冗长
不需要为每个会话创建 bean。就开销而言,Bean 比存储在会话中的值更昂贵。
该类SessionStatus
管理 spring 会话的属性:
可以注入到处理程序方法中的简单接口,允许它们发出会话处理已完成的信号。然后,处理程序调用程序可以进行适当的清理,例如在此处理程序的处理期间隐式创建的会话属性
这意味着它清除了存储在 Spring 处理程序会话中的属性(与经典的 http 会话不同),而不是存储在 http 请求中的属性,实际上您没有在 spring 会话属性中添加任何内容。
所以那是没用的。
添加回答
举报