2012-03-27 18 views
6

我有一個多頁面的表單,又名嚮導模式,其中第1頁對應於嚮導表單的第1步,第2頁對應第2步等。除最後一頁以外的每個頁面都有一個Next按鈕,你到表格的下一頁。最後一頁有一個提交按鈕,用於提交嚮導中所有頁面的所有數據。JSF 2.0中用於嚮導模式的範圍是什麼?

我應該使用什麼範圍來維護每個表單上輸入的數據的狀態?例如我應該使用一個View Scoped bean來保存所有頁面上輸入的所有數據嗎?這是否會工作,因爲我將導航到不同的頁面(我認爲這些頁面被認爲是不同的「視圖」;如果他們是不同的視圖,我相信當您導航到下一頁時,視圖範圍數據將會丟失嚮導)

+0

我認爲ViewScope正常工作只使用Ajax。但我會推薦這個選項。 – Gaim 2012-03-27 20:18:42

回答

12

我相信當你在嚮導中導航到下一個頁面視圖作用域的數據將丟失)

這是正確的。只要您與相同視圖進行交互並在創建新視圖時進行垃圾回收,視圖範圍就會一直存在。你正在尋找「對話範圍」。這不受任何JSF託管bean作用域的影響。這是CDI @ConversationScoped提供的。所以,如果你的環境發生支持CDI,你可以把它的使用:

import javax.enterprise.context.Conversation; 
import javax.enterprise.context.ConversationScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

@Named 
@ConversationScoped 
public class Wizard implements Serializable { 

    @Inject 
    private Conversation conversation; 

    @PostConstruct 
    public void init() { 
     conversation.begin(); 
    } 

    public void submitFirstStep() { 
     // ... 
    } 

    // ... 

    public String submitLastStep() { 
     // ... 

     conversation.end(); 
     return "someOtherPage?faces-redirect=true"; 
    } 

    // ... 
} 

談話由自動插入cid請求參數進行管理。

如果你想堅持到JSF視圖範圍,那麼你最好的選擇是其中您呈現多個步驟有條件地建立一個頁面:

<h:panelGroup rendered="#{wizard.step == 1}"> 
    <ui:include src="/WEB-INF/wizard/step1.xhtml" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{wizard.step == 2}"> 
    <ui:include src="/WEB-INF/wizard/step2.xhtml" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{wizard.step == 3}"> 
    <ui:include src="/WEB-INF/wizard/step3.xhtml" /> 
</h:panelGroup> 

或者,你可以使用第三方組件庫,如PrimeFaces,它具有<p:wizard>組件用於此目的。

+0

我不幸沒有訪問CDI容器。我想我可能會繼續使用p:嚮導或條件渲染。使用JSF 2.0的「自定義範圍」設施是否會提供另一種選擇? – BestPractices 2012-03-27 21:06:52

+0

是的,應該可以使用自定義的JSF2範圍。這不會是一些微不足道的代碼,我可以在頭頂打字(因爲我從來沒有這樣試過:))。 – BalusC 2012-03-27 21:09:21

0

從我的pov,這裏很好的選擇是會話範圍的bean。在需要時,用戶將能夠中斷嚮導,訪問其他頁面,文檔,手冊等等,然後返回到相同的嚮導步驟。當然,它可以通過視圖範圍的bean來完成(請參閱BalusC答案)。就個人而言,我更喜歡ajax大量參與的視圖範圍的bean。在這種情況下,我建議組合這兩個範圍。

+0

我不會爲此推薦會話範圍。這會導致在多個瀏覽器窗口/選項卡中打開向導頁時出現不規則情況。 – BalusC 2012-03-27 20:40:29

+0

...以及後扣。 – BestPractices 2012-03-27 21:07:16

+0

@BestPractices,當然,這取決於。有時候ALT-F4也是一個問題,你無法勝利)) – Osw 2012-03-27 21:15:23