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