重量級のフレームワークは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クラスをつくってみます

 


参考サイト

スタートガイド (Slim3 日本語サイト(非公式))

【slim3】 JSPの開発手順および注意事項 – 炸裂!情熱の右フック!!

ふじやん雑記帳 – Slim3