¿Cuándo usar f: viewAction / preRenderView versus PostConstruct?

95

¿Cuándo se debe usar el evento f:viewActiono preRenderViewpara inicializar los datos de una página en lugar de usar la @PostConstructanotación? ¿Es la justificación para usar uno u otro en función del tipo de alcance del bean de respaldo, por ejemplo, si el bean de respaldo es @RequestScoped, entonces la opción de usar f:viewActiono preRenderViewsobre @PostConstructpara inicializar su bean de respaldo antes de renderizar la vista sería irrelevante como lo harían los dos? resultar en el mismo efecto?

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

    }
}
Mejores prácticas
fuente

Respuestas:

117

¿Cuándo se debe usar el evento f: viewAction o preRenderView para inicializar los datos de los versículos de una página usando la anotación @PostConstruct?

Utilice el <f:viewAction>cuando desee ejecutar un método antes de que se renderice el HTML. Esto es particularmente útil si desea realizar acciones basadas en los valores del modelo establecidos <f:viewParam>durante la fase de actualización de los valores del modelo. Es decir, no están disponibles en el momento de las @PostConstructcarreras. En JSF 2.0 / 2.1, esta etiqueta no existía y debe usar la preRenderViewsolución alternativa.

Si el bean de respaldo es @RequestScoped, ¿efectivamente hacen exactamente lo mismo? (¿Y entonces depende de la elección del desarrollador? (@PostConstruct parece "más limpio").

No, definitivamente no hacen lo mismo de manera efectiva. El @PostConstructmismo se pretende realizar acciones directamente después de la construcción y el ajuste de todas las dependencias inyectados de frijol y propiedades administradas como @EJB, @Inject, @ManagedProperty, etc. Es decir, las dependencias inyectados no están disponibles dentro constructor del frijol. Esto, por lo tanto, se ejecutará solo una vez por vista, sesión o aplicación cuando el bean tenga un alcance de vista, sesión o aplicación. De <f:viewAction>forma predeterminada, solo se invoca en la solicitud GET inicial, pero se onPostback="true"puede configurar mediante el atributo para que se invoque también en las solicitudes de devolución. El preRenderViewevento se invoca en cada solicitud HTTP (sí, ¡esto también incluye solicitudes ajax!).

Resumida, su uso @PostConstructsi desea realizar acciones en las dependencias de colada y propiedades administradas que son fijados por @EJB, @Inject, @ManagedProperty, etc durante la construcción de frijol. Úselo <f:viewAction>si también desea realizar acciones en las propiedades establecidas por <f:viewParam>. Si todavía está en JSF 2.0 / 2.1, use en preRenderViewlugar de <f:viewAction>. Si es necesario, puede agregar una marca FacesContext#isPostback()para realizar la preRenderViewacción solo en la solicitud inicial.

Ver también:

BalusC
fuente
Gracias. Lo siento, edité mi pregunta original mientras escribías la respuesta ...
BestPractices
Mencioné el alcance del bean porque @PostConstruct solo se llamaría una vez si el bean fuera SessionScoped (en el momento en que se crea el bean por primera vez) pero se llamaría a preRenderView cada vez que se acceda a la página. ¿O me equivoqué?
BestPractices
Si eso es correcto. El evento de vista previa a la representación se llama en la fase de acción de invocación. La construcción posterior se invoca después de la construcción del bean. No se construye un bean con ámbito de sesión en cada solicitud HTTP.
BalusC
Me preguntaba que se estaba llamando a mi método durante las solicitudes de ajax. la llamada isPostBack () salvó el día !!
jacosta
1

¿Necesita inicializar las propiedades del bean administrado? -> Luego, use @ PostConstruct De lo contrario, ¿necesita trabajar con parámetros pasados ​​desde otra vista? -> Luego, usa " preRenderView "

Val Martinez
fuente