Какую область использовать в шаблоне 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 активно участвует. В этом случае я бы рекомендовал объединить эти две области.

Вы можете найти пример использования области диалога для создания мастера на этом сайте:

JEE6 - CDI и область разговора

Другие вопросы по тегам