2013-08-24 4 views
1

Я использую JSF 2, PrimeFacces 3.4 и CDI. У меня 2 страницы: page1.xhtml и page2.xhtml. На каждой странице есть собственный управляемый компонент: Page1Bean и Page2Bean.Области и @PostConstruct

page1.xhtml имеет <p:remoteCommand>, чьи actionListener отображает page2.xhtml.

page2.xhtml содержит 3 компонента под <ui:include> и одну кнопку отправки. Каждый из этих трех компонентов связан с различными управляемыми бобами Component1Bean, Component2Bean и Component3Bean. Кнопка отправки показывает page1.xhtml.

Эти три ComponentXBean имеют метод @PostConstruct с некоторым кодом инициализации. Я попробовал следующие области применения этих бобы:

  • @SessionScoped: все работает нормально для одной операции отправки. Когда я повторяю это, эти бобы не повторно инициализируются @PostConstruct, потому что это сеансы.
  • @ViewScoped: @PostConstruct вызывается несколько раз.
  • @ConversationScoped: То же поведение, что и @ViewScoped.

Почему @PostConstruct называется несколько раз в поле зрения и разговора? Как я могу позволить им вызываться только один раз за операцию отправки?

+0

После того как я очистил формулировку и улучшил форматирование вопроса, я начал полагать, что вы используете атрибут 'binding' для связывания этих компонентов с bean-компонентами. Это правда? И вы используете версию Mojarra старше 2.1.18? Тогда это полностью объясняет причину вашей проблемы в области видимости. – BalusC

ответ

0

Выполнение кода инициализации под «preRender» каждый раз, возможно, неверно. Поскольку инициализация уничтожит нужные данные.

Отделите свой preRender от вашей инициализации. Вы можете либо подключить их отдельно, либо иметь флаг только для вызова initialize() один раз.

Избегайте, если возможно, бобин с сессией; обзор сеанса - это признак плохо разработанных веб-приложений и (в его простейших формах) очень плохой способ реализации межстранового потока. Передать URL-адрес или параметры POST между веб-страницами для реализации потока.

При необходимости параметры между страницами могут быть уникальными ручками для объектов, хранящихся в HttpSession. Но не просто выгружайте материал в сеанс, чтобы он не был действительно глобальным для приложения (например, «loggedInUser») или не упоминался однозначно выделенным дескриптором.

Смежные вопросы