6 Stimmen

Verwendung der request-scoped Bean-Funktion als Aktion für eine temporär gerenderte Schaltfläche in JSF

Ich habe das folgende grundlegende (und vielleicht dumme) Verständnisproblem in JSF:

Es gibt eine JSF-Seite "testPage.xhtml":

Und eine Backing Bean "TestBean.java":

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean(name="testBean")
@RequestScoped
public class TestBean implements Serializable {

    public static final long serialVersionUID = 1L;

    private boolean renderB2 = false;

    public String ctrl() {
            setRenderB2(true);

            System.out.println("ctrl() wird aufgerufen.");

            return null;
    }

    public boolean getRenderB2() {
            return renderB2;
    }

    public void setRenderB2(boolean renderB2) {
            this.renderB2 = renderB2;
    }
}

Also haben beide Links TestBean.ctrl() als Aktion.

Zuerst wird nur B1 gerendert. Wenn B1 angeklickt wird, wird TestBean.ctrl() ausgeführt und auch B2 wird gerendert.

Wenn jedoch B2 angeklickt wird, wird nicht TestBean.ctrl() ausgeführt.

Und das ist meine Frage: Warum wird die Aktionsmethode nicht ausgeführt, wenn B2 angeklickt wird?

Vielleicht liegt es daran, dass B2 nicht erneut gerendert wird. Aber warum verhindert das die Ausführung der Aktionsmethode (die vom zuvor gerenderten B2 Link aufgerufen wird)?

7voto

BalusC Punkte 1034465

Dies liegt daran, dass das rendered-Attribut während der Anwendung der Werte erneut im Anfrage-Werte-Phase des Formularabsendevorgangs neu bewertet wird. Wenn ein UIInput oder UICommand-Komponente zu diesem Zeitpunkt nicht gerendert wird, werden die Anforderungswerte nicht für die Komponente angewendet. Das heißt, der Modellwert der UIInput-Komponente wird nicht aktualisiert und die Aktion der UICommand-Komponente wird nicht aufgerufen.

Weil Ihr Bean anfragebezogen ist, wird es am Ende der Antwort, die das Formular anzeigt, verworfen und ein brandneues wird am Anfang der Anfrage des Formularabsendevorgangs erstellt.

Sie müssen alle anfragebezogenen Eigenschaften, die für das rendered-Attribut verantwortlich sind, beibehalten. Der einfachste Weg ist, das Bean im Ansichtsbereich zu platzieren, indem Sie es mit @ViewScoped markieren und sicherstellen, dass Sie null oder void aus Aktionen zurückgeben, die auf dieselbe Ansicht zurückgehen sollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X