Frage

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

Wenn das relevant ist, ich bin derzeit mit JSF 1.2.

War es hilfreich?

Lösung

JSF 1.0 / 1.1

Setzen Sie einfach die gewünschte Logik in den Konstruktor der Anfrage scoped Bean mit der JSF-Seite verbunden.

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

JSF 1.2 / 2.x

Mit @PostConstruct kommentierten Methode auf Anfrage bzw. Sicht scoped Bohne. Es wird nach dem Bau ausgeführt werden und Initialisierung / Einstellung aller verwalteten Eigenschaften und injiziert Abhängigkeiten.

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

Dies wird stark über Konstruktor für den Fall empfohlen, dass Sie ein Bean Management Framework verwenden, die Proxies, wie CDI verwendet, da der Konstruktor nicht zu den Zeiten aufgerufen werden können Sie es erwarten würden.

JSF 2.0 / 2.1

Alternativ Verwendung <f:event type="preRenderView"> falls Sie beabsichtigt, auch basierend auf <f:viewParam> zu initialisieren, oder wenn die Bohne in einem größeren Anwendungsbereich als der Viewbereich gelegt wird (was wiederum ein Design-Problem gibt, aber abgesehen davon). Ansonsten ein @PostConstruct ist völlig in Ordnung, auch.

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

Alternativ Verwendung <f:viewAction> falls Sie beabsichtigt, auch basierend auf <f:viewParam> zu initialisieren, oder wenn die Bohne in einem größeren Anwendungsbereich als der Viewbereich gelegt wird (was wiederum ein Design-Problem gibt, aber abgesehen davon). Ansonsten ein @PostConstruct ist völlig in Ordnung, auch.

<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 einen String Navigations Fall bei Bedarf zurückkehren kann. Es wird als Umleitung interpretiert werden (so dass Sie hier keine ?faces-redirect=true benötigen).

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

Siehe auch:

Andere Tipps

Eine weitere einfache Möglichkeit ist das Feuer, das Verfahren zu verwenden, bevor die Ansicht gerendert wird. Das ist besser als postConstruct weil für sessionScope, postConstruct nur einmal pro Sitzung ausgelöst. Dies wird jedes Mal feuert die Seite geladen wird. Dies ist natürlich nur für JSF 2.0 und nicht für JSF 1.2.

Dies ist, wie es zu tun -

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

EDIT -. Obwohl dies für die Frage auf dieser Seite keine Lösung ist, dass ich dieses Add nur für Menschen mit höheren Versionen von JSF

JSF 2.2 hat eine neue Funktion, die diese Aufgabe viewAction mit ausführt.

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

@PostConstruct ausgeführt wird einmal in dem ersten, wenn Bean Erstellt. Die Lösung ist eine Nicht verwendete Eigenschaft erstellen und Ihre Aktion in Getter Methode dieser Eigenschaft Sie und fügen Sie diese Eigenschaft auf Ihrer .xhtml-Datei wie folgt:

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

und in der Bean-Code:

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

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

Aufruf Bean Aktion von einer eine gute Idee sein, halten Attribut AutoRun = "true" Beispiel unten

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top