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:
- ¿Cómo se procesan los parámetros de la URL de la cadena de consulta GET en el bean de respaldo en la carga de la página?
- ¿Para qué pueden usarse <f: metadata>, <f: viewParam> y <f: viewAction>?
- ¿Cómo invocar un bean gestionado 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 el evento de
load
HTML DOM, no durante la carga de la página.
@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" />