Я считаю, что данные View Scoped будут потеряны при переходе на следующую страницу в мастере)
Это верно.Область действия представления действует до тех пор, пока вы взаимодействуете с одним и тем же представлением, и будет уничтожена всякий раз, когда создается новое представление.Вы ищете "область разговора".Это не доступно ни в одной из управляемых функций JSF.Это, однако, доступно 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>
именно для этой цели.