PilikaでのEL式ではRubyの関数が使えます

ちょうどタイムリーなエントリーがありましたので便乗ネタです。

PilikaはJavaで実装しているテンプレートエンジンですが、JSPの式言語と同じようにして変数を埋め込むことができます。

<p>${title}</p>

ここまではよくあるパターンです。

Expressionで重要なのは、Expression#evaluate(VariableResolver, FunctionMapper, Logger)のメソッド。VariableResolverを使って、式の中の変数を解決します。JSPのファンクションを解決するのが、FunctionMapperです。JSPのファンクションといっても実態は、public staticな任意のメソッドを呼び出すことができます。

http://d.hatena.ne.jp/higayasuo/20090117/1232180810

ひがさんのエントリーで書かれているように、commons-elではpublic staticなメソッドを呼び出すことも可能ですが、これはあくまでJavaの世界の話になります。これをJava以外の言語の関数も呼び出せるようになったらもっと面白くなります。

Pilikaではこの辺りをJSR-223のスクリプト言語サポートの機能を最大限に生かし、JRuby上で動くRailsのView層として使用できるだけでなく、RubyやGroovyなどの関数を呼び出せるように実装しています。すべてJavaで実装されるWebアプリケーションではあまり意味のない事に思えます。ですが、JRuby on RailsでWebアプリケーションを作る場合、Viewのヘルパ関数はRubyで書きたいとなるでしょう。また、Viewはウェブデザイナーが作成するという場合、ウェブデザイナーが習得しているスクリプト言語、例えばJavaScriptでヘルパ関数を定義できるというのは大きなメリットになると考えています。

例えば、次のような記述ができます。

<p>foo関数の実行結果は、${foo(name)}です。</p>
<plk:def language="groovy" type="function" name="foo(bar)" >
<![CDATA[
def foo(bar) {
  return 'abc';
}
]]>
</plk:def>

JRuby on Railsで実行した場合、JRuby上でRubyスクリプトが実行され、そこからJavaのテンプレートエンジンが呼び出され、さらにGroovyのスクリプトが実行され、レンダリングされる、という状況です。

スクリプト言語サポートは可能性で満ちていますね。