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

StackOverflow https://stackoverflow.com/questions/2451154

Вопрос

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

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

Это было полезно?

Решение

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.
}

Это настоятельно рекомендуется вместо конструктора, если вы используете структуру управления компонентами, которая использует прокси, например 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>

И в мойконтроллер.java

 public void onPageLoad(){
    // Do something
 }

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

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

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

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

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

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

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

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

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

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top