Quand utiliser f: viewAction / preRenderView par rapport à PostConstruct?

95

Quand doit-on utiliser l' événement f:viewActionou preRenderViewpour initialiser les données d'une page plutôt que l'utilisation de l' @PostConstructannotation? Est-ce que la justification d'utiliser l'un ou l'autre est basée sur le type de portée du backing bean? Par exemple, si le backing bean est @RequestScoped, alors le choix d'utiliser f:viewActionou preRenderViewover @PostConstructpour initialiser votre backing bean avant de rendre la vue ne serait pas pertinent car les deux le seraient aboutit au même effet?

f: viewAction ou 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()
    {

    }
}
Les meilleures pratiques
la source

Réponses:

117

Quand faut-il utiliser l'événement f: viewAction ou preRenderView pour initialiser les données d'un versets de page à l'aide de l'annotation @PostConstruct?

Utilisez le <f:viewAction>lorsque vous souhaitez 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 de modèle définies par <f:viewParam>lors de la phase de mise à jour des valeurs de modèle. A savoir, ils ne sont pas disponibles au moment des @PostConstructcourses. Dans JSF 2.0 / 2.1, cette balise n'existait pas et vous devez utiliser la preRenderViewsolution de contournement.

Si le bean de support est @RequestScoped, font-ils effectivement exactement la même chose? (et alors c'est au choix du développeur? (@PostConstruct semble "plus propre").

Non, ils ne font certainement pas la même chose efficacement. Le @PostConstructest onformément d'effectuer des actions directement après la construction de haricots 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. A savoir, les dépendances injectées ne sont pas disponibles à l' intérieur du constructeur de la fève. Cela ne s'exécutera donc qu'une seule fois par vue, session ou application lorsque le bean a une portée vue, session ou application. Le <f:viewAction>n'est par défaut appelé que sur la requête GET initiale, mais peut également onPostback="true"être configuré via l' attribut pour être appelé sur les demandes de publication. L' preRenderViewévénement est appelé à chaque requête HTTP (oui, cela inclut également les requêtes ajax!).

En résumé, l' utilisation @PostConstructsi vous souhaitez effectuer des actions sur les dépendances et les propriétés gérées qui sont définies par injection @EJB, @Inject, @ManagedProperty, etc. pendant la construction de haricots. À utiliser <f:viewAction>si vous souhaitez également effectuer des actions sur les propriétés définies par <f:viewParam>. Si vous utilisez toujours JSF 2.0 / 2.1, utilisez à la preRenderViewplace de <f:viewAction>. Vous pouvez si nécessaire ajouter une coche FacesContext#isPostback()pour effectuer l' preRenderViewaction sur demande initiale uniquement.

Voir également:

BalusC
la source
Merci. Désolé, j'ai modifié ma question d'origine pendant que vous rédigiez la réponse ...
BestPractices
J'ai mentionné la portée du bean car @PostConstruct ne serait appelé qu'une seule fois si le bean était SessionScoped (au moment de la création du bean), mais preRenderView serait appelé à chaque fois que la page est accédée. Ou est-ce que je me suis trompé?
BestPractices
Oui c'est correct. L'événement de vue de pré-rendu est appelé lors de la phase d'action d'appel. La post-construction est invoquée après la construction du bean. Un bean à portée de session n'est pas construit sur chaque requête HTTP.
BalusC
Je me demandais que ma méthode était appelée lors de requêtes ajax. l'appel isPostBack () a sauvé la journée !!
jacosta
1

Avez-vous besoin d'initialiser les propriétés du bean géré? -> Ensuite, utilisez @ PostConstruct Sinon, avez-vous besoin de travailler avec des paramètres passés d'une autre vue? -> Ensuite, utilisez " preRenderView "

Val Martinez
la source