Play Framework 2.0 で、ページを戻った時に、以前の選択した内容を再現したいなーというお話。
となると、値はどこかに保存しておかなきゃいけないわけで。
Session? いえいえ、ステートレスな Play ! だからこそ、Session の概念はポイしなきゃ。
値の保存は Cookie に頼りましょ。
Java であれこれ作ってきて、サーブレット + jsp に慣れ親しんだ身としては、
情報の保持を考えるときに、ついつい Session に頼りがちです。
でも、ステートレスを特徴とする Play Framework には Session は似合いません。
ステートレスってなあに?という人にはこことかが分かりやすいです。
クラウドベース、複数サーバー、非同期通信で随時接続、サーバーからの情報の頻繁なプッシュ‥‥
これらを考慮したうえで軽量なサーバー環境を実現するのはステートレスでないと割が合わないのです。
(参照:こことか)
それでも、「単に軽量なフレームワークとして Play! を選んだだけ!」
「だから Session を使いたい!」という方もいるはず。
Play! にも Session と呼ばれるものは存在します。
(参照:Play! Japan Doc. 2.0.4 セッションとフラッシュスコープ)
ただし、このセッション機能は以下のような注意点があります。
「Cookie を利用してる」「サーバーにデータは残らない」
「上限は 4KB」「格納できるのは String のみ」
ここで Session と呼ばれているものは、実際には Cookie だということ。
「これじゃダメ! Servlet の HttpSession がどうしても使いたいんだ!」という方には、
プラグインやライブラリを導入することをお勧めしておきます。
(参照:Play2 で HttpSession を使う)
せっかくなのでここからは、ビュー側で jQuery を使って cookie を扱う方法をまとめときましょう。
jQuery で cookie を扱う時には jQuery のプラグイン jquery-cookie を使うととっても便利。
github などからダウンロードしたら、ビューのあたまでインポートしておくことを忘れずに。
1 2 |
<script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script> <script src="@routes.Assets.at("javascripts/jquery.cookie.js")" type="text/javascript"></script> |
cookie への値のセットと、セットした値の参照、値のクリアはこんな感じ。
1 2 3 4 5 6 |
/* 値のセット */ $.cookie("値のキー", "保存する値"); /* 値の参照 */ $.cookie("値のキー"); /* 値のクリア */ $.cookie("値のキー", null); |
セットした値をクリアしたいときは null をセットします。
こうしておけば、ブラウザを閉じるまでは null 値が cookie に残っちゃいますが、
ブラウザを閉じると、キーのセットごとクリアしてくれます。
また、cookie の対象とするパスや有効期限( expires )を手書きで設定することもできます。
こんな感じ。
1 2 3 4 5 6 7 |
/* expires に数値をセットすると日数の意味になる。3560 で約 10 年 */ $.cookie("testpage", "保存する値", {path:"/", expires:3560}); /* 時間で指定する場合は、Date 関数を使って。10 分後の場合 */ var dt = new Date(); dt.setTime(dt.getTime() + (10*60*1000)); $.cookie("testpage", "保存する値", {path:"/tenmin/", expires:dt}); |
こんな風に、第3引数に配列で指定します。
特定の時分秒に expires させたいときなども、Date 関数で日付を作ってしまえば簡単。
ちなみに、第3引数が設定されていない場合は、
path はそのスクリプトが動作したパスが、expires は -1 が、それぞれセットされます。
最後は、ビューで受け取った値を cookie にセットする方法と、
値の存在チェックをして、実際に値を使う時の例をまとめておきましょう。
Play! の機能としての Session は特に使わず、ベタベタな方法で cookie を利用しています。
1 2 3 4 |
@(pageData: pages.TestPage) @getCookieVal(page: pages.TestPage) = @{ page.id+"|"+page.pref+"|"+page.local+"|"+page.kubun } |
値をセットするビューの頭で、Scala のメソッドを定義します。
ビューで受け取った値を cookie にそのまま放り込んじゃう感じ。
1 2 3 4 5 |
<script type="text/javascript"> $(function(){ $.cookie('testpage', '@getCookieVal(pageData)', {expires:1, path:'/'}); }); </script> |
先ほど Scala で定義したメソッドを javascript 側で使います。
わざわざ Scala のメソッドを使う意味はあまりないかもですけど、
条件分岐なんかがある場合はこの方法が便利なはず。
そして、cookie に保存した値を別のビューの javascript で、
値の存在をチェックしたうえで使います。
1 2 |
if($.cookie('testpage') != undefined){ var ary = $.cookie('testpage').split('|'); |
こんな感じ。
ここでは、連結された cookie を分割して配列に保存しています。
好みの問題になりますが、cookie に複数の値を保存するときは、
たくさんのキーに散らばった状態で保存するよりも、
ここで上げたように、文字列を連結して保存したほうが、管理が楽な気がします。
もちろん、連結文字を扱わないように気を付けてあげる必要が出てきちゃいますが‥‥。
というわけで、今日は Play! で Session と cookie について考えたというお話でした。