2011年2月8日火曜日

slim3 + JSONICメモ2

slim3 + JSONIC でCRUD実装してましたのでメモ。
以前にslim3 + JSONICで試しに作ったものをベースに作りました。

とりあえず動くものはこちら
javascriptでCRUD処理を非同期に行っていて画面遷移が発生しません。

はまったのは、GAE環境ではJSONIC・RESTサーブレットのHTTP/DELETEメソッド送信時、削除処理してくれませんでした。
(ローカルでは普通にDELETEできるのに。)
そこで、JSONIC・RESTサーブレットで用意されている

"PUT/DELETEが使えない場合があります。そのような場合の代替手段として、クエリ変数に「_method=HTTP Method名」を指定することもできます。"


というのを参考に、DELETEの場合のみPOST+クエリ変数追加にして試したところうまくいきました。
これが正解かどうかはわかりませんが。
あとはControllerにfind(),create(Xxxx model),update(Xxxx mode),delete(Xxxx model)を用意。
RESTサーブレットが自動でJSON → JavaBean (model) へ変換して、HTTPメソッドを判断し各メソッドへ振分けてくれます。

下記が非同期REST送受信javascriptです。
(jqueryとjquery.jsonというライブラリを使用する前提です)
  1. ...  
  2.   
  3. /** 非同期処理 */  
  4. function sendJSON(method, jsonval, actionURI, displayId, delURI) {  
  5.  // 一覧取得URI設定  
  6.  var getURI = actionURI;  
  7.  // delURIが存在する場合「削除処理」と判断  
  8.  if (delURI != undefined) actionURI = delURI;  
  9.  $.ajax({  
  10.   type:method,  
  11.   url:actionURI,  
  12.   contentType:"application/json",  
  13.   data:jsonval,  
  14.   cache:false,  
  15.   success:function(data){displayMessage(getURI,displayId);}  
  16.   });  
  17. }  
  18. /** 登録を行います */  
  19. function createSend(form, actionURI, displayId) {  
  20.  sendJSON("POST", createJSON(form), actionURI, displayId);  
  21. }  
  22. /** 更新を行います */  
  23. function updateSend(form, actionURI, displayId) {  
  24.  sendJSON("PUT", createJSON(form), actionURI, displayId);  
  25. }  
  26. /** 削除処理を行います */  
  27. function deleteSend(form, actionURI, displayId) {  
  28.  var delURI = actionURI+"?_method=DELETE";  
  29.  // HTTP/DELETEメソッドが使用できなさそうなのでクエリ変数へDELETE設定  
  30.  sendJSON("POST", createJSON(form), actionURI, displayId, delURI);  
  31. }  
  32. /** formの内容をJSON形式に変換 */  
  33. function createJSON(form) {  
  34.  var form = $("#" + form);  
  35.  var param = {};  
  36.  $(form.serializeArray()).each(function(i,v){param[v.name] = v.value;});  
  37.  var jsonval = $.toJSON(param);  
  38.  return jsonval;  
  39. }  
  40. ...  

実装の中身は次のエントリーで書いていこうと思います。

あと、RESTサーブレットを使用するとslim3コントローラを使用しない為、
ユニットテストが出来ないということになります。
せっかく標準で用意されていて、簡単にテストが行えるのでなんとかしてテストできないか考えないと...。
ていうかRESTfulに実装しなければいいのか。

0 件のコメント:

コメントを投稿