Вызвать JSF-управляемое действие bean-компонента при загрузке страницы - PullRequest
53 голосов
/ 16 марта 2010

Есть ли способ выполнить действие управляемого компонента JSF при загрузке страницы?

Если это актуально, я сейчас использую JSF 1.2.

Ответы [ 4 ]

80 голосов
/ 16 марта 2010

JSF 1,0 / 1,1

Просто поместите нужную логику в конструктор bean-объекта области запросов, связанного со страницей JSF.

public Bean() {
    // Do your stuff here.
}

JSF 1.2 / 2.x

Использовать аннотированный метод @PostConstruct для запроса или просмотра bean-объекта. Он будет выполнен после построения и инициализации / установки всех управляемых свойств и внедренных зависимостей.

@PostConstruct
public void init() {
    // Do your stuff here.
}

Настоятельно рекомендуется использовать конструктор в том случае, если вы используете инфраструктуру управления bean-компонентами, в которой используются прокси-серверы, такие как CDI, поскольку конструктор может быть вызван не тогда, когда вы этого ожидаете.

JSF 2.0 / 2.1

В качестве альтернативы, используйте <f:event type="preRenderView"> в случае, если вы собираетесь инициализировать также на основе <f:viewParam>, или когда бин помещается в более широкую область, чем область просмотра (что, в свою очередь, указывает на проблему проектирования, но в стороне). В противном случае, @PostConstruct тоже прекрасно.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:event type="preRenderView" listener="#{bean.onload}" />
</f:metadata>
public void onload() { 
    // Do your stuff here.
}

JSF 2.2 +

В качестве альтернативы, используйте <f:viewAction> в случае, если вы собираетесь инициализировать также на основе <f:viewParam>, или когда бин помещается в более широкую область, чем область просмотра (что, в свою очередь, указывает на проблему проектирования, но в стороне). В противном случае @PostConstruct тоже отлично.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
public void onload() { 
    // Do your stuff here.
}

Обратите внимание, что при необходимости это может вернуть String навигационный регистр. Это будет интерпретироваться как перенаправление (поэтому вам не нужно ?faces-redirect=true здесь).

public String onload() { 
    // Do your stuff here.
    // ...
    return "some.xhtml";
}

Смотри также:

13 голосов
/ 03 декабря 2014

Другой простой способ - использовать метод fire перед отображением представления.Это лучше, чем postConstruct, потому что для sessionScope postConstruct будет срабатывать только один раз за каждый сеанс.Это будет срабатывать каждый раз, когда страница загружается.Это, конечно, только для JSF 2.0, а не для JSF 1.2.

Вот как это сделать -

<html xmlns:f="http://java.sun.com/jsf/core">
      <f:metadata>
          <f:event type="preRenderView" listener="#{myController.onPageLoad}"/>
      </f:metadata>
</html>

И в myController.java

 public void onPageLoad(){
    // Do something
 }

РЕДАКТИРОВАТЬ - Хотя это не решение вопроса на этой странице, я добавляю его только для людей, использующих более высокие версии JSF.

В JSF 2.2 появилась новая функция, которая выполняет эту задачу с помощьюviewAction.

<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
10 голосов
/ 23 ноября 2010

@ PostConstruct запускается ОДИН РАЗ в первую очередь при создании Бина. решение заключается в создании свойства Unused и выполнении этого действия в методе Getter этого свойства и добавьте это свойство в ваш файл .xhtml следующим образом:

<h:inputHidden  value="#{loginBean.loginStatus}"/>

и в вашем коде бина:

public void setLoginStatus(String loginStatus) {
    this.loginStatus = loginStatus;
}

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}
0 голосов
/ 08 мая 2018

вызовом действия bean из a будет хорошей идеей, сохраните атрибут autoRun = "true" пример ниже

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
...