JSF-beheerde bean-actie aanroepen bij het laden van de pagina

Is er een manier om een ​​door JSF beheerde bean-actie uit te voeren wanneer een pagina is geladen?

Als dat relevant is, gebruik ik momenteel JSF 1.2.


Antwoord 1, autoriteit 100%

JSF 1.0 / 1.1

Plaats de gewenste logica in de constructor van de request-scoped bean die is gekoppeld aan de JSF-pagina.

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

JSF 1.2 / 2.x

Gebruik @PostConstructgeannoteerde methode op een verzoek of bekijk scoped bean. Het wordt uitgevoerd na de constructie eninitialisatie/instelling van alle beheerde eigenschappen en geïnjecteerde afhankelijkheden.

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

Dit wordt ten zeerste aanbevolen boven de constructor als je een bean management-framework gebruikt dat proxy’s gebruikt, zoals CDI, omdat de constructor mogelijk niet wordt aangeroepen op de tijden die je zou verwachten.

JSF 2.0 / 2.1

U kunt ook <f:event type="preRenderView">gebruiken voor het geval u ook wilt initialiseren op basis van <f:viewParam>, of wanneer de boon wordt in een breder bereik geplaatst dan het zichtbereik (wat op zijn beurt wijst op een ontwerpprobleem, maar dat terzijde). Anders is een @PostConstructook prima.

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

U kunt ook <f:viewAction>gebruiken als u ook wilt initialiseren op basis van <f:viewParam>, of wanneer de boon in een breder bereik dan het zichtbereik (wat op zijn beurt wijst op een ontwerpprobleem, maar dat terzijde). Anders is een @PostConstructook prima.

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

Houd er rekening mee dat dit indien nodig een Stringnavigatie-case kan retourneren. Het wordt geïnterpreteerd als een omleiding (je hebt hier dus geen ?faces-redirect=truenodig).

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

Zie ook:


Antwoord 2, autoriteit 14%

Een andere gemakkelijke manier is om de methode fire te gebruiken voordat de weergave wordt weergegeven. Dit is beter dan postConstruct omdat voor sessionScope postConstruct slechts één keer per sessie wordt geactiveerd. Dit wordt geactiveerd elke keer dat de pagina wordt geladen. Dit is natuurlijk alleen voor JSF 2.0 en niet voor JSF 1.2.

Zo doe je het –

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

En in de myController.java

public void onPageLoad(){
    // Do something
 }

EDIT – Hoewel dit geen oplossing is voor de vraag op deze pagina, voeg ik dit alleen toe voor mensen die hogere versies van JSF gebruiken.

JSF 2.2 heeft een nieuwe functie die deze taak uitvoert met behulp van viewAction.

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

Antwoord 3, autoriteit 11%

@PostConstruct wordt EENMAAL als eerste uitgevoerd wanneer Bean is gemaakt.
de oplossing is het maken van een ongebruikte eigenschap en doe je actie in de Getter-methode van deze eigenschap
en voeg deze eigenschap als volgt toe aan uw .xhtml-bestand:

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

en in je bonencode:

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

Antwoord 4, autoriteit 2%

Bean-actie aanroepen vanuit een <p:remoteCommand>is een goed idee, houd kenmerk autoRun=”true”
Voorbeeld hieronder

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

Other episodes