¿Cuándo usar f:viewAction/preRenderView versus PostConstruct?
¿Cuándo se debe usar el evento f:viewAction
o preRenderView
para inicializar los datos de una página en lugar de usar la @PostConstruct
anotació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:viewAction
o preRenderView
sobre @PostConstruct
para 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()
{
}
}
¿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 preRenderView
solució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 @PostConstruct
objetivo 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 @PostConstruct
si desea realizar acciones en dependencias inyectadas y propiedades administradas que se establecen mediante ,,, @EJB
etc. 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?
¿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 "