2013-04-29 48 views
1

我有一個示例用例:我有一個使用GET參數「id」的編輯頁面。 例如。編輯?id = 1打開一個新選項卡不要創建新的ViewAccessScoped bean

此編輯頁面由ViewAccessScoped(CODI)Bean支持。

在這個編輯頁面中,我有一個鏈接到相同的「編輯」頁面,但與另一個ID鏈接的數據表。 (例如,編輯?id = 2)

<h:link value="#{mecaPart.id}" outcome="edit" target="_blank"> 
    <f:param name="id" value="#{mecaPart.id}" /> 
</h:link> 

問題是,窗口打開正確,但它是使用相同的bean!所以我正在編輯相同的部分...

我已經在@PostConstruct中放置了一個日誌,它是多次調用的相同的bean引用。 (即使有新的ID!)

我的問題,我怎麼能告訴JSF創建一個新的ViewAccessScoped支持bean,當我點擊鏈接,而不是重新使用實際使用的?

+0

ViewAccessScoped使用相同的bean實例,只要URL是相同的,顯然它不考慮GET參數。你必須使用ViewScoped。您使用ViewAccessScoped的原因有哪些? – Damian 2013-04-29 17:59:22

+0

嗯,我認爲ViewScoped只能使用@ManagedBean而不是CDI。我重新閱讀CODI文檔,你說得對,我沒有理由使用ViewAccessScoped。 (CODI自動將CDI擴展添加到ViewScoped)。這正在工作,謝謝! – 2013-04-30 07:49:23

回答

2

最後,我發現@ViewScoped CODI bean沒有保留從頁面刷新的支持bean。所以,我必須使用ViewAccessScoped。

根據格哈德Petracek:http://os890.blogspot.fr/2011/08/scopes-view-scope-vs-view-access-scope.html

視圖-範圍JSF2 +的被綁定到具體的JSF頁面。這意味着:只要您導航到不同的頁面,狀態就會丟失。這總比沒有好,但對許多用例不起作用。需要它的主要用例是頁面上的ajax請求,而其他頁面上不需要它們使用的數據,但它很容易被破壞,使用瀏覽器刷新頁面,該頁面將數據存儲在視圖範圍的bean中,並且沒有輸入組件的表單。 (在之前的博客文章中,我描述瞭如何使用由codi提供的基礎結構創建基於會話的視圖範圍,以通過將視圖範圍的bean存儲爲樹狀態的一部分來解決這些缺點。)

與視圖範圍視圖訪問範圍 bean在頁面上可用,但它們也可用於下一頁。這意味着:它們被轉發到下一頁並被銷燬。如果它們在下一頁的第一個請求期間沒有被使用。就是例如對巫師很有用。如果你有一個不使用這個bean的嚮導頁面,或者你必須支持中斷一個嚮導的可能性,你可以使用codi提供的分組對話範圍(甚至是窗口範圍)。但是,由於codi的強大API,您還可以隨時手動銷燬示波器(如果需要)。

所以,解決與其他「ID」打開一個新標籤的問題,我必須設置「CODI客戶端WindowHandler」,根據維基CODI。 https://cwiki.apache.org/confluence/display/EXTCDI/JSF+WindowHandler

於是我說:

<alternatives> 
    <class>org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.ClientSideWindowHandler</class> 
</alternatives> 

要將文件beans.xml中,我用@ViewAccessScoped。現在一切正常。

0

您可以使用@ViewScoped也可以工作在CODI

相關問題