jQueryのajax()でslim3のコントローラからjson取得
簡単なサンプル。
GWTを使わず、javascript直書き。javaのライブラリはjson-lib使用
コントローラ。(sampleなのでDatastore触ってるけど、本来はControllerは直接Datastoreを触らず、Serviceクラス経由で取得すべき。)
public class CountController extends Controller { private Slim3ModelMeta meta = new Slim3ModelMeta(); @Override protected Navigation run() throws Exception { int count = Datastore.query(meta).count(); HashMap<String, Object> map = Maps.newHashMap(); map.put("count", count); JSON json = JSONSerializer.toJSON(map); json.write(response.getWriter()); response.flushBuffer(); return null; } }
HTML
<script type="text/javascript" src="./scripts/jquery-1.4.2.js"></script> <script type="text/javascript"> $(document).ready(function() { $.ajax({ dataType: "json", data: null, url:"./boke/count", type:"GET", success: function(data){ alert(data.count); } }); }); </script>
ajax(options)について
細かい制御が不要なら、ラッパメソッドのgetJSON()のほうがコードがすっきり。
optionsのdataTypeで"json"を指定すると、Acceptヘッダは「Accept: application/json, text/javascript, */*」となる。
dataTypeは、サーバへAcceptヘッダによってリクエストするデータの型を決めるもので、利用できるタイプは下記の通りです。
jQueryのAjaxリクエスト 4 - [JavaScript]All About
参照させていただいたエントリでは、サーバ側でAcceptヘッダによって処理を切り替えています。
このままでは、ブラウザがHTMLが欲しいのかjavascriptが欲しいのか分かりません。
HTMLが欲しい場合はエラーメッセージをdivの中に表示したいし、javascriptの場合はエラーメッセージをalertするなりdivにつっこむなりのスクリプトを返すようにしたいわけです。そこで、boolean isRequiredJs(HttpServletRequest request )でHTTPHeaderのAcceptを見て、"text/javascript"や"application/javascript"が含まれていればjavascriptを要求しているものとして判定しています。
SAStruts + JQueryでのAjaxリクエスト判定の方法 - ゆろよろ日記
jQueryでの疑問
$(document).ready(func)は$(func)と書けるけど、前者の方がコードの意味がわかりやすくて良いと思うのだけど。後者のほうがよく見かけるのは、単にすぐ書けるから?