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.

Foi útil?

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:

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" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top