Какую область использовать в шаблоне JSF 2.0 for Wizard?
У меня есть многостраничная форма, или шаблон мастера, где страница 1 соответствует шагу 1 формы мастера, страница 2 соответствует шагу 2 и т. Д. На каждой странице, кроме последней, есть кнопка "Далее", которая позволяет перейти к следующая страница в форме. На последней странице есть кнопка отправки, которая передает все данные для всех страниц в мастере.
Какую область я должен использовать, чтобы поддерживать состояние данных, вводимых в каждой форме? например, следует ли мне использовать компонент View Scoped, содержащий все данные, введенные на всех страницах? Будет ли это работать, так как я буду переходить на разные страницы (которые, как я считаю, считаются разными "представлениями"; и если они являются разными представлениями, я считаю, что данные View Scoped будут потеряны при переходе на следующую страницу в Мастер)
3 ответа
Я считаю, что данные 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>
компонент именно для этой цели.
Из моего POV, хороший выбор здесь бобов сессий. При необходимости пользователь сможет прервать работу мастера, посетить другие страницы, документацию, руководства и т. Д. И вернуться к тому же шагу мастера. Конечно, это может быть сделано с помощью bean-объектов в области видимости (см. Ответ BalusC). Лично я предпочитаю bean-объекты в области видимости, когда ajax активно участвует. В этом случае я бы рекомендовал объединить эти две области.
Вы можете найти пример использования области диалога для создания мастера на этом сайте: