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

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

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

4 ответа

Решение

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";
}

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

Другой простой способ - использовать метод 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>

@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;
}

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

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
Другие вопросы по тегам