5

ページで使用されているすべてのBeanが、ページの小さな部分を更新するときに不必要にインスタンス化されていることに気づきました。OK、それらはリクエストスコープであるため、すべてのリクエストでインスタンス化されますが、更新されているページのその部分でそれらのBeanが必要な場合にのみ実行する必要があります。ではない ?

なぜJSFでこの悪い設計なのですか?

アップデート:

この動作を引き起こしている本当の原因を見つけましたf:event type="preRenderView"。Webページの特定の場所にありました。これにより、実際には、リスナーを呼び出すためにこれらのBeanが再インスタンス化されました。修正はf:event type="preRenderComponent"代わりに使用することでした。これにより、各リクエストでの不要なBeanのインスタンス化のほとんどが減少しましたが、それでもいくつかの不要なBeanのインスタンス化が見られます。

4

2 に答える 2

4

このような場合、Beanは、ビューの構築に関与している場合にのみ構築されます(読み取り:そのプロパティの1つは、タグハンドラーの属性またはUIコンポーネントのidor属性で参照されます)。bindingそうでなければ、それは構築されません。少なくとも、JSFビューを「通常の方法」で設計する場合、Mojarra 2.1.11(および2.0.0ではない)で問題を再現することはできません。

ビューを部分的に構築することはできませんが、その状態を部分的に保存および復元したり、UIコンポーネントツリーを部分的にレンダリングしたりすることはできます。

あなたの「JSFの悪いデザイン」の苦情には議論の余地がありません。

参照:

于 2012-07-23T21:56:58.423 に答える
2

うまくいけば、私はあなたの質問を正しく解釈しました!

ページはフォームによって送信されているため、コンポーネントツリーが初めて取得または構築されます(JSFライフサイクルの最初のステップ)。

コンポーネントツリーは、現在表示しているビューだけでなく、すべてで構成されています。

したがって、リクエストスコープBeanのいずれかにバインドされているJSFコンポーネントは、このフェーズでインスタンス化されます。

この良い例はtabViewです。それぞれが異なるページにバインドされ、それぞれが対応するリクエストスコープのバッキングBeanにバインドされている4つのタブを持つtabViewを想像してみてください。

すべてのタブが同時に表示されるわけではありませんが、それらはすべてコンポーネントツリーの一部であるため、ブレークポイントを設定すると、リクエストフェーズの各ページでBeanがインスタンス化されるのがわかります。

于 2012-07-24T16:09:57.433 に答える