10

現在、JSFアプリケーションのパフォーマンスを調査しています。renderがfalseに設定されていても、コードが実行されていることに気づきました。たとえば、次のコードを考えてみましょう。

<h:panelGroup rendered="#{bean.render}">
    <my composite component here/>
</h:panelGroup>    

#{bean.render}がfalseを返しても、デバッグログから、複合コンポーネントのコードがレンダリングフェーズ中に実行されていることがはっきりとわかります。また、#{bean.render}が呼び出される前にコードが実行されているようです。クライアントに返されるHTMLにはレンダリングされませんが、サーバーがコードを実行しているように見えます。

誰かがこれを説明できますか?

ありがとう。

4

2 に答える 2

10

複合コンポーネントは、レンダリング応答フェーズ中に構築されます。JSFは、最初にコンポーネントツリーにデータを入力してから、コンポーネントツリーに基づいてHTMLを生成する必要があります。ビューのビルド時に評価する必要があるいくつかのBeanプロパティを参照しているように見える複合コンポーネント内にいます。

renderedレンダリングではなく複合コンポーネントのビルドを条件付きで制御する場合は、属性の代わりに条件付きビューのビルドタイムタグを使用する必要があります。JSTLはそのための<c:if><c:choose>を提供します。

<c:if test="#{bean.build}">
    <my:composite />
</c:if>

参照:

于 2012-12-15T13:17:48.477 に答える
1

Jsfは、コンポーネントがレンダリングされているか無効になっているかなどを知る必要があります。クリント側に表示されるdisabled="false"とすると、クライアントによってjavascriptが無効になっている場合でも、クライアントは値を変更してフォームを送信できますが、jsfはサーバー側で無効になっているfalseまたはtrueをチェックします。それがtrueの場合、それは受け入れられず、rendered = "false"と同じように、jsfのプロセス検証フェーズのためにBeanに到達することはありません。

于 2012-12-14T21:27:26.443 に答える