フォーム送信前に呼び出される f:verbatim 内のゲッター
質問
次のページがあります。
<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>
「gameSelector」ボタンをクリックすると、次のような一連のイベントが表示されます。1.gamebean.getGameidおよびgamebean.gethtmlpageは2と呼ばれます。GameBean.ChangeGameは3と呼ばれます。ページが更新されます。
私の問題は 1 の順にあります。と2。changeGame は、getGameId および getHtmlPage によって使用される gameBean 変数を変更します。したがって、他のパネルが更新されたときに適切なデータが含まれるように、これを最初に実行したいと考えています。
この問題は、gameDiv 要素内の呼び出しでのみ発生するようです (他の変数は適切に更新されます)。
1の順序を元に戻すにはどうすればよいかご存知でしょうか。と 2. つまり、changeGame() メソッドが最初に呼び出されますか?
Tomcat 7.0 で JavaServer Faces 2.0 を使用しています。
前もって感謝します
解決
あなた自身のとおりに 答え このトピックにおいて:
f:verbatim タグを削除したところ、正しく動作するようになりました。ただし、なぜこのような動作が発生したのかはまだわかりません。
の <f:verbatim>
は、JSF コンポーネント ツリーにプレーン HTML を含めることを唯一の目的として、ずっと前に JSF 1.0 で導入されました。JSF 1.0 (および 1.1) では、コンポーネント ツリーが構築されるときに、すべてのプレーン HTML が無視されました。ページは最初にすべてのプレーン HTML でレンダリングされ、次に JSF コンポーネントのレンダリングされた HTML がレンダリングされます。 その後. 。たとえば
<p>Hello</p>
<h:inputText />
<p>World</p>
<h:outputText value="outputtext" />
<p>This is weird</p>
次のようにレンダリングされます
<p>Hello</p>
<p>World</p>
<p>This is weird</p>
<input type="text" />
outputtext
の <f:verbatim>
これにより、開発者はプレーン HTML を JSF コンポーネント ツリーに取り込むことができるため、コーディングから予想されるように「同期して」レンダリングされるようになります。
<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>
ただし、表示中にインライン化されます 建てる 視聴中ではなく、時間内に 与える 時間。これが問題の原因です。ゲッターは、レンダリング応答フェーズではなくビューの復元フェーズ中に呼び出されます。
JSF 1.2 以降、改良されたビュー ハンドラーにより、醜い処理に煩わされることなく、プレーンな HTML を「同期して」インライン化することが可能になりました。 <f:verbatim>
タグ。したがって、もう必要ありません。また、時期尚早のパフォーマンスの最適化が期待できるため、このタグの有用な使用例はもうありませんが、それでも、式言語によって取得される動的データと組み合わせて使用しないでください。
関連する質問:
他のヒント
CommandButtonの即時属性をtrueに設定します。
<h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}" immediate="true" />
その後、ApplyRequestValuesフェーズでメソッドを実行します。
F:Verbatimタグを削除しましたが、今では適切に機能します。なぜこの動作を引き起こしたのかはまだわかりません。