jsf - method - prerenderview example
Cuándo usar f: viewAction/preRenderView versus PostConstruct? (2)
¿Cuándo se debe usar el evento f: viewAction o preRenderView para inicializar los datos de una página con la anotación @PostConstruct?
Use <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 por <f:viewParam>
durante la fase de actualización de los valores del modelo. A saber, no están disponibles en el momento en que se ejecuta @PostConstruct
. En JSF 2.0 / 2.1, esta etiqueta no existía y debe usar la solución alternativa preRenderView
.
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 efectivamente lo mismo. El @PostConstruct
está @PostConstruct
a realizar acciones directamente después de la construcción y configuración de todas las dependencias y propiedades administradas de @EJB
como @EJB
, @Inject
, @Inject
, etc. A saber, las dependencias inyectadas no están disponibles dentro del constructor del bean. Esto se ejecutará solo una vez por vista, sesión o aplicación cuando el bean es view, session o application scoped. La <f:viewAction>
se invoca de manera predeterminada en la solicitud GET inicial, pero también se puede onPostback="true"
través del onPostback="true"
para que se invoque en solicitudes de devolución de datos. El evento preRenderView
se invoca en cada solicitud HTTP (sí, ¡esto también incluye solicitudes ajax!).
Resumido, use @PostConstruct
si desea realizar acciones en dependencias inyectadas y propiedades administradas que se establecen mediante @EJB
, @Inject
, @Inject
, etc. durante la construcción de bean. Utilice <f:viewAction>
si también desea realizar acciones en las propiedades establecidas por <f:viewParam>
. Si todavía está utilizando JSF 2.0 / 2.1, use preRenderView
lugar de <f:viewAction>
. Si es necesario, puede agregar una FacesContext#isPostback()
en FacesContext#isPostback()
para realizar la acción preRenderView
solo en la solicitud inicial.
Ver también:
¿Cuándo se debe usar el evento f:viewAction
o preRenderView
para inicializar los datos de una página en lugar de utilizar la anotación @PostConstruct
? ¿El fundamento para usar uno u otro depende del tipo de alcance del bean de respaldo? Por ejemplo, si el bean de respaldo es @RequestScoped
, entonces la opción de usar f:viewAction
o preRenderView
sobre @PostConstruct
para inicializar su bean de respaldo antes de la renderización la vista es irrelevante ya que los dos producirían 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()
{
}
}
¿Necesita inicializar las propiedades del bean gestionado? -> Entonces, use @ PostConstruct De lo contrario, ¿necesita trabajar con parámetros pasados desde otra vista? -> Luego, usa " preRenderView "