我相信當你在嚮導中導航到下一個頁面視圖作用域的數據將丟失)
這是正確的。只要您與相同視圖進行交互並在創建新視圖時進行垃圾回收,視圖範圍就會一直存在。你正在尋找「對話範圍」。這不受任何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>
組件用於此目的。
我認爲ViewScope正常工作只使用Ajax。但我會推薦這個選項。 – Gaim 2012-03-27 20:18:42