Struts2に触れるまでFreeMarkerというテンプレートエンジンが存在したことを知らなかった。いろいろググってみると、Velocityよりも機能的に洗練されてそうなので、ViewコンポーネントをVelocityからFreeMarkerへ変更してみた。基本的に、ActionのResultTypeは未定義でデフォルト値を使用しているので、
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult" default="true"/> ↓ <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult" default="true"/>
に変更。
Viewのファイル自体はまだあまり手をつけていない&、${}による動的な値の表示のみだったのでそんなに大変でもなく。
基本的にはこれで動作するが、テンプレートファイルの配置場所がWEB-INF以外のローカルディスクだったので、テンプレートファイルの場所を指定する必要がある。Velocityの場合は、velocity.propertiesに
# TEMPLATE LOADERS SETTINGS resource.loader = file file.resource.loader.description = Velocity File Resource Loader file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader file.resource.loader.path = C:/hoge/template file.resource.loader.cache = false file.resource.loader.modificationCheckInterval = 2
とか設定しておけば良かったが、FreeMarkerの場合は、テンプレートファイルのパスをServletContextから取得するため、web.xmlに
<context-param> <param-name>templatePath</param-name> <param-value>C:/hoge/template</param-value> </context-param>
といった感じでパスを定義する必要がある。ちなみにパラメータ名は、「templatePath」もしくは、「TemplatePath」のいずれかとのこと。これで、Velocityと同様ローカルリソースからテンプレートファイルの読み込みが可能になる。
実際に、性能はどうなのかJMeterで負荷をかけ、動的に変化する文字列を画面に表示するといった画面の描画速度を測定してみた。環境は、
- マシンスペック
CPU 2GHz Core2duo
メモリ 3GB
- バージョン
JDK 1.5.0_08
FreeMarker 2.3.8
Velocity 1.5
ググると
- FreeMarker
- JSP
- Velocity
という結果を発見したが今回の実験結果では、
- Velocity
Average | Min | Max |
---|---|---|
39 | 31 | 147 |
- FreeMarker
Average | Min | Max |
---|---|---|
45 | 31 | 147 |
といった感じで、Velocityの方が速かった。(MinとMaxは一緒だけど…。)何回か行ったが大体同じくらいかVelocityが数ms速いといったところだ。まぁ、単純なページの表示なので一概にどうのとは決め付けられないが。