JSF 拡張ポイント - VariableResolver | 変数の名前解決
2009/06/24 14:19Update
JSFでは、VariableResolverという仕組みでBeanの名前からオブジェクトを取得する機能を提供します。
例えば、
JSP:
<h:inputText value="#{myBean.userId}" id="userId" />
#{myBean.userId}はJSF-ELで、myBeanという名前のオブジェクトを取得するには、VariableResolverを利用します。
VariableResolverの実装クラスは、上のjavax.faces.el.VariableResolver abstractクラスを実装する必要があります。
MyFacesの VariableResolver実装:
org.apache.myfaces.el.VariableResolverImpl
Sun JSFの VariableResolver実装:
com.sun.faces.el.VariableResolverImpl
MyFacesなどのJSF実装では、デフォルトでVariableResolver実装を提供していますが、
自前のカスタムVariableResolverクラスを利用したい場合、次の手順でできます。
1)javax.faces.lifecycle.Lifecycleを実装したクラスを定義します。
※MyFacesライブラリを利用する場合のサンプルです。
※javax.faces.el.VariableResolverから直接継承してもよいのですが、今度はVariableResolverを実装したorg.apache.myfaces.el.VariableResolverImplから継承します。
2)faces-config.xmlにカスタムカスタムVariableResolverクラスを登録します。
faces-config.xml
.
JSP:
<h:inputText value="#{myBean.userId}" id="userId" />
#{myBean.userId}はJSF-ELで、myBeanという名前のオブジェクトを取得するには、VariableResolverを利用します。
package javax.faces.el;
public abstract class VariableResolver
{
public VariableResolver()
{
}
public abstract Object resolveVariable(FacesContext facesContext, String name)
throws EvaluationException;
}
VariableResolverの実装クラスは、上のjavax.faces.el.VariableResolver abstractクラスを実装する必要があります。
MyFacesの VariableResolver実装:
org.apache.myfaces.el.VariableResolverImpl
Sun JSFの VariableResolver実装:
com.sun.faces.el.VariableResolverImpl
MyFacesなどのJSF実装では、デフォルトでVariableResolver実装を提供していますが、
自前のカスタムVariableResolverクラスを利用したい場合、次の手順でできます。
1)javax.faces.lifecycle.Lifecycleを実装したクラスを定義します。
package mypackage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
public class VariableResolverImpl extends
org.apache.myfaces.el.VariableResolverImpl {
private static final String ERROR_FLAG = "error";
private static final String EXCEPTION_TYPE = "exception";
@Override
public Object resolveVariable(FacesContext facesContext, String name) {
try {
//ログ処理…
//名前からオブジェクトを取得
return super.resolveVariable(facesContext, name);
} catch (Throwable e) {
//Exception処理
HttpServletRequest request = (HttpServletRequest)facesContext.getExternalContext().getRequest();
request.setAttribute(ERROR_FLAG, Boolean.TRUE);
request.setAttribute(EXCEPTION_TYPE, e);
throw new RuntimeException(e);
}
}
}
※MyFacesライブラリを利用する場合のサンプルです。
※javax.faces.el.VariableResolverから直接継承してもよいのですが、今度はVariableResolverを実装したorg.apache.myfaces.el.VariableResolverImplから継承します。
2)faces-config.xmlにカスタムカスタムVariableResolverクラスを登録します。
faces-config.xml
<faces-config> <!-- 抜粋 --> <application> <variable-resolver>mypackage.VariableResolverImpl</variable-resolver> </application> <!-- other configuration here --> </faces-config>
.
Sponsored Link
- Relative Articles
- JSFプロジェクト階層構造例 - (2009/06/20 16:39)
- JSFのインストール - 初めてのJSFアプリ作成・実行 - (2009/06/23 16:24)
- ライフサイクルから理解するJSFの仕組み - (2009/06/24 17:43)
- JSF開発におけるweb.xmlの基本的な設定方法 - (2009/03/13 18:13)
- JSF Webページ(JSP)の基本的な書き方 - (2009/03/16 11:58)
- JSF Managed-Beanの定義・設定・使い方 - (2009/03/16 14:48)
- JSF メッセージ処理 概要 - (2009/06/20 20:01)
- JSF Validator入門 - 標準Validator及びその使い方 - (2009/06/22 18:26)
- JSF Converter入門 - 標準Converter及びその使い方 - (2009/06/23 17:17)
- JSF画面遷移 - (2009/06/24 18:08)