JSF アプリで ID が重複しているという問題があります。この投稿で、考えられる解決策の 1 つは、ネーミング コンテナーを使用することだと読みました。重複した ID の問題を回避するためにネーミング コンテナを使用する方法の例を教えてください。フェイスレットを使用しています。
2 に答える
これは、JSF1.2とfaceletsを使用して私にとってうまくいったものです:
<ui:composition>
どちらも実際には名前付けコンテナーではないことを発見した<ui:component>
ため、同じコンポーネントを同じフォームで複数回使用すると、重複 ID 例外で失敗します。コンポーネントの全体的なポイントは再利用性であるため、これは悪い設計のように思えます。この問題を回避するために、<f:subview>
各コンポーネント内に a を含め、コンポーネント タグのパラメーターとして id を設定します。
myComponent.xhtml:
<ui:component>
<f:subview id="#{id}">
....component code
</f:subview>
</ui:component>
他のページでの使用は簡単です (taglib.xml と web.xml を正しく設定した後):
<myTagLib:myComponent id="myCompA" />
一歩下がって、重複 ID の問題が発生する理由を調査することをお勧めします。UINamingContainer
根本原因を突き止めたら、独自のコンポーネントを作成するのではなく、「通常の」方法で修正します。
ID の重複エラーにはいくつかの原因が考えられます。これらは、さらに突き止めるのに役立ちます。
- 同じコンポーネント内の異なるで同じID が使用されています。
UIComponent
UINamingContainer
- 物理的に異なるコンポーネントは、同じBeanの同じ
UIComponent
プロパティにバインドされます。 - JSP のみ:インクルードページではなく、親
f:subview
ページで宣言されています。 - 同じインクルード ページが同じコンポーネント内に複数回含まれています。
UINamingContainer
- コンポーネントは、ID が割り当てられていない状態で動的に構築されています (例:
new UIComponent()
) 。
ここでは、 、 、およびUINamingContainer
のそれぞれの下にあります。<h:form>
<h:dataTable>
<f:subview>
上記の提案が役に立たない場合は、質問を更新して、可能な限り最小のコード スニペットを含めます (したがって、無関係なコンポーネント、ライブラリ、HTML/CSS/JS/etc などの無関係なコード/クラッターをすべて含まない)。これにより、まったく同じ問題が再現されます。変更せずにコピーして貼り付けて実行するだけです。