Invoke JSF gerenciado Ação de Bean na página Carregar
-
20-09-2019 - |
Pergunta
Existe uma maneira de executar uma ação de feijão gerenciada pela JSF quando uma página é carregada?
Se isso for relevante, atualmente estou usando o JSF 1.2.
Solução
JSF 1.0 / 1.1
Basta colocar a lógica desejada no construtor do feijão escopo de solicitação associado à página JSF.
public Bean() {
// Do your stuff here.
}
JSF 1.2 / 2.x
Usar @PostConstruct
Método anotado em uma solicitação ou visualização de feijão escopo. Será executado após a construção e inicialização/configuração de todas as propriedades gerenciadas e dependências injetadas.
@PostConstruct
public void init() {
// Do your stuff here.
}
Isso é fortemente recomendado sobre o construtor, caso você esteja usando uma estrutura de gerenciamento de feijão que use proxies, como o CDI, porque o construtor não pode ser chamado nas vezes que você esperaria.
JSF 2.0 / 2.1
Alternativamente, use <f:event type="preRenderView">
Caso você pretenda inicializar com base em <f:viewParam>
também, ou quando o feijão é colocado em um escopo mais amplo do que o escopo da visão (que por sua vez indica um problema de design, mas isso de lado). Caso contrário, a @PostConstruct
está perfeitamente bem também.
<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+
Alternativamente, use <f:viewAction>
Caso você pretenda inicializar com base em <f:viewParam>
também, ou quando o feijão é colocado em um escopo mais amplo do que o escopo da visão (que por sua vez indica um problema de design, mas isso de lado). Caso contrário, a @PostConstruct
está perfeitamente bem também.
<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}" />
<f:viewAction action="#{bean.onload}" />
</f:metadata>
public void onload() {
// Do your stuff here.
}
Observe que isso pode retornar um String
Caso de navegação, se necessário. Será interpretado como um redirecionamento (para que você não precise de um ?faces-redirect=true
aqui).
public String onload() {
// Do your stuff here.
// ...
return "some.xhtml";
}
Veja também:
- Como faço para processar os parâmetros de URL da string de consulta no backing bean na página carregar?
- O que podeu003Cf:metadata> , Assim,u003Cf:viewParam> eu003Cf:viewAction> ser usado para?
- Como invocar um JSF gerenciado Bean em um evento HTML DOM usando JavaScript nativo? - Caso você esteja realmente interessado em executar um método de ação do feijão durante o HTML DOM
load
Evento, não durante o carregamento da página.
Outras dicas
Outra maneira fácil é usar o Fire o método antes que a vista seja renderizada. Isso é melhor do que o pós -construção porque, para o Sessionscope, o pós -construção disparará apenas uma vez a cada sessão. Isso dispara toda vez que a página é carregada. Isso é claro apenas para o JSF 2.0 e não para o JSF 1.2.
É assim que fazer isso -
<html xmlns:f="http://java.sun.com/jsf/core">
<f:metadata>
<f:event type="preRenderView" listener="#{myController.onPageLoad}"/>
</f:metadata>
</html>
E no myController.java
public void onPageLoad(){
// Do something
}
EDIT - Embora essa não seja uma solução para a pergunta nesta página, adiciono isso apenas para pessoas que usam versões mais altas do JSF.
O JSF 2.2 possui um novo recurso que executa esta tarefa usando viewAction
.
<f:metadata>
<f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
@PostConstruct é executado uma vez primeiro quando o Bean criou. A solução é criar uma propriedade não utilizada e executar sua ação no método getter desta propriedade e adicionar essa propriedade ao seu arquivo .xhtml como este:
<h:inputHidden value="#{loginBean.loginStatus}"/>
E no seu código de feijão:
public void setLoginStatus(String loginStatus) {
this.loginStatus = loginStatus;
}
public String getLoginStatus() {
// Do your stuff here.
return loginStatus;
}
Chamar a ação do feijão de uma boa ideia, mantenha o atributo autorun = "true" Exemplo abaixo
<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />