2009年12月31日木曜日

非同期通信(Ajax)用のJSONフォーマット(T2)

スズキです。

いろいろ考えましたが、結局こんな形になるようにしました。

--------【成功】--------
{
  "errors": [],
  "params": {
    "url": "http:\/\/www.suz-lab.com"
  },
  "results": {
    "url":"http:\/\/www.suz-lab.com"
  }
}
--------

--------【失敗】--------
{
  "errors": [
    "suz.lab.feed.page.other.mypage.IndexJson$InsertForm.urlは最小値(3.0)を下回っています。"
  ],
  "params": {
    "url": "http:\/\/www.suz-lab.com"
  },
  "results": null
}
--------

正常終了時には、"results"に任意の結果が、
異常終了時には、"errors"にエラーメッセージの配列が、
返ってくるようにしています。

また送信パラメータは"params"で、そのまま返ってくるようにしています。

Pageクラスでこんな感じに書けるようにしました。
(実装が、まだ、甘過ぎですが…)

--------【Java】--------
...
@Ajax
@POST
@ActionPath
public Navigation insert(
  @Form(resolverClass=OvalFormResolver.class) IndexJson.InsertForm form,
  ErrorInfo info
) {
  return (new JsonResponse<IndexJson.InsertForm, Map<String, String>>() {
    @Override
    protected Map<String, String> createResults() {
      Map<String, String> map = new HashMap<String, String>();
      map.put("url", this.getParams().getUrl());
      return map;
    }
  }).createResponse(form, info);
}
...
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-feed/src/suz/lab/feed/page/other/mypage/IndexJson.java?r=79
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-gae/src/suz/lab/gae/t2/JsonResponse.java?r=78

JsonResponseクラスの中の正常終了時の結果を作成する抽象メソッド
(createResults)をオーバーライドすることで利用出来るようにしています。
(createResponseを実行することで、実際にJSONオブジェクトを作成しています)

JSONレスポンスを処理するJavascript(jQuery)は、こんな感じです。

--------【jQuery】--------
$(function() {
  $("#form").validate({
    submitHandler: function(form) {
      $(form).ajaxSubmit({
        dataType: "json",
        success: function(json) {
          if(json.errors.length == 0) {
            alert(json.results.url);
          } else {
            for(var i = 0; i < json.errors.length; i++) {
              alert(json.errors[i]);
            }
          }
        }
      });
    }
  });
});
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-feed/war/other/js/app/mypage/index.js?r=79

マジック2になった、あと5時間...

--------
http://www.suz-lab.com

0 コメント: