-ELResolver

JspApplicationContextというインターフェイスのドキュメントを読むと、以下の順にJSP標準のELResolverは並びます。

  • javax.servlet.jsp.el.ImplicitObjectELResolver
  • APIを通じて追加したELResolver。追加順に並ぶ(どっちが上?ドキュメントからは不明)
  • javax.el.MapELResolver
  • javax.el.ListELResolver
  • javax.el.ArrayELResolver
  • javax.el.BeanELResolver
  • javax.servlet.jsp.el.ScopedAttributeELResolver

これらは、javax.el.CompositeELResolverに内包されてひとつのELResolverのように見えます。この仕組み、微妙にOGNLと合わない。。。VariableResolverでルートオブジェクトのようにやってくれたJSF1.2だとやりようがあったのですが。。。リストにELResolverを並べて、順に解決できるかを聞いていくという今回の仕様ですが、OGNLは型で適切なPropertyAccessorを探すという作りになっています。たぶん、java.lang.ObjectのPropertyAccessorを上書きして、その上書きAccessorの中にELResolverを並べるイメージになるかな。だと以下の感じ

  • Root implements java.util.Map
    • javax.servlet.jsp.el.ImplicitObjectELResolver
    • APIを通じて追加したELResolver
    • javax.servlet.jsp.el.ScopedAttributeELResolver

上記がルートオブジェクトで、

  • ELResolverPropertyAccessor
    • APIを通じて追加したELResolver
  • OGNLのほかのAccessor

こちらがAccessor。S2ContainerELResolverというものを作ったとすると、Rootのほうでのみ意味があるのですが、どうするかな。MayaのEL仕様として、JSF1.2のVariableResolverのような機能のELResolverしか許さないという手もある。