tutorial showcase etiquetas español ejemplo define concepto bean jsf action onload managed-bean

showcase - ui define jsf



Invocar la acción de bean gestionada JSF en la carga de la página (4)

¿Hay alguna forma de ejecutar una acción Bean administrada JSF cuando se carga una página?

Si eso es relevante, actualmente estoy usando JSF 1.2.


JSF 1.0 / 1.1

Simplemente ponga la lógica deseada en el constructor del bean con ámbito de solicitud asociado con la página JSF.

public Bean() { // Do your stuff here. }

JSF 1.2 / 2.x

Use @PostConstruct método anotado en una solicitud o vea el bean con ámbito. Se ejecutará después de la construcción y la inicialización / configuración de todas las propiedades administradas y las dependencias inyectadas.

@PostConstruct public void init() { // Do your stuff here. }

Esto es muy recomendable sobre el constructor en caso de que esté utilizando un marco de gestión de beans que utilice proxys, como CDI, ya que el constructor puede no ser llamado en el momento que lo esperaría.

JSF 2.0 / 2.1

Alternativamente, use <f:event type="preRenderView"> en caso de que <f:event type="preRenderView"> inicializar basado en <f:viewParam> también, o cuando el bean se coloque en un alcance más amplio que el alcance de la vista (que a su vez indica un problema de diseño) , pero eso aparte). De lo contrario, un @PostConstruct está perfectamente bien también.

<f:metadata> <f:viewParam name="foo" value="#{bean.foo}" /> <f:event type="preRenderView" listener="#{bean.onload}" /> </f:metadata>

public void onload() { // Do your stuff here. }

JSF 2.2+

Alternativamente, use <f:viewAction> en caso de que <f:viewAction> inicializar basado en <f:viewParam> también, o cuando el bean se coloque en un ámbito más amplio que el alcance de la vista (que a su vez indica un problema de diseño, pero aparte) . De lo contrario, un @PostConstruct está perfectamente bien también.

<f:metadata> <f:viewParam name="foo" value="#{bean.foo}" /> <f:viewAction action="#{bean.onload}" /> </f:metadata>

public void onload() { // Do your stuff here. }

Tenga en cuenta que esto puede devolver un caso de navegación de String si es necesario. Se interpretará como una redirección (por lo que no es necesario un ?faces-redirect=true aquí).

public String onload() { // Do your stuff here. // ... return "some.xhtml"; }

Ver también:


@PostConstruct se ejecuta ONCE en primer lugar cuando Bean Created. la solución es crear una propiedad no utilizada y hacer su acción en el método Getter de esta propiedad y agregar esta propiedad a su archivo .xhtml como este:

<h:inputHidden value="#{loginBean.loginStatus}"/>

y en tu código de frijol:

public void setLoginStatus(String loginStatus) { this.loginStatus = loginStatus; } public String getLoginStatus() { // Do your stuff here. return loginStatus; }


Otra manera fácil es utilizar el método fire antes de que se visualice la vista. Esto es mejor que postConstruct porque para sessionScope, postConstruct se activará solo una vez por sesión. Esto disparará cada vez que se carga la página. Por supuesto, esto es solo para JSF 2.0 y no para JSF 1.2.

Asi es como se hace -

<html xmlns:f="http://java.sun.com/jsf/core"> <f:metadata> <f:event type="preRenderView" listener="#{myController.onPageLoad}"/> </f:metadata> </html>

Y en myController.java

public void onPageLoad(){ // Do something }

EDITAR - Aunque esta no es una solución para la pregunta en esta página, agrego esto solo para personas que usan versiones superiores de JSF.

JSF 2.2 tiene una nueva característica que realiza esta tarea usando viewAction .

<f:metadata> <f:viewAction action="#{myController.onPageLoad}" /> </f:metadata>


llamar a bean action desde a será una buena idea, mantenga el atributo autoRun = "true" ejemplo a continuación

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />