Существует ли способ выполнить действие управляемого компонента JSF, когда страница загружается?
Если это релевантно, я в настоящее время использую JSF 1.2.
Просто поместите желаемую логику в конструктор bean-компонента с ограниченным объемом запроса, связанного со страницей JSF.
public Bean() {
// Do your stuff here.
}
Используйте аннотированный метод @PostConstruct
в запросе или просмотре bean-компонента с ограниченной областью действия. Он будет выполнен после создания и инициализации / установки всех управляемых свойств и внедренных зависимостей.
@PostConstruct
public void init() {
// Do your stuff here.
}
Это настоятельно рекомендуется вместо конструктора в случае, если вы используете структуру управления компонентами, которая использует прокси, такие как CDI, потому что конструктор может не вызываться в то время, когда вы этого ожидаете.
В качестве альтернативы используйте
, если вы собираетесь инициализировать также на основе
, или когда компонент помещается в более широкую область видимости, чем область просмотра (что, в свою очередь, указывает на проблему дизайна, но не в стороне). В противном случае @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.
}
В качестве альтернативы используйте
, если вы собираетесь инициализировать также на основе
, или когда компонент помещен в более широком масштабе, чем область просмотра (что, в свою очередь, указывает на проблему дизайна, но не в стороне). В противном случае @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";
}
, а не во время загрузки страницы.