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

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

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

4 ответов


JSF 1.0 / 1.1

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

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

JSF 1.2 / 2.x

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

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

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

JSF 2.0 / 2.1

можно использовать <f:event type="preRenderView"> в случае, если вы собираетесь инициализировать на основе <f:viewParam> тоже, или когда компонент помещается в более широкую область, чем область представления (что, в свою очередь, указывает на проблему дизайна, но это в сторону). В противном случае 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> тоже, или когда компонент помещается в более широкую область, чем область представления (что, в свою очередь, указывает на проблему дизайна, но это в сторону). В противном случае 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";
}

посмотреть также:


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

@PostConstruct запускается один раз в первый раз при создании компонента. решением является создание неиспользуемого свойства и выполнение действия в методе 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;
}

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

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