slim3のtutorialをJSONICを使ってajaxでTweetするようにと、RESTfulに変えてみたのでメモ
できたのはこんなかんじ
JSONICの使い方メモ
準備
最新のjsonic.jarをダウンロードしてプロジェクトに配置・ライブラリに追加※追記 2011/02/01 jsonic.jarの配置場所が、war/WEB-INF/lib以下に置かないとローカルで動きませんでした。
エンコード・デコード
JSON.decode(String json, XXX.class)でjson→javaオブジェクトJSON.encode(XXX)でjavaオブジェクト→json
WebサービスAPIを使う
RESTサーブレットを使用する場合
web.xmlへ追加・ ・ ・ restServlet net.arnx.jsonic.web.RESTServlet config { "mappings":{ "/{class}.json":"tutorial.controller.twitter.${class}Controller" } } restServlet *.json
コントローラは下記のように実装。
RESTfullな操作はJSONICのRESTサーブレットがやってくれるので、
HTTP MethodのGETでfind()メソッド、POSTでcreate()メソッドを呼出すように実装します。
import java.util.List; import tutorial.model.Tweet; import tutorial.service.TwitterService; public class AjaxTweetController { private TwitterService service; public Listfind() { this.service = new TwitterService(); List tweetList = service.getTweetList(); return tweetList; } public void create(Tweet tweet) { this.service = new TwitterService(); this.service.tweet(tweet); } }
TwitterServiceにメソッド追加
/** * JSON形式でもらってDataStoreへ追加 * @param jsonTweet * @return String */ public String jsonTweet(String jsonTweet) { Tweet tweet = JSON.decode(jsonTweet, Tweet.class); tweet = this.tweet(tweet); String retJsonTweet = JSON.encode(tweet); return retJsonTweet; }
viewは下記
<p>What are you doing?</p> <form id="tweetForm" action="tweet" method="post" name="tweetForm"> <textarea id="content" name="content"></textarea><br/> <input type="button" value="tweet" onclick="sendTweetJSON()"/> </form> <div id="ajaxTweetList"></div> </body> <script type="text/javascript"> function sendTweetJSON() { var form = $("#tweetForm"); var param = {}; $(form.serializeArray()).each(function(i,v){ param[v.name] = v.value; }); var jsonval = $.toJSON(param); $.ajax({ type:"POST", url:"/AjaxTweet.json", contentType:"application/json", data:jsonval, cache:false, success:function(data){getAjaxList();} }); } function displayList(jsonData) { var list = jsonData; var resultData = "<table><tr><th>TweetList</th></tr>"; for (var i in list) { var content = list[i].content; resultData += "<tr><td>" + content + "</td></tr>"; } resultData += "</table>"; return resultData; } function getAjaxList() { var list; $.get("/AjaxTweet.json", function(data){ $('#ajaxTweetList').html(displayList(data)); }); } $(function() { getAjaxList(); }); </script>
jqueryを使用しているのでheadでライブラリを読込み
<script type="text/javascript" src="/js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="/js/jquery.json-2.2.min.js"></script> <script type="text/javascript" src="/js/deserialize.js"></script>
参考サイト:
jQueryでフォームの内容をJSONで投げ、受け取ったJSONをフォームに戻す方法
JSONIC
0 件のコメント:
コメントを投稿