Какую область использовать в шаблоне JSF 2.0 for Wizard? - PullRequest
6 голосов
/ 28 марта 2012

У меня есть многостраничная форма, или шаблон мастера, где страница 1 соответствует шагу 1 формы мастера, страница 2 соответствует шагу 2 и т. Д. На каждой странице, кроме последней, есть кнопка «Далее», которая переводит вас на следующую страницу в форме. На последней странице есть кнопка отправки, которая передает все данные для всех страниц в мастере.

Какую область я должен использовать для поддержания состояния данных, вводимых в каждой форме? например использовать бин View Scoped, содержащий все данные, введенные на всех страницах? Будет ли это работать, поскольку я буду переходить на разные страницы (которые, как я считаю, считаются разными «представлениями»; и если они являются разными представлениями, я полагаю, что данные View Scoped будут потеряны при переходе на следующую страницу в волшебник)

Ответы [ 3 ]

12 голосов
/ 28 марта 2012

Я считаю, что данные 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> именно для этой цели.

0 голосов
/ 19 апреля 2012

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

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

0 голосов
/ 28 марта 2012

Из моего POV, хороший выбор здесь - сессионные компоненты. При необходимости пользователь сможет прервать работу мастера, посетить другие страницы, документацию, руководства и т. Д. И вернуться к тому же шагу мастера. Конечно, это может быть сделано с помощью bean-объектов в области видимости (см. Ответ BalusC). Лично я предпочитаю видоизмененные бобы, когда активно задействован ajax. В этом случае я бы рекомендовал объединить эти две области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...