JSFをちゃんとやってれば当たり前の事かもしれないけど、ページフラグメントのプロパティにアクセスする方法を・・・。
まず、適当にページフラグメントを作ってみた。
タイトルっぽいStaticTextとAlert(警告)コンポーネントを置いてみた。Alertコンポーネントは、typeプロパティの種類だけ用意してみた。
そして、各々のAlertコンポーネントのsummaryプロパティにバインドするためのプロパティをHeaderFragmentに用意する。
private String errorMessage;
private String warnMessage;
private String infoMessage;
private String successMessage;
// getter/setterは省略
これで、プロパティに値が設定されるとメッセージが格好良く表示されるっていう寸法だ。
ただ、問題はページフラグメントを置いただけだと、このHeaderFragmentクラスにアクセスする手段は提供されないということだ。
今までは、泣く泣くメッセージグループコンポーネントで無愛想なメッセージを出していた。
さて、本題のHeaderFragmentにアクセスするにはは、HeaderFragmentを配置した管理ビーンで下のようにコーディングすればOK。
HeaderFragment headerFragment = (HeaderFragment) getBean(HeaderFragment.class.getSimpleName());
生のJSFのAPIを使って書くとすれば、こんな感じになる。
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elc = facesContext.getELContext();
Application application = facesContext.getApplication();
ELResolver resolver = application.getELResolver();
HeaderFragment headerFragment = (HeaderFragment) resolver.getValue(elc, null, HeaderFragment.class.getSimpleName());
要は、ページフラグメントとして作成したクラスもfaces-config.xmlに登録された、ただの管理ビーンなので普通に取得しちゃえばよかったというだけでした。
なので、下のような感じでfaces-config.xmlに追加されたページフラグメントを使う場合は
<managed-bean>
<managed-bean-name>HeaderFragment</managed-bean-name>
<managed-bean-class>作成したヘッダーフラグメントのクラス</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
こんな感じでfaces-config.xmlを使ってDIしてやるのもありっぽい。
<managed-property>
<property-name>何かのプロパティ</property-name>
<value>#{HeaderFragment}</value>
</managed-property>
Visual Web JSFのプロジェクトでfaces-config.xmlを生でいじるのはどうだろう?という感じもするけど、時と場合によっては有効だろう。
個人的には、下のようなユーテリティクラスを作ってお茶を濁すかな。
package com.wankuma.kazuki.jsf.utils;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
/**
* VisualWeb JavaServer Facesプロジェクトの管理ビーンで使うユーテリティクラス。
* @author Kazuki
*/
public final class MBeanUtils {
private MBeanUtils() {}
/**
* faces-config.xmlに定義されたクラスの中から引数で指定したクラスのインスタンスを取得する。
* @param <T> 取得するクラスの型
* @param clazz 取得するクラス
* @return faces-config.xmlに定義されたクラスのインスタンス
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> clazz) {
FacesContext fc = FacesContext.getCurrentInstance();
if (fc == null) {
throw new IllegalStateException("FacesContextが取得できませんでした");
}
Application app = fc.getApplication();
return (T) app.getELResolver().getValue(fc.getELContext(), null, clazz.getSimpleName());
}
}
因みに、実験で作ったアプリの実行画面は下のような感じ。
上の絵は全部出してやんよ!ボタンを押したときのものです。
個別のボタンを押すと、そのメッセージだけ表示されます。