web-dev-qa-db-fra.com

Quand utiliser f: viewAction / preRenderView versus PostConstruct?

Quand faut-il utiliser le f:viewAction ou preRenderView événement pour initialiser les données d’une page par rapport à l’utilisation de @PostConstruct annotation? La justification d'utiliser l'un ou l'autre est-elle basée sur le type de portée du haricot de renfort, par ex. Si le haricot est @RequestScoped, alors le choix d'utiliser f:viewAction ou preRenderView sur @PostConstruct pour initialiser votre bean de support avant de rendre la vue non pertinente car les deux auraient le 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()
    {

    }
}
88
BestPractices

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

Utilisez le <f:viewAction> Lorsque vous souhaitez exécuter une méthode avant que le code HTML ne soit rendu. Ceci est particulièrement utile si vous souhaitez effectuer des actions en fonction des valeurs de modèle définies par <f:viewParam> Pendant la phase de mise à jour des valeurs de modèle. À savoir, ils ne sont pas disponibles au moment où le @PostConstruct S'exécute. Dans JSF 2.0/2.1, cette balise n’existait pas et vous devez utiliser la solution de contournement preRenderView.

Si le bean de support est @RequestScoped, font-ils 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. Le @PostConstruct Est destiné à exécuter des actions directement après la construction du bean et la définition de toutes les dépendances injectées et propriétés gérées, telles que @EJB, @Inject, @ManagedProperty, Etc. Notamment, les dépendances injectées ne sont pas disponibles dans le constructeur du bean. Cela ne fonctionnera donc qu'une seule fois par vue, session ou application lorsque le bean est étendu, vue ou session. Par défaut, <f:viewAction> N'est invoqué que sur la demande GET initiale, mais peut également être configuré via l'attribut onPostback="true" Pour être invoqué également sur les demandes de publication. L'événement preRenderView est invoqué à chaque requête HTTP (oui, cela inclut également les requêtes ajax!).

En résumé, utilisez @PostConstruct Si vous souhaitez effectuer des actions sur les dépendances injectées et les propriétés gérées définies par @EJB, @Inject, @ManagedProperty, Etc. pendant la construction du bean . Utilisez <f:viewAction> Si vous souhaitez également effectuer des actions sur les propriétés définies par <f:viewParam>. Si vous êtes toujours sur JSF 2.0/2.1, utilisez preRenderView au lieu de <f:viewAction>. Vous pouvez éventuellement ajouter une vérification sur FacesContext#isPostback() pour exécuter l'action preRenderView uniquement sur la demande initiale.

Voir également:

113
BalusC

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 depuis une autre vue? -> Ensuite, utilisez "preRenderView"

1
Val Martinez