ここに2つのアプローチがあります。
1)タブごとに1ページを使用します。p:tabMenuコンポーネント(primefaces 3.4で使用可能)を使用します。この場合、ユーザーが1つのタブを表示していて、2番目のタブをクリックして表示すると、別のページにリダイレクトされます。
長所:別のページから2番目のタブに移動する場合は、別のページであるため簡単です(2番目のアプローチの短所を参照)。また、各タブページには1つのタブのコードしか含まれていないため、読み込みが高速です。コードをより適切に分離できます。
短所:ユーザーが別のタブに移動すると、現在のタブに入力されたすべてのデータが失われます。また、ナビゲーションが含まれるため、あるタブから別のタブへの変更はそれほど速くありません。
これは1つのタブ(tab1.xhtml)のページです。
<h:body>
<p:tabMenu activeIndex="0">
<p:menuitem value="Tab 1" url="/tab1.jsf" />
<p:menuitem value="Tab 2" url="/tab2.jsf" />
</p:tabMenu>
<!-- content of tab1 goes here -->
</h:body>
これは他のタブ(tab2.xhtml)のコードです:
<h:body>
<p:tabMenu activeIndex="1">
<p:menuitem value="Tab 1" url="/tab1.jsf" />
<p:menuitem value="Tab 2" url="/tab2.jsf" />
</p:tabMenu>
<!-- content of tab2 goes here -->
</h:body>
2)もう1つのアプローチは、p:tabViewを使用して1つのページを作成することです。この場合、すべてのタブの内容が同じページに表示されます。p:tabViewのdynamic = "true"属性を使用して、タブのコンテンツをオンデマンドでレンダリングし、ページの読み込みを高速化できます。
長所:タブからタブへのスムーズな移行(常に同じページにとどまります)。
短所:たとえば、2番目のタブに直接移動したい場合、それはそれほど簡単ではありません。したがって、最初のタブを処理するマネージドBeanの属性を指すtabViewのactiveIndex属性を使用する必要があります。それでも、実際には必要ない場合は、最初のタブのBeanを作成します。
これは、タブを含むメインページのコードです。
<h:body>
<p:tabView dynamic="true">
<p:tab id="tab1" title="Tab 1" >
<ui:include src="tab2.xhtml" />
</p:tabView>
<p:tab id="tab2" title="Tab 2" >
<ui:include src="tab2.xhtml" />
</p:tab>
</p:tabView>
</h:body>
そして、(メインページに挿入されている)各タブのページが必要になります:tab1.xhtml:
tab2.xhtml: