Вызывать действие управляемого компонента JSF при загрузке страницы
-
20-09-2019 - |
Вопрос
Есть ли способ выполнить действие управляемого компонента 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";
}
Смотрите также:
- Как обрабатывать параметры URL-адреса строки запроса GET в резервном компоненте при загрузке страницы?
- Для чего можно использовать <f:metadata>, <f:viewParam> и <f:viewAction>?
- Как вызвать управляемый компонент JSF для события HTML DOM, используя собственный JavaScript? - если вы действительно заинтересованы в выполнении метода действия компонента во время HTML DOM
load
событие, а не во время загрузки страницы.
Другие советы
Другой простой способ — использовать метод 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" />