重量級のフレームワークはGAE/J上でspin-upの速度が遅い。JDOでDatastoreを操作してもsipn-upが遅い。その上トランザクションの要件を満たそうと思うと、難易度が高い。
App Engineではどの言語を使えばいいのか – ひがやすを blog
悩んだ挙句、オレオレフレームワークを捨て、Slim3に移行する事に決めました。
でもやはり、toCのWEB屋にとってJSPはキツイ。
保守フェーズ(運営)は主にエディターとかWEBデザイナとかが担う訳でして、彼らが扱いやすいVelocityが使いたい訳です。慣れてるし。
多少の性能ダウンは覚悟で、slim3 と Velocityと連携させます。
まぁvmファイルの数が少ない内はVelocityも早いですし。
GAE/Jのロードマップ上、スピンダウン/スピンアップの回避が出来る方法が提供されるかも知れない様ですから、それにちょっと期待します。
最初の方は、基本的に、スタートガイド (Slim3 日本語サイト(非公式))に書いている事と同じです。
eclipseは日本語化された3.4を使用し、Google Plugin for Eclipse や Google App Engine JAVA SDKのインストールは終わっているものとします。
因みにOSはWindowsでJDKは6u17です。
slim3ブランクプロジェクトのインストール
- Downloads – slim3 – Project Hosting on Google Codeより、最新バージョンのSlim3ブランクプロジェクト(2010-04-13時点ではslim3-blank-1.0.1.zip)をダウンロードする
- ダウンロードしたzipファイル(slim3-blank-X.X.X.zip ※Xは可変)を解凍する
- 解凍したslim3-blankをeclipseのワークスペースにインポートする為に、eclipseを起動する
- [ファイル(F)] – [インポート(I)] をクリックする
- [一般] – [既存プロジェクトをワークスペースへ]を選択し[次へ(N)]クリックする
- [ルート・ディレクトリーの選択(T)]にて、先ほど解凍したslim3-blankディレクトリを指定し、[終了(F)]をクリックする
Eclipseの設定
- [ウィンドウ(W)] – [設定(P)]をクリックする
- 設定の左ペインより、[Java] – [コード・スタイル] – [インポートの編成]をクリックする
- [.* (例 ‘java.lang.Math.*) に必要な静的インポート数(S)]に1を設定し、[適用(A)]をクリックする
- 設定の左ペインより、[Java] – [エディター] – [コンテンツ・アシスト] – [お気に入り] をクリックする
- [新規タイプ(T)]ボタンをクリックする
- [新規型お気に入り]にて、下記を追加し、[適用(A)]をクリックする
- org.hamcrest.CoreMatchers
- org.junit.Assert
- org.junit.matchers.JUnitMatchers
- 設定の左ペインより、[一般] – [ワークスペース]をクリックする
- [自動的にリフレッシュ®]にチェックを入れ、[OK]をクリックする
libにあるslim3-gen-xxx.jarをアノテーション処理のファクトリパスに追加
- パッケージ・エクスプローラにてslim3-blankプロジェクトを選択する
- [プロジェクト(P)] – [プロパティー(P)]をクリックする
- [Javaコンパイラー] – [注釈処理] – [ファクトリーパス]をクリックする
- [JAR の追加(J)]をクリックする
- [JARの選択]ダイアログにて、[slim3-blank] – [lib] – [slim3-gen-1.0.1.jar]を選択し、[OK]をクリックする
- [OK]をクリックする
ブランクプロジェクトの実行
- パッケージ・エクスプローラにてslim3-blankプロジェクトを選択し、右クリックする
- [実行®] – [Webアプリケーション]をクリックする
プロジェクト名を好みの名前にリネーム
- パッケージ・エクスプローラにてslim3-blankプロジェクトを選択し、右クリックする
- [リファクタリング(T)] – [名前変更(N)]
- [Javaプロジェクト名の変更]にて、新しい名前を入力する
slim3.rootPackageの変更
war/WEB-INF/web.xml を編集する。
<context-param> <param-name>slim3.rootPackage</param-name> <param-value>slim3</param-value> </context-param> ↓ <context-param> <param-name>slim3.rootPackage</param-name> <param-value>my.package</param-value> </context-param>
Velocityのインストール
詳細は、先日書いた手順を参照ください。
- ライブラリをWEB-INF/lib/にコピー
- velocity-1.6.2.jar
- velocity-tools-1.4.jar
- ビルドパスに追加
- web.xml追記
<servlet> <servlet-name>velocity</servlet-name> <servlet-class> my.package.control.VelocityServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>velocity</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping>
Velocityの依存性を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
Velocity設定ファイルをコピー
以下をwar/WEB/INF/にコピーする。
VM_global_library.vm velocity.properties
appengine-web.xmlに静的ファイルとか追記
<static-files> <include path="/asis/**" /> <include path="/css/**" /> <include path="/images/**" /> <include path="**.js" /> <include path="**.css" /> <include path="**.png" /> <include path="**.jpg" /> <include path="**.jpeg" /> <include path="**.swf" /> <include path="**.gif" /> <include path="**.ico" /> <include path="**.html" /> </static-files> <resource-files> <include path="**.jsp" /> <include path="**.vm" /> </resource-files>
Controllerクラスの作成
StrutsでいうActionクラスみたいなモンですが、設定ファイルが要りません。
1URL:1クラスで、URLのパスとクラスパスを対応させています。
- パッケージ・エクスプローラにてプロジェクト直下の build.xml をダブルクリックする
右側のアウトライン・ビューにて、[gen-controller-without-view]タスクを右クリックする。
gen-controllerとの違いは、*.jspを生成しないこと。Velocoty使うのでjsp要らないので。
[実行®] – [1 Ant ビルド Alt+Shift+X, Q] (1番目の項目) をクリックする
[Ant Input Request]にて、”/hoge/”と入力する
下記ファイルが生成されている事を確認する。
- src/my/package/controller/hoge/IndexController.java
- test/my/package/controller/hoge/IndexControllerTest.java
IndexController を編集して、forward先を”index.vm”に変更する
war/hoge/index.vm を作成する。(VTLが使える)
Controllerの処理結果をVelocity(VTL)に受け渡して表示するには
Controller側に用意されている、各スコープ(Application/Session/Request)のattributeに値を設定するメソッド
- requestScope()
- sessionScope()
- applicationScope()
の内、requestScope()を利用します。
注意点として、Antタスクgen-controller生成されたControllerのJavaソースファイルは、
Windows XP + eclipse 3.4の環境ではファイルエンコーディングがsjisになる。
下記の様にマルチバイトの文字列をハードコードする際には、ブラウザで表示する際の文字エンコーディングにあわせて、Controllerクラスのファイルエンコーディングを適宜変換 (utf-8などに) しておかないと文字化けする。
public class IndexController extends Controller { @Override public Navigation run() throws Exception { String message = "Controllerからのメッセージです"; requestScope("message", message); return forward("index.vm"); } }
VelocityServletの子クラス側で、RequestからAttributeの値を取り出し、VelocityのContextにセットする。
protected Template handleRequest(HttpServletRequest req, HttpServletResponse res, Context ctx) throws Exception { String templateName = "index.vm"; ctx.put("message", req.getAttribute("message")); return getTemplate(templateName); }
最終的に、index.vm 側で出力出来るようになります。
<p>$message</p>
log4j設定
Velocityの依存性をwar/WEB-INF/lib/にコピーし、ビルドパスに追加する。
log4j-1.2.15.jar apache-log4j-extras-1.0.jar
src/log4.properties を編集する
log4j.rootLogger=INFO, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.encoding=UTF-8 log4j.appender.A1.layout=org.apache.log4j.EnhancedPatternLayout log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}{Asia/Tokyo} %-5p [%F:%L] - %m%n log4j.logger.org.apache.velocity=WARN,A1 log4j.logger.org.apache.struts=WARN,A1 log4j.logger.org.apache.commons.beanutils=WARN,A1 log4j.category.ActionCommandBase=WARN,A1 log4j.category.AbstractSelectLocale=WARN,A1 log4j.category.BeanUtilsBean=WARN,A1 log4j.category.ConvertUtilsBean=WARN,A1 log4j.category.AbstractConverter=WARN,A1 log4j.category.DataNucleus.JDO=WARN, A1 log4j.category.DataNucleus.Persistence=WARN, A1 log4j.category.DataNucleus.Cache=WARN, A1 log4j.category.DataNucleus.MetaData=WARN, A1 log4j.category.DataNucleus.General=WARN, A1 log4j.category.DataNucleus.Utility=WARN, A1 log4j.category.DataNucleus.Transaction=WARN, A1 log4j.category.DataNucleus.Datastore=WARN, A1 log4j.category.DataNucleus.ClassLoading=WARN, A1 log4j.category.DataNucleus.Plugin=WARN, A1 log4j.category.DataNucleus.ValueGeneration=WARN, A1 log4j.category.DataNucleus.Enhancer=WARN, A1 log4j.category.DataNucleus.SchemaTool=WARN, A1
WEB-INF/appengine-web.xml を修正します。
次回、とりあえずModelクラスとServiceクラスをつくってみます