少し問題が発生しました。
c:forEach タグを介して文字列のリストを反復処理し、facelets の include タグを介してそれらを含めることにより、ビューを動的に生成します。
これは、レイアウトの構築には問題なく機能しますが、奇妙な動作を示します。
2 つのタブを含むプライムフェイスのタブビューがあります。最初のタブ (最初に表示されるもの) では、コンポーネント ID が設定されています (例: tabview:categoryTab) が、たとえば 2 番目のタブではそうではありません。ここでは、コンポーネント ID に対してのみ tabview: を取得します (ただし、実際にはtabview:usrTab である)
JSF が 2 番目のタブに設定した ID をオーバーライドするのはなぜですか? 仕様からいくつかの重要な情報が抜けていますか?
私は Primefaces 3.6 (スナップショット ビルド) で JSF 2 を使用します (はい、意図的にスナップショット ビルドを使用し、これを安定した PF リリースでもテストしましたが、同じ動作が発生します)。
編集
コード: admin.xhtml
<ui:composition template="/templates/commonLayout.xhtml">
<ui:define name="content">
<p:panel id="parentPanel">
<h:outputText value="Verwaltung" />
<br />
<p:tabView id="tabview">
<!-- insert marker -->
<c:forEach items="#{adminTabs}" var="tab">
<ui:include src="#{tab}" />
</c:forEach>
</p:tabView>
</p:panel>
</ui:define>
</ui:composition>
catTab.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<p:tab title="Categories Tab" id="catTab">
....
</p:tab>
</ui:composition>
usrTab.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<p:tab title="Users Tab" id="usrTab">
....
</p:tab>
</ui:composition>
testTab.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<p:tab title="TestTab" id="testTab">
....
</p:tab>
</ui:composition>
ContentProvider.java
public class ContentProvider {
....
@Produces
@Named("adminTabs")
public List<String> getTabs(){
List<String> components = new ArrayList<String>();
components.add("/templates/tabs/catTab.xhtml");
components.add("/templates/tabs/usrTab.xhtml");
components.add("/templates/tabs/testTab.xhtml");
return components;
}
....
}
これが生成されます:
<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" role="tablist">
<li class="ui-state-default ui-tabs-selected ui-state-active ui-corner-top" aria-expanded="true" role="tab">
<a href="#tabview:catTab">Categories</a>
</li>
<li class="ui-state-default ui-corner-top" aria-expanded="false" role="tab">
<a href="#tabview:j_idt31">TestTab</a>
</li>
<li class="ui-state-default ui-corner-top" aria-expanded="false" role="tab">
<a href="#tabview:j_idt32">Benutzer und Rollen</a>
</li>
</ul>
繰り返しになりますが、最初のタブの ID のみが保持され、他のタブの ID は xhtml コードで設定されているにもかかわらず生成されます...