2010-11-22 60 views
10

我目前正在學習JSF 2.0,我很高興看到這個對話範圍功能的存在,這對於打開一個新標籤頁或一個新窗口非常有幫助相同的頁面並擁有單獨的資源,而不是相互壓倒。JSF CDI:會話範圍bean [s]最佳實踐

但我很好奇如何以良好的方式實現這一點,關於何時開始對話以及何時關閉它。

在我的情況下,我有每個JSF頁面的每個CDI bean。假設我有一個菜單,當它被點擊時,這將導致頁面A,並從A導致B,B可能導致C,C可能導致D,所有這4個頁面連接成一個鏈。

從B或C或D豆訪問A的bean屬性是可能的,訪問B的屬性也可以從C或D豆等等。

現在即時通訊很困惑:

  • 是否所有這些A B C d應該在談話範圍 與否,或 也許只是一個?因爲我認爲 有時來自ABCD鏈之外的另一個頁面 ,如頁面 F,它可能導航到頁面B, ,但我不知道如何向bean B提供 數據。
  • 是否所有這些ABCD應 合併成一個豆
  • 何時何地開始 交談,即時通訊思考 構造函數,但我不認爲這是一個 好主意,因爲我更喜歡開始 談話首先訪問 當頁面,而不是豆
  • 在哪裏以及何時停止 談話,因此有不會是 遊逛
未使用的資源

請分享你對此的看法。

+3

CDI不是標準JSF的一部分。CDI代表上下文和依賴注入(JSR-299),它覆蓋'javax.enterprise'包的註釋。會話範圍也不是標準JSF的一部分。它是JSF 1.2中的JBoss Seam發明,並且被JSF 2.0規範採用爲View Scope,可以通過'@ ViewScoped'註釋來觸發。現在,你究竟在說什麼? – BalusC 2010-11-22 10:59:26

+0

Hello BalusC,感謝您的澄清。我用CDI這個術語來說明我在使用什麼,但也許這些信息與我的問題無關,我的道歉:)據我所知,@ViewScoped是單頁重新顯示,屬性將是持續存在。但是我想從對話範圍中獲得的是,我可以在多個選項卡上打開相同的頁面,每個選項卡就像擁有自己的會話範圍一樣。因此,在選項卡上的myBean.name上提交值'albert'將不會覆蓋其他選項卡上的myBean.name。但我不知道從哪裏開始和結束對話。 – bertie 2010-11-22 11:33:33

+0

如果有4頁的話,這會讓我更加困惑,例如,頁面A是一個瀏覽頁面,用戶可以搜索,頁面B是詳細頁面,用戶可以修改細節,頁面C是用戶可以修改的頁面細節等等。如果我想在幾個標籤中打開頁面A而不會影響另一個頁面,我必須在A的bean上使用對話範圍。但是我想這對B C和D來說也是談話範圍?關於何時何地我應該開始/結束談話。我的意思是,用戶可以打開新的標籤,並關閉標籤。我如何檢測到這一點並關閉對話? – bertie 2010-11-22 11:36:36

回答

11

JSF 2提供請求,視圖,會話和應用程序範圍。 CDI引入了對話範圍,但更重要的是,它引入了一個新平臺可以添加到平臺的標準。

您所描述的範圍可能更適合於自定義範圍,如窗口範圍。實施此範圍內的兩個項目分別是:

  1. Apache MyFaces CODI
  2. ICEfaces的有JSF(非CDI)Window scope implementation

不過,我會鼓勵你重新思考你的bean結構。我自己非常喜歡View範圍,加上JSF 2視圖參數來將信息從一個頁面傳播到另一個頁面(以及從一個View範圍實例傳播到另一個頁面)。

MyFaces的「查看訪問」範圍看起來像另一種簡潔的方法,只要您瀏覽的頁面保持對該範圍的引用,bean就停留在範圍內。

+0

謝謝!我一直在考慮視圖範圍,它也可以用於多視圖或多視窗環境。通過將視圖參數從一個視圖範圍傳遞到另一個視圖範圍,您的意思是從h:button和嵌套的f:param,以及具有嵌套的f:viewParam的f:元數據實現的,我是否正確?如果我沒有弄錯,那麼h:按鈕會導致GET請求,這對我來說是一個問題,因爲有時候,例如,從頁面B(POST)中按下刪除會將導航返回到頁面A.是否有辦法在這種情況下發送視圖參數從B到A? – bertie 2010-11-24 04:40:42

+0

您可以將字符串「?includeViewParams = true」附加到導航規則中,並且「着陸頁」上定義的視圖參數將自動包含給您。 – 2010-11-24 05:47:06

+0

好的,謝謝。請閱讀一次,但從未想過使用它。我認爲我習慣了會議範圍,一切都在這裏。必須試試:) – bertie 2010-11-24 06:46:03