Question

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

Si c'est pertinent, je suis actuellement en utilisant JSF 1.2.

Était-ce utile?

La solution

JSF 1.0 / 1.1

Il suffit de mettre la logique voulue dans le constructeur de la demande bean scope associé à la page JSF.

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

JSF 1.2 / 2.x

Utiliser la méthode annotée @PostConstruct sur une demande ou consultez scope bean. Il sera exécuté après la construction et initialisation / réglage de toutes les propriétés gérées et injectées dépendances.

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

Il est fortement recommandé sur le constructeur dans le cas où vous utilisez un cadre de gestion de haricot qui utilise des procurations, telles que CDI, parce que le constructeur ne peut pas être appelé au moment que vous attendez il.

JSF 2.0 / 2.1

Vous pouvez également utiliser <f:event type="preRenderView"> dans le cas où vous avez l'intention d'initialiser basée sur <f:viewParam> aussi, ou lorsque le grain est mis dans une portée plus large que le champ de vision (ce qui indique un problème de conception, mais à part). Dans le cas contraire, un @PostConstruct est parfaitement bien aussi.

<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> dans le cas où vous avez l'intention d'initialiser basée sur <f:viewParam> aussi, ou lorsque le grain est mis dans une portée plus large que le champ de vision (ce qui indique un problème de conception, mais à part). Dans le cas contraire, un @PostConstruct est parfaitement bien aussi.

<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 une affaire de navigation String si nécessaire. Il sera interprété comme une redirection (de sorte que vous n'avez pas besoin ?faces-redirect=true ici).

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

Voir aussi:

Autres conseils

Une autre façon simple est d'utiliser le feu la méthode avant que la vue est rendue. Cela vaut mieux que PostConstruct car pour sessionScope, PostConstruct ne se déclenche une fois par session. Cela ouvrira chaque fois que la page est chargée. Cela est bien sûr pour JSF 2.0 et non pour JSF 1.2.

Voici comment 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
 }

EDIT - Bien que ce n'est pas une solution pour la question sur cette page, j'ajouter ce juste pour les personnes utilisant des versions supérieures de JSF

.

JSF 2.2 a une nouvelle fonctionnalité qui exécute cette tâche à l'aide viewAction.

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

@PostConstruct est exécutée une fois dans le premier quand Bean créé. la solution est de créer une propriété non utilisée et faites votre action dans la méthode Getter de cette propriété et ajouter cette propriété à votre fichier xhtml comme ceci:

<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;
}

appelant une action de haricot d'un sera une bonne idée, garder attribut AutoRun = "true" exemple ci-dessous

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top