Invocar la acción del bean administrado JSF al cargar la página
¿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.
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 @PostConstruct
el 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 @PostConstruct
tambié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 @PostConstruct
tambié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 String
caso de navegación 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:
- ¿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
load
el evento HTML DOM, no durante la carga de la página.
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>
@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;
}
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" />