JSF 拡張ポイント - VariableResolver | 変数の名前解決

2009/06/24 14:19Update
TAGS: JSF | 拡張 | 変数 | VariableResolver

JSFでは、VariableResolverという仕組みでBeanの名前からオブジェクトを取得する機能を提供します。

例えば、
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>

.

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments