前回で、Visual Web JSFプロジェクトの画面にポトペタできるMyStaticTextコンポーネントが完成した。
ただし、他のコンポーネントでは出来ているけどMyStaticTextでは出来ないことがある。
それは、valueプロパティと管理ビーンのプロパティのバインドです。
ためしに、管理ビーンにmessageというプロパティを追加して、valueプロパティとバインドします。
そして管理ビーン側のprerenderで、messageプロパティに値を設定するようにします。
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public void prerender() {
message = "はろうバインド";
}
これを実行すると、なんとも悲しい結果に終わる。
おいおい、EL式そのまま出るのかYO!
ということで、今回はバインディングが出来るようにしてみる。
まず、MyStaticTextTagでEL式が指定されてるときにValueExpressionをコンポーネントにセットしてあげる。
@Override
protected void setProperties(UIComponent component) {
super.setProperties(component);
MyStaticText mst = (MyStaticText) component;
if (value != null) {
Application app = getFacesContext().getApplication();
ExpressionFactory f = app.getExpressionFactory();
ValueExpression ve = f.createValueExpression(getELContext(), value, Object.class);
if (ve != null) {
mst.setValueExpression("value", ve);
} else {
mst.setValue(value);
}
}
if (style != null) {
mst.setStyle(style);
}
}
ApplicationをFacesContextから取得してExpressionFactoryを生成する。
そして、createValueExpressionを呼び出してValueExpressionを生成する。
ValueExpressionが生成されたら、コンポーネントにセットする。
@Override
protected void setProperties(UIComponent component) {
super.setProperties(component);
MyStaticText mst = (MyStaticText) component;
if (value != null) {
// ExpressionFactoryの取得
Application app = getFacesContext().getApplication();
ExpressionFactory f = app.getExpressionFactory();
// valueに指定された値でValueExpressionを作ってみる
ValueExpression ve = f.createValueExpression(getELContext(), value, Object.class);
if (ve != null) {
// ValueExpressionが作れてたら、コンポーネントにvalue(プロパティ名)をキーにして
// 設定する。
mst.setValueExpression("value", ve);
} else {
// ValueExpressionが作れなかったら普通に値を設定する。
mst.setValue(value);
}
}
if (style != null) {
mst.setStyle(style);
}
}
これで、complibを作り直してNetBeansに取り込む。
そして、さっきのプロジェクトを実行すると…
ばっちり表示された。
因みに、我流で調べた方法なので、正しいお作法に従ってるのかは不明…
こうだよ!って情報持ってる人は教えてくださいorz