2

次のページがあります。

<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 を使用しています。

前もって感謝します

4

3 に答える 3

6

このトピックに関するあなた自身の答えによると:

f:verbatim タグを削除したところ、適切に機能するようになりました。なぜこの動作が発生したのかはまだわかりません。

<f:verbatim>、プレーンな HTML を JSF コンポーネント ツリーに含めることを唯一の目的として、ずっと前に 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 以降、改善されたビュー ハンドラーにより、見苦しい<f:verbatim>タグを使用することなく、プレーンな HTML を「同期して」インライン化することが可能になりました。だから、もう必要ありません。また、時期尚早のパフォーマンスの最適化を期待して、タグの有用な使用例ももうありませんが、それでも、式言語によって取得される動的データと組み合わせて使用​​しないでください。

関連する質問:

于 2010-12-24T15:47:04.267 に答える
0

commandButton に true に設定された immediate 属性を配置します。

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

次に、ApplyRequestValues フェーズでメソッドを実行します。

于 2010-12-21T18:16:27.697 に答える
0

f:verbatim タグを削除したところ、適切に機能するようになりました。なぜこの動作が発生したのかはまだわかりません。

于 2010-12-23T12:39:31.083 に答える