2012-04-04 5 views
0

Ich möchte eine Variable in der Sitzung Geltungsbereich anwenden, bevor die Ansicht angezeigt wird, als diese Ansicht diese Variable verwenden wird. HierJSF 2.0 Eine Variable im Session-Bereich festlegen, bevor eine Ansicht angezeigt wird?

ist der Link:

<h:link value="#{msg.persondeactivate}" outcome="persondeactivate" /> 

Hier ist die Flächen-config.xml

<navigation-rule> 
    <navigation-case> 
     <from-outcome>persondeactivate</from-outcome> 
     <to-view-id>/deactivatePerson.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

Hier ist die Ansicht (deactivatePerson.xhtml):

...<h:outputText value="#{msg.personIsDeactivate}" rendered="#{controller.personDeactivated}" style="color:green" />... <h:commandButton action="#{controller.deaktivieren}" value="#{msg.deactivate}"></h:commandButton>... 

Hier die verwaltete Bean:

@ManagedBean @SessionScoped public class Controller { ... private boolean personDeactivated = false; public String deaktivieren(){ personDeactivated = false; 
    // Deactivate process personDeactivated = true; return "persondeactivate";} ... } 

Ich möchte, dass die Variable personDeactivated-falsch vor der Ansicht (deactivatePerson.xhtml) zum zweiten Mal eingestellt wird aufgerufen wird.

Es funktioniert nicht.

Kann mir bitte jemand sagen, was los ist?

Vielen Dank im Voraus.

Antwort

0

Sie können <f:event type="preRenderView"> verwenden, um eine Backing-Bean-Listenermethode aufzurufen, bevor die Ansicht gerendert wird.

<f:event type="preRenderView" listener="#{controller.onPreRenderView}" /> 

mit

public void onPreRenderView() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     // Do your job here when the view is been freshly requested by GET. 
    } 
    else { 
     // Do your job here when a POST request is been performed by command link/button. 
    } 
} 

Unrelated auf das konkrete Problem, habe ich den Eindruck, dass die Controller tatsächlich im falschen Bereich ist. Eine viel bessere Lösung wäre es stattdessen @ViewScoped zu machen. Auf diese Weise wird die Bean-Instanz bei jeder neuen GET-Anforderung neu erstellt und bleibt so lange bestehen, wie Sie die POST-Sicherung in derselben Ansicht ausführen (und Sie erhalten keine Inkonsistenzen und nicht intuitives Verhalten, wenn dieselbe Seite in mehreren Browser-Registerkarten geöffnet ist)/windows in der gleichen Sitzung, die dieselbe session-scoped Bean teilen würde!). Siehe auch How to choose the right bean scope?

+0

Vielen Dank BalusC für Ihre schnelle Antwort und den Link. Aber ich bekomme die folgende Fehlermeldung, wenn ich die Methode in meine Sitzung einfügen Bereich: _Die Methode IsPostBack() ist nicht definiert für den Typ FacesContext_ Was bedeutet das? – Lukem

+0

Das bedeutet nur, dass die Methode mit dem gegebenen Namen in der gegebenen Klasse nicht existiert. Einfach den Methodennamen fixieren. – BalusC

+0

Ich habe in der JSF 2.0 API für die richtige Methode gesucht, aber ich habe nicht gefunden. kann es sein, dass ich eine spezielle Bibliothek brauche? – Lukem

Verwandte Themen