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をきちんと設定すれば、日本語もちゃんと使えます。