1 回答

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
我已將 bean 添加為模型屬性,并且可以在多個(gè)頁(yè)面上顯示 bean:
...
`model.addAttribute("todos", todos);`
...
并不真地。這僅在當(dāng)前視圖中添加該屬性。
為了實(shí)現(xiàn)這一點(diǎn),你應(yīng)該TodoList用@SessionScope以下注釋你的類:
@SessionScope
@Component
public class TodoList {
? ? // ...
}
然后注釋需要具有todoswith對(duì)話范圍的控制器@SessionAttributes,并將其注入 with @ModelAttribute。未經(jīng)測(cè)試,但類似的東西:
@Controller
@SessionAttributes("todos")
public class FooController {?
? @GetMapping("/todos.html")
? public String list(@ModelAttribute TodoList todos) {
? ? // set the todos value
? ? return "scopedproxytodos";
? }
}
您可以在任何其他帶有 注釋的控制器中使用它@SessionAttributes("todos")。
要?jiǎng)h除todos當(dāng)前對(duì)話會(huì)話,請(qǐng) status.setComplete()像您一樣使用。
在你的情況下,你可以刪除它:
@PostMapping("/end")
public ModelAndView endSession(SessionStatus sessionStatus, Model model) {
? ? sessionStatus.setComplete();
? ? return new ModelAndView("redirect:/");
}
并讓具有會(huì)話范圍的控制器根據(jù)需要重新初始化它(FooController實(shí)際上是這樣做的)。
另一種方法是重新初始化它而不是刪除它。
例如 :
@PostMapping("/end")
public ModelAndView endSession(@ModelAttribute TodoList todos) {
? ? todos.clear();
? ? return new ModelAndView("redirect:/");
}
該解決方案的優(yōu)點(diǎn):
更簡(jiǎn)潔/更少冗長(zhǎng)
不需要為每個(gè)會(huì)話創(chuàng)建 bean。就開銷而言,Bean 比存儲(chǔ)在會(huì)話中的值更昂貴。
該類SessionStatus
管理 spring 會(huì)話的屬性:
可以注入到處理程序方法中的簡(jiǎn)單接口,允許它們發(fā)出會(huì)話處理已完成的信號(hào)。然后,處理程序調(diào)用程序可以進(jìn)行適當(dāng)?shù)那謇?,例如在此處理程序的處理期間隱式創(chuàng)建的會(huì)話屬性
這意味著它清除了存儲(chǔ)在 Spring 處理程序會(huì)話中的屬性(與經(jīng)典的 http 會(huì)話不同),而不是存儲(chǔ)在 http 請(qǐng)求中的屬性,實(shí)際上您沒有在 spring 會(huì)話屬性中添加任何內(nèi)容。
所以那是沒用的。
添加回答
舉報(bào)