Invocar la acción del bean administrado JSF al cargar la página

Resuelto DD. asked hace 14 años • 4 respuestas

¿Existe alguna forma de ejecutar una acción de bean administrado JSF cuando se carga una página?

Si eso es relevante, actualmente estoy usando JSF 1.2.

DD. avatar Mar 16 '10 06:03 DD.
Aceptado

JSF 1.0/1.1

Simplemente coloque 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

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

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

Se recomienda encarecidamente esto en lugar del constructor en caso de que esté utilizando un marco de administración de beans que utilice proxies, como CDI, porque es posible que no se llame al constructor en los momentos esperados.

JSF 2.0/2.1

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

<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, utilícelo <f:viewAction>en caso de que desee inicializar en función de <f:viewParam>también, o cuando el bean se coloque en un alcance más amplio que el alcance de la vista (lo que a su vez indica un problema de diseño, pero eso es aparte). De lo contrario, a @PostConstructtambién está perfectamente bien.

<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 Stringcaso de navegación si es necesario. Se interpretará como una redirección (por lo que no es necesario un ?faces-redirect=trueaquí).

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

Ver también:

  • ¿Cómo proceso los parámetros de URL de la cadena de consulta GET en el bean de respaldo al cargar la página?
  • ¿Para qué se pueden utilizar <f:metadata>, <f:viewParam> y <f:viewAction>?
  • ¿Cómo invocar un bean administrado JSF en un evento HTML DOM usando JavaScript nativo? - en caso de que realmente esté interesado en ejecutar un método de acción de bean durante loadel evento HTML DOM, no durante la carga de la página.
BalusC avatar Mar 15 '2010 23:03 BalusC

Otra forma sencilla es utilizar el método de activación antes de que se represente la vista. Esto es mejor que postConstruct porque para sessionScope, postConstruct se activará solo una vez en cada sesión. Esto se activará cada vez que se cargue la página. Por supuesto, esto es sólo 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>
stolen_leaves avatar Dec 03 '2014 11:12 stolen_leaves

@PostConstruct se ejecuta UNA VEZ primero cuando se crea el Bean. la solución es crear una propiedad no utilizada y realizar su acción en el método Getter de esta propiedad y agregar esta propiedad a su archivo .xhtml de esta manera:

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

y en tu código de bean:

public void setLoginStatus(String loginStatus) {
    this.loginStatus = loginStatus;
}

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}
Amin Bahiraei avatar Nov 23 '2010 12:11 Amin Bahiraei

Llamar a la acción del bean desde a <p:remoteCommand>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" />
sijo jose avatar May 08 '2018 05:05 sijo jose