GAE/J で Apache Velocity は動く

わたしにとってGAE/Jをガンガン使えるか否かは、Apache Velocityが動くかどうかに強く依存しています。

他のテンプレートエンジンを触ったことないし、JSPは絶対イヤだからです。

Will it play in App Engine – Google App Engine for Java | Google GroupsにはVelocityのことは書かれていてない(2009年10月30日現在)。

結論から言うとGAE/JでVelocityは動きます。すでに動かしちゃってる先人の方もいらっしゃる様です。

ちょっと安心です。

GAEにデプロイしたサンプルはこちら

http://tdtsh-blog.appspot.com/velocity/top.vm


インストール手順

今個人的に使っているのは、velocity-1.4 と velocity-tools-1.1 なんですが、この際だから最新にしちゃいます。

Downloads – Apache Velocity Siteから、

velocity-1.6.2.zip

velocity-tools-1.4.zip

をダウンロードします。

ダウンロードした2つのzipをローカルのどっかに解凍します。

解凍したディレクトリから、jarファイルを、eclipseのプロジェクトのwar/WEB-INF/lib/にコピーします。

velocity-1.6.2\velocity-1.6.2.jar

velocity-tools-1.4\lib\velocity-tools-1.4.jar

ここまでで実行すると、依存性が解決できずに (org.apache.commons達) Exceptionはきまくりでした。

細かい依存性の管理については後回しにして、velocity-tools-1.4\lib\ の下の、commons-* を片っ端からeclipseのプロジェクトのwar/WEB-INF/lib/にコピーしました。

こいつらです。

commons-beanutils-1.7.0.jar

commons-chain-1.1.jar

commons-collections-3.2.jar

commons-digester-1.8.jar

commons-lang-2.2.jar

commons-logging-1.1.jar

commons-validator-1.3.1.jar

最終的に、依存性は maven で管理したいなぁ、と思います。


動かしてみる

先ずは、クラス my.package.VelocityServlet として、org.apache.velocity.tools.view.servlet.VelocityViewServlet を拡張してクラスを作ります。とりあえずは何も実装しなくていいです。

war/WEB-INF/web.xmlを修正して、こんな感じにしました。

<servlet>
    <servlet-name>velocity</servlet-name>
    <servlet-class> 
        my.package.VelocityServlet
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>velocity</servlet-name>
    <url-pattern>/velocity/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>velocity</servlet-name>
    <url-pattern>*.vm</url-pattern>
</servlet-mapping>

それから、VMファイルはサーブレットからアクセス出来る必要があるので、war/WEB-INF/appengine-web.xmlを修正して、リソースファイルとして設定しておきます。今回はこんな感じにしました。

<resource-files>
    <include path="/velocity/*" />
</resource-files>

war/velocityディレクトリを作成し、その中に test.vm ファイルを作成します。

中身はなんでもいいんですが、簡単にテストする方法としては、VTLでのコメントを書けばいいです。

<html>
<body>
    <h1>Test VelocityServlet</h1>
    ## if you see this message, VelocityViewServlet might not work.
</body>
</html>

http://localhost:8080/velocity/test.vm にアクセスします。

404エラーや500エラーなら、何かの設定が間違っています。

if you see… が表示されたなら、静的ファイルとして読まれているかもしれません。

(VelocityViewServletがリクエストを正しく処理していれば、if you see… の部分は見えません)

今回は、VM_global_library.vm とか velocity.properties のことには触れていないけど、リソースファイルとして配備すればもちろん使えます。encodingをきちんと設定すれば、日本語もちゃんと使えます。