Java EE 6 でアプリケーションを作成し、ユーザー インターフェイスに Primefaces 3.4.1 を使用しています。
私はそのようなものを持っています。
genericPage.xhtml
<ui:composition template="mainApplicationTemplate.xhtml" [...]>
<p:tabView id="tabView" dynamic="false"cache="false">
<p:tab id="tab1" title="Tab 1">
<h:form id="form1">
...
</h:form>
</p:tab>
<p:tab id="tab1" title="Tab 1">
<h:form id="form2">
...
</h:form>
</p:tab>
</p:tabView>
<ui:composition >
child1.xml
<ui:composition template="genericPage.xhtml" ...>
<ui:param name="actionBean" value="#{actionBeanA}"/>
</ui:compisition>
child2.xml
<ui:composition template="genericPage.xhtml" ...>
<ui:param name="actionBean" value="#{actionBeanB}"/>
</ui:compisition>
その背後にある考え方は、child1.xhtml と child2.xhtml が同じ jsf コードを共有し、すべてが genericPage.xhtml に含まれているが、バックエンド Bean が異なる (「actionBean」によってパラメータ化されている) ということです。
これまでのところ、それは非常にうまく機能しています。<p:ajax/>
要素内に ui パラメータを入れると複雑になります。
バックエンド Bean から、アクティブなタブをプログラムで更新し、他のタブはそのままにしておく必要があります。そのためには、アクティブなタブをアクション Bean に格納する必要があります。特定の外部イベントが発生すると、アクション Bean はアクティブなタブを更新します。
その他の要因により、次の点に注意してください。
dynamic="true"
で設定できませんtabView
- の周りにグローバル フォーム
tabView
を配置できないため、「activeIndex」プロパティ (アプリケーションの別の部分で行っている) を使用してアクティブなタブを管理することはできません。
私がしたいこと
この問題を解決するには、要素のtabChange
イベントを使用します。tabView
<p:tabView id="tabView" dynamic="false"cache="false">
<p:ajax event="tabChange" listener="#{actionBean.listen}"
<p:tab id="tab1" title="Tab 1">
<h:form id="form1">
...
</h:form>
</p:tab>
<p:tab id="tab1" title="Tab 1">
<h:form id="form2">
...
</h:form>
</p:tab>
</p:tabView>
アクションビーン
@Named
@WindowScoped
public class ActionBeanA implements Serializable{
public void listen(TabChangeEvent event){
...
}
}
うまくいかないこと
私がそれをすると、エラーが発生します
Target Unreachable, identifier 'actionBean' resolved to null: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'actionBean' resolved to null
これは、<p:ajax>
要素がアクション Bean に渡されていないため、何が何であるかがわからないことを示しているようactionBean
です。
ただし、そのようなリスナーメソッドのシグネチャを変更すると
<p:ajax event="tabChange" listener="#{actionBean.listen(anything)}"
バックエンド Bean を次のように変更します。
public void listen(TabChangeEvent event){
System.out.println(event.toString());
}
そうすることで、ターゲットに到達できないエラーは発生しませんが、listen メソッドで null ポインター例外が発生します (「何か」に値を割り当てていないため)。これは、この場合、<p:ajax/>
要素が何が何でactionBean
あるかを認識しており、Bean でメソッドを呼び出すことができていることを示しています。
質問
どうすればこの問題を回避できますか? タブ変更イベントで、バックエンド Bean に新しいアクティブなタブを送信できるようにしたいと考えています。