wake-up-neo.net

JSF-Managed-Bean-Aktion beim Laden der Seite aufrufen

Gibt es eine Möglichkeit, eine JSF-verwaltete Bean-Aktion auszuführen, wenn eine Seite geladen wird?

Wenn dies relevant ist, verwende ich derzeit JSF 1.2.

53
DD.

JSF 1,0/1,1

Fügen Sie einfach die gewünschte Logik in den Konstruktor der Bean für Anforderungsbereiche ein, die der JSF-Seite zugeordnet ist. 

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

JSF 1,2/2.x

Verwenden Sie die kommentierte @PostConstruct-Methode für eine Anforderung oder eine Ansichts-Bean. Sie wird nach der und - Initialisierung/Einstellung aller verwalteten Eigenschaften und der eingefügten Abhängigkeiten ausgeführt.

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

Dies wird gegenüber Konstruktoren dringend empfohlen, wenn Sie ein Bean-Management-Framework verwenden, das Proxys wie CDI verwendet, da der Konstruktor möglicherweise nicht zu den erwarteten Zeitpunkten aufgerufen wird.

JSF 2.0/2.1

Verwenden Sie alternativ <f:event type="preRenderView">, wenn Sie auch basierend auf <f:viewParam> initialisieren möchten oder wenn die Bean in einem größeren Bereich als dem Ansichtsbereich abgelegt wird (was wiederum auf ein Designproblem hinweist, das jedoch beiseite steht). Ansonsten ist ein @PostConstruct auch vollkommen in Ordnung.

<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+

Verwenden Sie alternativ <f:viewAction>, wenn Sie auch basierend auf <f:viewParam> initialisieren möchten oder wenn die Bean in einem größeren Bereich als dem Ansichtsbereich abgelegt wird (was wiederum auf ein Designproblem hinweist, das jedoch beiseite steht). Ansonsten ist ein @PostConstruct auch vollkommen in Ordnung.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
public void onload() { 
    // Do your stuff here.
}

Beachten Sie, dass dies bei Bedarf einen String-Navigationsfall zurückgeben kann. Es wird als Weiterleitung interpretiert (daher benötigen Sie hier keinen ?faces-redirect=true).

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

Siehe auch:

78
BalusC

Eine andere einfache Möglichkeit besteht darin, die Methode feuern, bevor die Ansicht gerendert wird. Dies ist besser als postConstruct, da postConstruct für sessionScope nur einmal pro Sitzung ausgelöst wird. Dies wird jedes Mal ausgelöst, wenn die Seite geladen wird. Dies gilt natürlich nur für JSF 2.0 und nicht für JSF 1.2.

So geht's -

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

Und in der myController.Java

 public void onPageLoad(){
    // Do something
 }

BEARBEITEN - Obwohl dies keine Lösung für die Frage auf dieser Seite ist, füge ich dies nur für Benutzer hinzu, die höhere Versionen von JSF verwenden.

JSF 2.2 verfügt über eine neue Funktion, die diese Aufgabe mit viewAction ausführt. 

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

@PostConstruct wird EINMALS zuerst ausgeführt, wenn Bean Created . Erstellt wird. Die Lösung erstellt eine nicht verwendete Eigenschaft und führt Ihre Aktion in der Getter-Methode dieser Eigenschaft aus Und fügt diese Eigenschaft wie folgt zu Ihrer .xhtml-Datei hinzu:

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

und in deinem Bohnencode:

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

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}
10
Amin Bahiraei

das Aufrufen der Bean-Aktion von a ist eine gute Idee, halten Sie das Attribut autoRun = "true" .__

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