Quand utiliser F: viewAction / preRenderView versus PostConstruct?

quand doit-on utiliser l'événement f:viewAction ou preRenderView pour initialiser les données d'une page par rapport à l'utilisation de l'annotation @PostConstruct ? Est-ce que la raison d'utiliser l'un ou l'autre est basée sur le type de portée de la fève de soutien , p. ex. si la fève de soutien est @RequestScoped , est-ce que le choix d'utiliser f:viewAction ou preRenderView au lieu de @PostConstruct pour initialiser votre Fève de soutien avant de rendre la vue non pertinente, car les deux auraient le même effet?

f: viewAction or preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

ou

@PostConstruct

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}
83
demandé sur Subodh Joshi 2012-03-23 22:20:29

2 réponses

quand doit-on utiliser l'événement f: viewAction ou preRenderView pour initialiser des données pour des versets de page en utilisant l'annotation @PostConstruct?

utilisez le <f:viewAction> lorsque vous voulez exécuter une méthode avant que le HTML ne soit rendu. Ceci est particulièrement utile si vous souhaitez effectuer des actions basées sur les valeurs du modèle définies par <f:viewParam> pendant la phase de mise à jour des valeurs du modèle. À savoir, ils ne sont pas disponibles à le moment où le @PostConstruct court. Dans JSF 2.0 / 2.1, cette balise n'existait pas et vous devez utiliser la solution de contournement preRenderView .

si la fève de soutien est @RequestScoped, est-ce qu'ils font effectivement la même chose? (et puis, c'est au développeur de choix? (@PostConstruct semble "plus propre").

non, ils ne font certainement pas effectivement la même chose. Le @PostConstruct est destiné à effectuer des actions directement après la construction de bean et le réglage de toutes les dépendances injectées et les propriétés gérées telles que: @EJB , @Inject , @ManagedProperty , etc. À savoir, les dépendances injectées ne sont pas disponibles à l'intérieur du constructeur du bean. Cela ne s'exécute donc qu'une fois par vue, session ou application lorsque la zone est définie par une vue, une session ou une application. Le <f:viewAction> n'est par défaut invoqué que sur la requête GET initiale, mais peut via onPostback="true" attribut être configuré pour être invoqué sur les requêtes postback aussi bien. L'événement preRenderView est invoqué sur toutes les requêtes HTTP (yes, this also includes ajax requests!).

résumé, utilisez @PostConstruct si vous voulez effectuer des actions sur les dépendances injectées et les propriétés gérées qui sont définies par @EJB , @Inject , @ManagedProperty , etc pendant la construction de bean. Utilisez <f:viewAction> si vous aussi voulez effectuer des actions sur les propriétés établi par le <f:viewParam> . Si vous êtes toujours sous JSF 2.0/2.1, utilisez preRenderView au lieu de <f:viewAction> . Vous pouvez si nécessaire ajouter un contrôle sur FacesContext#isPostback() pour effectuer l'action preRenderView sur demande initiale seulement.

voir aussi:

108
répondu BalusC 2017-05-23 12:18:05

avez-vous besoin d'initialiser les propriétés de managed bean? -- >Puis, utilisez @ PostConstruct Autrement, avez-vous besoin de travailler avec params passé d'une autre vue? -- >Puis, utilisez " preRenderView

0
répondu Val Martinez 2015-07-31 09:54:15