Frage

Ich habe die folgende Seite an:

<h:form id="gameSelectionForm">
    <h:selectOneMenu id="gameSelection">
        <f:selectItems value="#{gameBean.gameIds}" />
    </h:selectOneMenu>
    <h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}"  />
</h:form>

<h:panelGroup id="gameDiv">
    <f:verbatim>
        <iframe src="/levelup/resources/games/#{gameBean.gameId}/#{gameBean.htmlPage}"  width="700px" height="800px" frameborder="0"/>
    </f:verbatim>
</h:panelGroup>

Wenn ich auf dem „gameSelector“ klicken, hier ist die Abfolge der Ereignisse: 1. gameBean.getGameId und gameBean.getHtmlPage genannt werden 2. gameBean.changeGame heißt 3. Die Seite aktualisiert wird.

Meine Fragen liegen in der Größenordnung von 1. und 2. Der changeGame ändert eine gameBean Variable, die durch die getGameId und getHtmlPage verwendet wird. Ich möchte daher zunächst auszuführen, so dass, wenn andere Platten aufgefrischt werden, sie den richtigen Daten enthalten.

Bitte beachten Sie, dass dieses Problem nur für den Anruf innerhalb des gameDiv Elements auftreten scheint (sind andere Variablen richtig aufgefrischt).

Müsste Sie eine Idee, was ich tun könnte, um die Reihenfolge der 1. und 2. zurückkehren, so dass die changeGame () -Methode ist die erste genannt?

Ich bin mit Javaserver Faces 2.0 auf Tomcat 7.0.

Vielen Dank im Voraus

War es hilfreich?

Lösung

Wie pro Ihre eigene Antwort zu diesem Thema:

Ich entfernte die f: wörtlich Tag, und jetzt funktioniert es richtig. Ich verstehe immer noch nicht, warum es dieses Verhalten verursacht hat, though.

Die <f:verbatim> wurde in JSF 1.0 lange Zeit wieder mit dem alleinigen Zweck der Lage sein, schließen einfacher HTML in dem JSF-Komponentenbaum eingeführt. Auf JSF 1.0 (und 1.1), wenn der Komponentenbaum die einfache HTML war alles bekommen gebaut, ignoriert. Die Seite erhält mit all dem einfachen HTML zuerst gerendert und dann den gerenderte HTML von JSF-Komponenten danach . So zum Beispiel

<p>Hello</p>
<h:inputText />
<p>World</p>
<h:outputText value="outputtext" />
<p>This is weird</p>

get übertragen als

<p>Hello</p>
<p>World</p>
<p>This is weird</p>
<input type="text" />
outputtext    

Die <f:verbatim> Entwickler erlaubt einfache HTML in die JSF-Komponentenbaum zu nehmen, so dass sie „in sync“ gemacht, wie Sie von der Codierung erwarten würde.

<f:verbatim><p>Hello</p></f:verbatim>
<h:inputText />
<f:verbatim><p>World</p></f:verbatim>
<h:outputText value="outputtext" />
<f:verbatim><p>This is weird</p></f:verbatim>

Sie jedoch inlined während Ansichten build Zeit, nicht während der Ansicht machen Zeit. Dies ist die Ursache des Problems, die Getter erhalten während der Wiederherstellungsansicht Phase aufgerufen statt Antwortphase machen.

Da JSF 1.2, mit dem verbesserten Ansicht Handler war es möglich, einfache HTML „synchron“ inline ohne mit hässlichen <f:verbatim> Tags zu Streiten. So ist es nicht mehr benötigt. Darüber hinaus gibt es keine sinnvollen Anwendungsfälle für den Tag mehr, der möglicherweise einige vorzeitigen Performance-Optimierungen erwarten, aber immer noch dann, sollten Sie es nicht mit dynamischen Daten in Kombination verwendet werden, wie durch Expression Language erhalten.

Verwandte Fragen:

Andere Tipps

Setzen Sie sofort Attribut auf true eingestellt auf dem Befehl.

<h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}" immediate="true" />

Es wird das Verfahren in der ApplyRequestValues ??Phase führt dann.

entfernte ich die f: wörtlich Tag, und jetzt funktioniert es richtig. Ich verstehe immer noch nicht, warum es dieses Verhalten allerdings verursacht hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top