這是設計。只有在POST操作導致導航不是回發到相同視圖的導航時(即操作方法沒有返回null
或void
,而是完全適用於String
,即使只是空白),它也將立即被刪除。
<h:link>
生成一個GET鏈接,它不會調用任何POST動作。由於在卸載視圖時不可靠地通過(XML)HTTP請求通知服務器端,因此無法通知JSF銷燬與該視圖關聯的視圖範圍的bean。在這種情況下,只有在會話過期時或會話中的最大邏輯視圖已超出(缺省值爲15)並且關聯的視圖是第一個時纔會銷燬視圖作用域bean。
如果你真的要destoy視圖由導覽樹狀作用範圍的bean,那麼最好的辦法是通過<h:commandLink>
使它成爲一個POST請求,而不是通過與?faces-redirect=true
參數返回導航結果發出重定向。但畢竟這不是搜索引擎優化,因爲機器人將不會索引POST鏈接。
我畢竟不在乎會議中仍在觀看的視角。如果你打算做一些清理或日誌記錄,我會尋找其他方法,具體取決於具體的功能要求。
在理論有可能通過HTML DOM onbeforeunload
事件,但是這是一個非標準的事件和瀏覽器的行爲是不確定的,當你發送活動期間Ajax請求會發生什麼。它有時會到達,但有時也不會。 更新:在練習,由於OmniFaces 2.2在synchronous XHR的幫助下已在OmniFaces @ViewScoped
中實現,並且它在主流瀏覽器中運行良好。從版本2.3開始,它甚至在物理上破壞了關聯的JSF服務器側視圖狀態。
一個小的更正是爲了。即使你做了重定向,如果你重定向到POST請求的源視圖,JSF也不會銷燬視圖範圍的bean。對於要銷燬的視圖範圍的bean,在處理POST請求後,您將需要完全呈現不同的視圖。 – RajV