JSF 2: Доступ к экземпляру управляемого компонента в объекте прослушивателя фазы? - PullRequest
5 голосов
/ 29 ноября 2010

Можно ли получить ссылку на подлежащее исполнению управляемое зерно в before-invokeApplication-phaselistener?

Перед фазой вызова приложения должно быть ясно, какой управляемый компонент будет выполнятьmethod.

Для примера предположим, что есть 1 главный управляющий компонент для обработки 1 страницы jsf.

Итак, в основном мне нужно:

  1. пользователь получает доступ к программе из меню
  2. Поскольку к ней обращаются из меню, вызывается метод init () главного управляющего компонента, который инициализирует такие вещи, как подготовка данных, проверка полномочий
  3. Последующие представления не нужныбольше вызывать метод init () до тех пор, пока он не будет вызван из меню

Чтобы реализовать пункт # 2, я подумываю перехватить одну из фаз

Я проверил APIДокументы о получении управляемого компонента на этапах реализации, но я не могу найти ни одного.

После ввода этого вопроса я понимаю, чтоэто можно сделать в @PostConstruct или в конструкторе управляемого компонента, но это будет сделано только при первом создании компонента, и мне нужно вызывать метод каждый раз, когда jsf вызывается из меню.

Есть предложения?

С уважением,
Альберт Кам

1 Ответ

3 голосов
/ 30 ноября 2010

Вы можете получить доступ к управляемым bean-компонентам через ELContext / ELResolver. Это хорошо объясняется в MyFaces wiki (также работает в vanilla JSF).

Например:

ELContext elContext = FacesContext.getCurrentInstance().getELContext();
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication()
    .getELResolver().getValue(elContext, null, "neededBean");

См. Вики-статью MyFaces для более подробного объяснения и реализации для других версий JSF.

Ваша идея использования @PostConstruct хороша. Подумайте о том, чтобы изменить область видимости на нечто вроде @ViewScoped, чтобы логика выполнялась при каждом переходе к этому представлению.

Также обратите внимание на PreRenderViewEvent (для JSF 2). Этот код встроен в вашу страницу лицевой страницы:

<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}"/>
<f:event type="preRenderView" listener="#{bean.doSomething}"/>
</f:metadata>

Прослушиватель событий f: выполняется перед каждым просмотром страницы.

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