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へ追加- <servlet>
- <servlet-name>restServlet</servlet-name>
- <servlet-class>net.arnx.jsonic.web.RESTServlet</servlet-class>
- <init-param>
- <param-name>config</param-name><param-value>{
- "mappings":{
- "/{class}.json":"tutorial.controller.twitter.${class}Controller"
- }
- }
- </param-value></init-param>
- </servlet>
- ・
- ・
- ・
- <servlet-mapping>
- <servlet-name>restServlet</servlet-name>
- <url-pattern>*.json</url-pattern>
- </servlet-mapping>
コントローラは下記のように実装。
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 List<tweet> find() {
- this.service = new TwitterService();
- List<tweet> tweetList = service.getTweetList();
- return tweetList;
- }
- public void create(Tweet tweet) {
- this.service = new TwitterService();
- this.service.tweet(tweet);
- }
- }
- </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>
- <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 件のコメント:
コメントを投稿