web-dev-qa-db-fra.com

Appel de l'action du bean géré JSF au chargement de la page

Est-il possible d'exécuter une action de bean géré JSF lorsqu'une page est chargée?

Si cela est pertinent, j'utilise actuellement JSF 1.2.

53
DD.

JSF 1.0/1.1

Il suffit de mettre la logique souhaitée dans le constructeur du bean délimité par la requête associé à la page JSF. 

public Bean() {
    // Do your stuff here.
}

JSF 1.2/2.x

Utilisez la méthode annotée @PostConstruct sur une demande ou affichez un bean scoped. Il sera exécuté après la construction et l'initialisation /] de toutes les propriétés gérées et des dépendances injectées.

@PostConstruct
public void init() {
    // Do your stuff here.
}

Ceci est fortement recommandé par rapport au constructeur si vous utilisez un framework de gestion de beans qui utilise des mandataires, tels que CDI, car le constructeur peut ne pas être appelé aux moments auxquels vous vous attendez.

JSF 2.0/2.1

Vous pouvez également utiliser <f:event type="preRenderView"> si vous souhaitez également initialiser à l'aide de <f:viewParam> ou lorsque le bean est placé dans un champ plus étendu que celui de la vue (ce qui indique un problème de conception, mais cela mis à part). Sinon, un @PostConstruct convient parfaitement également.

<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+

Vous pouvez également utiliser <f:viewAction> si vous souhaitez également initialiser à l'aide de <f:viewParam> ou lorsque le bean est placé dans un champ plus étendu que celui de la vue (ce qui indique un problème de conception, mais cela mis à part). Sinon, un @PostConstruct convient parfaitement également.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
public void onload() { 
    // Do your stuff here.
}

Notez que cela peut renvoyer un cas de navigation String si nécessaire. Cela sera interprété comme une redirection (vous n'avez donc pas besoin d'un ?faces-redirect=true ici).

public String onload() { 
    // Do your stuff here.
    // ...
    return "some.xhtml";
}

Voir également:

78
BalusC

Une autre méthode simple consiste à activer la méthode avant le rendu de la vue. C'est mieux que postConstruct car pour sessionScope, postConstruct ne se déclenche qu'une fois par session. Cela se déclenche chaque fois que la page est chargée. Ceci est bien sûr uniquement pour JSF 2.0 et non pour JSF 1.2.

Voici comment le faire -

<html xmlns:f="http://Java.Sun.com/jsf/core">
      <f:metadata>
          <f:event type="preRenderView" listener="#{myController.onPageLoad}"/>
      </f:metadata>
</html>

Et dans le myController.Java

 public void onPageLoad(){
    // Do something
 }

EDITER - Bien que ce ne soit pas une solution à la question de cette page, j’ajoute ceci uniquement aux personnes utilisant des versions supérieures de JSF.

JSF 2.2 a une nouvelle fonctionnalité qui effectue cette tâche en utilisant viewAction

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

@PostConstruct est lancé UNE FOIS en premier lorsque Bean Created . La solution consiste à créer une propriété Inutilisée et à effectuer la méthode Action dans Getter de cette propriété Et d'ajouter cette propriété à votre fichier .xhtml comme suit:

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

et dans votre code de haricot:

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

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

appeler une action de bean depuis a sera une bonne idée, conservez l'attribut autoRun = "true" exemple ci-dessous

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
0
sijo jose