Quando utilizzare f: viewAction / preRenderView rispetto a PostConstruct?


95

Quando si dovrebbe utilizzare l' evento f:viewActiono preRenderViewper inizializzare i dati per una pagina rispetto all'utilizzo @PostConstructdell'annotazione? Il motivo per usare l'uno o l'altro è basato sul tipo di ambito del backing bean es.Se il backing bean lo è @RequestScoped, allora la scelta di utilizzare f:viewActiono preRenderViewsopra @PostConstructper inizializzare il backing bean prima di rendere la vista sarebbe irrilevante come i due risultato nello stesso effetto?

f: viewAction o preRenderView

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

o

@PostConstruct

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

    }
}

Risposte:


117

Quando si dovrebbe utilizzare l'evento f: viewAction o preRenderView per inizializzare i dati per i versetti di una pagina utilizzando l'annotazione @PostConstruct?

Utilizzare <f:viewAction>quando si desidera eseguire un metodo prima che sia stato eseguito il rendering dell'HTML. Ciò è particolarmente utile se si desidera eseguire azioni in base ai valori del modello impostati da <f:viewParam>durante la fase di aggiornamento dei valori del modello. Vale a dire, non sono disponibili al momento le @PostConstructpiste. In JSF 2.0 / 2.1, questo tag non esisteva e devi usare la preRenderViewsoluzione alternativa.

Se il bean di supporto è @RequestScoped, fanno effettivamente la stessa identica cosa? (e quindi dipende dalla scelta dello sviluppatore? (@PostConstruct sembra "più pulito").

No, sicuramente non fanno effettivamente la stessa cosa. Il @PostConstructintented per eseguire azioni direttamente dopo la costruzione del fagiolo e l'impostazione di tutte le dipendenze iniettati e proprietà gestite come @EJB, @Inject, @ManagedProperty, ecc Vale a dire, le dipendenze iniettate non sono disponibili all'interno costruttore del fagiolo. Questo verrà quindi eseguito solo una volta per vista, sessione o applicazione quando il bean ha scope vista, sessione o applicazione. Per <f:viewAction>impostazione predefinita, viene richiamato solo su richiesta GET iniziale, ma può onPostback="true"essere configurato tramite l' attributo per essere richiamato anche su richieste di postback. L' preRenderViewevento viene richiamato su ogni richiesta HTTP (sì, questo include anche le richieste ajax!).

Riassunti, l'uso @PostConstructse si desidera eseguire azioni su dipendenze iniettati e le proprietà gestite che vengono impostate dai @EJB, @Inject, @ManagedProperty, ecc durante la costruzione del bean. Utilizzare <f:viewAction>se anche desidera eseguire azioni su proprietà impostate da <f:viewParam>. Se sei ancora su JSF 2.0 / 2.1, usa preRenderViewinvece di <f:viewAction>. Se necessario, è possibile aggiungere un segno di spunta FacesContext#isPostback()per eseguire l' preRenderViewazione solo su richiesta iniziale.

Guarda anche:


Grazie. Scusa se ho modificato la mia domanda originale mentre stavi scrivendo la risposta ...
BestPractices

Ho menzionato l'ambito del bean perché @PostConstruct verrebbe chiamato solo una volta se il bean fosse SessionScoped (nel momento in cui il bean viene creato per la prima volta) ma preRenderView verrebbe chiamato ogni volta che si accede alla pagina. O ho sbagliato?
BestPractices

Sì, è corretto. L'evento di visualizzazione pre-rendering viene chiamato nella fase di azione invoke. Il costrutto post viene invocato dopo la costruzione del bean. Un bean con ambito di sessione non viene costruito su ogni richiesta HTTP.
BalusC

Mi chiedevo che il mio metodo venisse chiamato durante le richieste ajax. la chiamata isPostBack () ha salvato la giornata !!
jacosta

1

Hai bisogno di inizializzare le proprietà del bean gestito? -> Quindi, usa @ PostConstruct Altrimenti, hai bisogno di lavorare con i parametri passati da un'altra vista? -> Quindi, usa " preRenderView "

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.