Develop with pleasure!

福岡でCloudとかBlockchainとか。

VelocityからFreeMarkerへ

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

ググる

  1. FreeMarker
  2. JSP
  3. Velocity

という結果を発見したが今回の実験結果では、

  • Velocity
Average Min Max
39 31 147
  • FreeMarker
Average Min Max
45 31 147

といった感じで、Velocityの方が速かった。(MinとMaxは一緒だけど…。)何回か行ったが大体同じくらいかVelocityが数ms速いといったところだ。まぁ、単純なページの表示なので一概にどうのとは決め付けられないが。