質問

次のページがあります。

<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タグを削除しましたが、今では適切に機能します。なぜこの動作を引き起こしたのかはまだわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top