Appel d'une action gérée par le JSF sur le chargement de la page

y a-t-il un moyen d'exécuter une action gérée par le JSF lorsqu'une page est chargée?

si c'est pertinent, j'utilise actuellement JSF 1.2.

48
demandé sur BalusC 2010-03-16 02:19:43

4 réponses

JSF 1.0 /1.1

vient de mettre la logique désirée dans le constructeur de la requête scoped bean associée à la page JSF.

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

JSF 1.2 / 2.x

Utiliser @PostConstruct méthode annotée sur une requête ou d'une vue étendue de haricot. Il sera exécuté après la construction et initialisation/mise en place de toutes les propriétés gérées et les dépendances injectées.

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

ceci est fortement recommandé sur le constructeur dans le cas où vous utilisez un cadre de gestion bean qui utilise des mandataires, comme le CDI, parce que le constructeur peut ne pas être appelé aux moments où vous l'attendez.

JSF 2.0 / 2.1

alternativement, utilisez <f:event type="preRenderView"> dans le cas où vous avez l'intention d'initialiser basé sur <f:viewParam> aussi, ou lorsque le haricot est mis dans une portée plus large que le champ de vision (qui à son tour indique un problème de conception, mais que hormis.) Sinon, 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+

alternativement, utilisez <f:viewAction> dans le cas où vous avez l'intention d'initialiser basé sur <f:viewParam> aussi, ou lorsque le haricot est mis dans une portée plus large que la portée de la vue (qui à son tour indique un problème de conception, mais que mis à part). Sinon, 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.
}

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

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

voir aussi:

72
répondu BalusC 2017-05-23 12:10:41

une autre façon facile est d'utiliser le feu la méthode avant que la vue soit rendue. C'est mieux que postConstruct car pour sessionScope, postConstruct ne tirera qu'une fois par session. Cela déclenche à chaque fois que la page est chargée. Bien entendu, cela ne concerne que le JSF 2.0 et non le JSF 1.2.

C'est la façon de 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
 }

EDIT - Bien que ce ne soit pas une solution pour la question sur cette page, je l'ajoute juste pour les personnes utilisant des versions supérieures de JSF.

JSF 2.2 a une nouvelle fonctionnalité qui exécute cette tâche en utilisant viewAction .

<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
11
répondu stolen_leaves 2015-07-24 12:48:01

@PostConstruct est lancé une fois en premier lorsque Bean a été créé. la solution est de créer une propriété inutilisée et faire votre action dans la méthode Getter de cette propriété et ajoutez cette propriété à la vôtre .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;
}
9
répondu Amin Bahiraei 2010-11-23 12:14:42

l'appel de haricot action d'une volonté d'être une bonne idée,garder attribut autoRun="true" exemple ci-dessous

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
0
répondu sijo jose 2018-05-09 10:34:58