Вызовите действие, выполняемое JSF bean при загрузке страницы

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

Если это актуально, я в настоящее время использую JSF 1.2.

Ответ 1

JSF 1.0/1.1

Просто поместите нужную логику в конструктор запроса scope 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> тоже, или когда bean помещается в более широкую область действия, чем область представления (что, в свою очередь, указывает на проблему с дизайном, но в стороне). В противном случае a @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> тоже, или когда bean помещается в более широкую область действия, чем область представления (что, в свою очередь, указывает на проблему с дизайном, но в стороне). В противном случае a @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";
}

См. также:

Ответ 2

@PostConstruct запускается ONCE сначала, когда Bean Created. это решение создаст неиспользуемое свойство и сделайте свое действие в методе Getter этого свойства и добавьте это свойство в ваш .xhtml файл следующим образом:

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

и в коде Bean:

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

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}

Ответ 3

Еще один простой способ - использовать метод 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
 }

EDIT. Хотя это не решение вопроса на этой странице, я добавляю это только для людей, использующих более высокие версии JSF.

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

<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>