2012-09-18 6 views
6

this questionに記載されているように、私はバッキングビーン側のフォームでいくつかのフィールド検証を実行しようとします。このため、違反しているフィールドにアクセスしてそのフィールドにマークしたいと思います。コンポーネントバインディングとfindComponent() - どちらを使うか?

  • アクセスのためのバッキングBean内のコンポーネントを格納しbinding属性を経由してJSFページでそれらを使用する:ウェブ検索から はこれを行うには、2つの方法があるように思われます。
  • 使用する標準値がJSFページに結合し、豆からコンポーネントへのアクセスを必要とするとき、私の知る限り、両方の方法は欠点を持って見ることができるようにUIViewRoot.findComponent(String id)

を経由して、それを見て: コンポーネントのバインディングが吹きます変数とgetter/setterを持つBeanをバックする場合、一部のサイトではコンポーネントバインディングの使用を強く推奨していません。いずれにしても、要求範囲が推奨されます。一方、findComponent()はツリーを常にトラバースしますが、これはコストがかかるかもしれません。 (プラス、現時点では私のコンポーネントはまったく見つかりませんが、それは別の問題です)

どのような方法がありますか?これらの交換可能な代替品ですか、そうでない場合は、あなたが選んだ基準に基づいていますか?現在、私はまともな決断をするのに十分な洞察力を持っていません。

+0

[この他のフォーラム](http://www.jguru.com/forums/view.jsp?)に同じ質問があります。EID = 1522894#)、悲しいかな、答えはありません;) – Louise

答えて

8

まず、どちらの選択肢にもかかわらず、どちらも貧弱な方法です。関連項目How does the 'binding' attribute work in JSF? When and how should it be used?

あなたが選択しなければならなかった場合、コンポーネントバインディングは確実に高速で安価です。 UIComponent#findComponent()によって行われたツリースキャンには、パフォーマンス上の影響があります。

実際、要求でなければならないコンポーネントのバインディングを保持するバッキングBeanはスコープが、あなたは簡単に@ManagedPropertyによってその中にビジネスロジックを保持している別のスコープのバッキングBeanを注入できます。

より明確なアプローチは、すべてのコンポーネントバインディングの所有者としてMapを使用することです。あなただけfaces-config.xmlに次のエントリを追加する必要があります。

<managed-bean> 
    <managed-bean-name>components</managed-bean-name> 
    <managed-bean-class>java.util.HashMap</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

これは単なる

<h:inputSome binding="#{components.input1}" /> 
<h:inputSome binding="#{components.input2}" /> 
<h:inputSome binding="#{components.input3}" /> 

そして、これはこの方法であなた

Map<String, UIComponent> components = (Map<String, UIComponent>) externalContext.getRequestMap().get("components"); 

として、他の豆で得ることができるとして使用することができます個々のプロパティ/ getter/setterの指定について心配する必要はありません。上の例では、Mapには、input1input2input3というキーを持つ3つのエントリが含まれ、それぞれがUIComponentのインスタンスを値として持ちます。具体的な質問への


無関係、あなたは(実際には悪いデザインです)アクションメソッドで検証を実行するよりも、他の質問で説明したように、具体的な問題にはるかに簡単な解決策があるかもしれません。私はそこに答えを掲載しました。

+0

通常のプロパティバインダーを使用するのは良い方法ではありません。この場合、コンポーネントバインディングを優先する必要がありますか? – benz

+0

私はそれを暗示するつもりはありませんでした。コンポーネント値のバインディングを使用することをお勧めしますが、これは現在の質問から外れています。 – BalusC

+0

これは正しいです。私は質問し、尋ねると思った。私は別途質問をします。 – benz

関連する問題