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

Resuelto BestPractices asked hace 12 años • 2 respuestas

¿Cuándo se debe usar el evento f:viewActiono preRenderViewpara inicializar los datos de una página en lugar de usar la @PostConstructanotación? ¿La razón para usar uno u otro se basa en el tipo de alcance del bean de respaldo, por ejemplo, si el bean de respaldo es @RequestScoped, entonces la elección de usar f:viewActiono preRenderViewsobre @PostConstructpara inicializar su bean de respaldo antes de representar la vista sería irrelevante ya que los dos serían irrelevantes? ¿Resulta 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()
    {

    }
}
BestPractices avatar Mar 24 '12 01:03 BestPractices
Aceptado

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

Utilice <f:viewAction>cuando desee ejecutar un método antes de que se represente 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 este momento @PostConstruct. En JSF 2.0/2.1, esta etiqueta no existía y hay que utilizar una preRenderViewsolución alternativa.

Si el bean de respaldo es @RequestScoped, ¿hacen efectivamente 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. Su @PostConstructobjetivo es realizar acciones directamente después de la construcción del bean y configurar todas las dependencias inyectadas y propiedades administradas como @EJB,,, etc. Es decir, las dependencias inyectadas no están disponibles dentro del constructor del bean. Por lo tanto, esto se ejecutará solo una vez por vista, sesión o aplicación cuando el bean tenga el ámbito de vista, sesión o aplicación. De forma predeterminada , solo se invoca en la solicitud GET inicial, pero se puede configurar mediante el atributo para que también se invoque en solicitudes de devolución. El evento se invoca en cada solicitud HTTP (sí, ¡esto también incluye solicitudes ajax!).@Inject@ManagedProperty<f:viewAction>onPostback="true"preRenderView

En resumen, utilícelo @PostConstructsi desea realizar acciones en dependencias inyectadas y propiedades administradas que se establecen mediante ,,, @EJBetc. durante la construcción del bean. Úselo si también desea realizar acciones en las propiedades establecidas por . Si todavía estás en JSF 2.0/2.1, usa en lugar de . Si es necesario, puede agregar una marca para realizar la acción solo en la solicitud inicial.@Inject@ManagedProperty<f:viewAction><f:viewParam>preRenderView<f:viewAction>FacesContext#isPostback()preRenderView

Ver también:

  • ¿Para qué se pueden utilizar <f:metadata>, <f:viewParam> y <f:viewAction>?
  • ViewParam frente a @ManagedProperty (valor = "#{param.id}")
  • ¿Es posible desactivar el oyente f:event type="preRenderView" en la devolución de datos?
BalusC avatar Mar 23 '2012 18:03 BalusC

¿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 avatar Jul 31 '2015 09:07 Val Martinez