AppEngineではサーバ側でページを出力するタイプではなく、サーバ側はデータを処理して必要な値をJSONで返すだけ、というAjaxを使った実装が標準だと感じています。
もちろん、管理画面などは最も作りやすいフレームワークを使うのが良いと思いますけれども。 セットアップ前提
手順ここではmavenを使った手順で説明します。CIまで考えると、Hudsonと相性が良いmavenを使っておくのが良いかなと思いますね。
Controllerの基底クラス次のような、必ずJSONをレスポンスする基底クラスを作成し、全てのControllerはこのクラスを継承するように作ることにします。 ちょっと長いコードですが、ステータス・エラーコード・エラーメッセージ・リトライ可能かどうか、を表す専用のキー文字列を用意して、クライアント側(JavaScript)では必ずこれらの値に応じた処理をする、というようなルールにします。処理としては一部の例外を専用に用意したコードでハンドルし、それ以外の例外をまとめてUNKNOWNとしてレスポンスを組み立てているだけです。 サンプル例のごとく"Hello, world!"を表示するアプリケーションを作ってみます。 IndexControllerTestarchetype pluginを使ってプロジェクトを生成するといくつかソースのテンプレートが含まれますが、今回は必要ないので最初から存在するクラスは全て消してしまいましょう。新しく Slim3のsrc/test/java/.../IndexControllerTest.javaを作成するとします。ControllerTesterが大変便利なので、それを使います。この例ではHttpステータスと、レスポンスされた文字列からJSONObjectを組み立てて、"status"と"message"の内容を確認しています。例では単なる文字列しか使用していませんが、POJOやList<POJO>を返す場合はJSONObject#getJSONObject()やJSONObject#getJSONArray()を使用する事になります。このようにしてレスポンスを簡単に確認できるため、サーバ側のソースコードは100%自動テストの対象とすることができます。IndexController.java特に説明する内容はありません。先の手順で作成した index.htmlまずはこのサンプルではjqueryを使うので、jquery-XXX.jsをプロジェクトのwarフォルダへコピーしておきます。次に、warフォルダ直下にindex.htmlを作成します。プロジェクトをAppEngineWebアプリとしてEclipseから起動してから http://localhost:8888/ を開いて動作確認します。サーバ側のJavaモジュールは既にテストを通しているので、Slim3のHotReloadingもオフで構いません。HTMLやJSの修正であればWebサーバの再起動も必要ありません。 この例では、通信結果のstatusしか判断していませんが、基本形はこのようなものです。アプリケーションの規模に合わせて、以下のようにJS側もしっかりフレームワーク化しておいた方が良いです(このレイヤはAppEngineとは全然関係ない、一般的な話なのでJSに詳しいサイトを参照する方が良いです)。
スクリーンショットその他の工夫
課題JSのテストをするために、以下のような仕組みがあればもっと効率がよくなりそうです。
どちらもAOPっぽく定義できると便利そう。 |




