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


¿Cuándo se debe usar el evento f:viewAction o preRenderView para inicializar datos para una página versus usar la anotación @PostConstruct? ¿La justificación para usar uno u otro se basa en el tipo de alcance del frijol de respaldo, por ejemplo, si el frijol de respaldo es @RequestScoped, entonces la elección de usar f:viewAction o preRenderView sobre @PostConstruct para inicializar su frijol de respaldo antes de renderizar la vista sería irrelevante ya que los dos resultarían en el mismo efecto?

F: ViewAction o Vista previa

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

    }
}
Author: Subodh Joshi, 2012-03-23

2 answers

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

Use el <f:viewAction> cuando desee ejecutar un método antes de que se procese el HTML. Esto es particularmente útil si desea realizar acciones basadas en valores del modelo establecidos por <f:viewParam> durante la fase de actualización de valores del modelo. Es decir, no están disponibles en el momento en que se ejecuta @PostConstruct. En JSF 2.0/2.1, esta etiqueta no existía y tienes que usar la solución preRenderView.

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

Resumido, utilice @PostConstruct si desea realizar acciones en dependencias inyectadas y propiedades administradas que se establecen por @EJB, @Inject, @ManagedProperty, etc durante la construcción de bean. Use <f:viewAction> si también desea realizar acciones sobre las propiedades establecidas por <f:viewParam>. Si todavía está en JSF 2.0 / 2.1, use preRenderView en lugar de <f:viewAction>. Si es necesario, puede agregar una verificación en FacesContext#isPostback() para realizar la acción preRenderView solo en la solicitud inicial.

Véase también:

 108
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:05

¿Necesita inicializar las propiedades de managed bean? -- >Entonces, use @ PostConstruct De lo contrario, ¿necesita trabajar con parámetros pasados desde otra vista? -- >Luego, use " Vista previa "

 0
Author: Val Martinez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-31 09:54:15