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()
{
}
}
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:
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