JSF передает параметры просмотра по ссылке - когда объект должен быть создан - PullRequest
0 голосов
/ 30 июля 2011

Допустим, у меня есть страница регистрации и страница подтверждения регистрации.Я ввожу данные пользователя на страницу регистрации, перехожу на страницу подтверждения регистрации, где я могу вернуться на страницу регистрации, если есть какие-либо ошибки.

Я собираюсь использовать параметры просмотра, чтобы сделать данные регистрации доступнымисо страницы регистрации на страницу подтверждения, и наоборот.

Предположим, что существует 20 элементов данных для перемещения со страницы на страницу, это много параметров просмотра и множество setPropertyActionListeners, особенно как вседанные в итоге будут красиво упакованы в объекте User.

Итак, я хочу ввести данные на странице регистра в свойства записи пользователя и отправить ссылку на нее в подтверждение регистрации.стр.Что дало мне идею, так это просмотр конвертора BalusC WeakHashMap.Это конвертер JSF, который имеет статическую карту слабого хэша и генерирует uuid в качестве значения для записи карты и ссылку на объект в качестве ключа.Поэтому, указав это как конвертер для f: viewParam, вы отправляете uuid в строке запроса.

Это отлично работает.У меня проблема в том, что на странице регистрации я должен получить экземпляр класса User с новым.Затем я могу сделать:

<h:inputText value="#{bean.user.firstname}"/>

(и т. Д.) И передать пользовательский экземпляр в качестве параметра представления.Он отлично работает от регистрации до страницы подтверждения.Проблема заключается в том, что когда я выполняю обратное действие, отправляя пользовательскую ссылку обратно на страницу регистрации со страницы подтверждения, я абсолютно не могу предотвратить повторное создание экземпляра пользовательского объекта на странице регистра, после установщикабыл вызван как результат параметра представления.

Таким образом, конвертер выполняет свою работу и извлекает объект User из хэш-карты, вызывает setUser () в компоненте поддержки, а затем я вижу конструктор для Userстрельба по классу.

Я пытался вызвать new User () из конструктора bean-компонента в @PostConstruct, в preRenderView (также проверяя, является ли ajax-запрос), но ни одно из попыток не мешает работе параметра viewот уничтожения, если новое вовлечено.Я уверен, что есть простое решение, но я просто не вижу его прямо сейчас.

Буду признателен за любые предложения о том, как решить эту проблему.

Ответы [ 2 ]

3 голосов
/ 30 июля 2011

У меня проблема в том, что на странице регистрации мне нужно получить экземпляр класса User с новым.

Так какой код изначально создает этот новый пользовательский экземпляр? Если вы сделаете это в обработчике preRenderView, тогда вы можете просто проверить на нулевое значение, не так ли?

Если параметр представления и преобразователь не выполнили свою работу, user все равно будет нулевым, и вы создадите новый экземпляр. Конструктор бина и @PostConstruct не принесут вам никакой пользы, поскольку они оба запускаются до того, как параметр view сделает свое дело, но событие preRenderView гарантированно будет выполняться после него.

@ManagedBean
public class Bean {

    private User user;

    public void onPreRenderView() {
        if (user == null) {
            user = new User();
        }
    }
}

(Следует дополнительно учесть, что conversation scope уже делает именно то, что вы пытаетесь сделать здесь. Это часть CDI, а не JSF, но если вы работаете в веб-профиле Java EE 6 соответствует AS (JBoss AS 6 или 7, Glassfish V3, Resin 4, ...), у вас уже есть. В противном случае это просто дополнительная банка.)

1 голос
/ 11 августа 2011

После нескольких попыток, продолжавшихся более года, наконец-то найти надежное и долгосрочное решение этой проблемы!Я нашел один.Решение приходит в форме проекта расширений CDI Apache Myfaces, известного как Myfaces CODI .

. Это обеспечивает дополнительные области, такие как @ViewAccessScoped, который гарантирует, что если на компонент ссылается страницатогда это доступно для этой страницы.Также предоставляется поддержка групп разговоров.В сценарии, в котором я хочу передать ссылку на объект со страницы регистра на страницу подтверждения регистра, страница подтверждения может просто получить доступ к компоненту registerView непосредственно при следующем запросе.В качестве альтернативы вы можете @Inject один bean-компонент в другой и получить к нему доступ при следующем запросе, или использовать f: setPropertyActionListener со страницы источника.

Myfaces CODI отлично работает с Mojarra, а также с библиотеками с компонентами с адаптацией, такими как простые лица.Концепция аналогична той, что предоставляется в Jboss Seam, хотя я обнаружил, что поддержка дополнительного объема была лучше продумана, и я протестировал ее на glassfish 3.1.1 без проблем.

Если вы 'Используя в своем коде @ManagedBean и аннотации областей действия из пакета javax.faces.bean, codi перехватывает эти аннотации и использует собственные версии на основе CDI, поэтому вы можете конвертировать в CDI, просто добавив codi в качестве зависимости к своему проекту и не изменяя его.любой код.

Для меня это все равно, что перейти с черно-белого телевизора на цветной телевизор, я бы хотел найти этот материал раньше.

Документация по CODI

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