Slim3 for GAE/JでAjax
Slim3はまだ開発中みたいなので、Ajax対応がない(多分)。そもそも、Ajax対応って何よってことなんだけど、自分が必要なのはJSONをレスポンスで投げれるってことくらい。じゃ、JSPで勝手に書けばいいんだよね、きっと。
そこで、JavaのオブジェクトをJSONにするJSONICというライブラリを使うことにする。(こういうライブラリって結構あるみたいだけど、どれがいいのかね。)使い方は、JSONICのトップページにあるのを引用すると以下のような感じ。こんだけっす。
import net.arnx.jsonic.JSON; // POJOをJSONに変換します String text = JSON.encode(new Hoge()); // JSONをPOJOに変換します Hoge hoge = JSON.decode(text, Hoge.class);
そして、こいつを使ってモデルをJSONに変換してレスポンスすればいい。なので、プロジェクトディレクトリの下の「war/json/encode.jsp」というファイルを以下のように作成。これは共通で使う感じになる。(JSONICのJarをダウンロードしたら、プロジェクトフォルダ以下の「war/WEB-INF/lib」の中に入れておく)
<%@page pageEncoding="UTF-8"%> <%@page import="net.arnx.jsonic.JSON" %> <%@taglib prefix="f" uri="http://www.slim3.org/functions"%> <%= JSON.encode(request.getAttribute("json")) %>
request.getAttribute("json")の部分でセットされているモデルをJSON.encodeに渡して出来上がり。で、モデルをセットしているところはと言うと、以下のとおり。
package slim3.it.controller.todo; import org.slim3.controller.JDOController; import org.slim3.controller.Navigation; import slim3.it.model.Task; public class SearchController extends JDOController { @Override public Navigation run() { Task t = pm.getObjectById(Task.class, requestScope("key")); // ここでモデルをセット requestScope("json", t); // JSONICでモデルをエンコードするためのJSPにフォワード return forward("/json/encode.jsp"); } }
これで、JSONでレスポンスしたい場合はrequestに"json"というキーでモデルをセットしたあと、「/json/encode.jsp」へforwardしてやればよい。
ちなみに、このサンプルはひがさんの作ったデモアプリの中にパッケージ作って作成した。(いろいろあってブランクのアプリからだとうまく行かなかったので)
自分はサンプルを作るとき、なぜかよくこのTODOリストアプリを作って試すんです。なんか作ってて楽しいw
で、上のコードの「SearchController」クラスは「編集」ってリンクを押したときに呼ばれるコントローラ。「search?key=xxxxxxxx」ってリクエストがきたらkeyでタスク(Task)を取得してきてそれをリクエストに設定するってことをやってる。そして、JSONのオブジェクトをクライアント側で取得したら(クライアントの部分はjQuery)、2つあるテキストボックスに日付と、内容を設定するって感じ。
フロント側はとりあえずこれで何とかなりそうだね。あとは、後ろどうするかだなー。JDOとか難しいことしなければ簡単に作れるんだけど、BigTableとかもうちょい詳しくならんとかっこいい設計できないかもしれない。それは、追々・・・。