Play 2.1にアップグレードしてコントローラを使いこなす:Scala+Play 2.0でWebアプリ開発入門(5)(3/3 ページ)
2.0からScalaに対応したWebアプリ開発の人気軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、Play 2.0から2.1への移行方法やパラメータのバインド、リバースルーティング、セッション、フラッシュスコープの使い方などを解説します。
「セッション」「フラッシュスコープ」、Java EEでいう「HTTPセッション」の違い
Playでは「セッション」「フラッシュスコープ」という、データを一定期間保持するための機能があります。
セッションはユーザーの1セッション、フラッシュスコープは1つのリクエストが終了するまで、それぞれ保持されます。
注意してほしいのは、「セッションやフラッシュのデータが保存される場所はサーバではなく、クッキーを利用してクライアント側に保持される」という点です。クッキーを利用すると、データを保持できるサイズは4kbytesまでに制限されますし、文字列型しか保存できません。
Playにおけるセッションは、Java EE(J2EE)でいうところの「HTTPセッション」とは別物です。Java EEのセッションはWebブラウザを閉じればタイムアウトしますが、Playのセッションはタイムアウトがありません。Playのセッションでタイムアウトを実現したい場合、セッションにタイムスタンプを保持するなどの工夫が必要です。
なお、Java EEでいう「HTTPセッション」のような機能は、PlayのCache APIを使用することで実現できます。このCache APIについては、次回以降に紹介します。
セッションの使い方
セッションを使って特定のページにアクセスしたことがあるかどうかチェックしてみましょう。SessionController.scalaファイルを作成します。そのファイルに新しいコントローラを定義しましょう。
package controllers import play.api._ import play.api.mvc._ import play.api.libs.iteratee.Enumerator object SessionController extends Controller { def setSession = Action { implicit request => Ok("save session.").withSession( session + ("date" -> new java.util.Date().toString())) } def getSession = Action { implicit request => session.get("date").map { date => Ok("save session page access time:" + date) }.getOrElse { Ok("you have never access in save session page.") } } }
PlainResultトレイトのwithSessionメソッドを使えばセッションを保存できます。setSessionメソッドは、「date」という名前で、タイムスタンプを文字列にして保存しています。session変数はセッションを示すオブジェクトで、Mapのように使用できます。
もし、「withSession」の中で「”foo” -> "bar"」のように「session」変数に追加する形式にしないと、セッションを全て入れ替えてしまうので、気を付けましょう。
conf/routesファイルにセッションを保存/取得するためのURIを定義します。
GET /saveSession controllers.SessionController.setSession GET /readSession controllers.SessionController.getSession
Playコンソールからアプリケーションを再起動してアクセスしてみてください。「/saveSession」にアクセスしてから「/readSessio」にアクセスすると、タイムスタンプが表示されます。
また、Webブラウザをいったん閉じてから「/readSession」にアクセスしても、同じように動作します(クッキーを削除すればセッション保存前の状態になります)。
なお、セッションを全て削除するには、「withNewSession」メソッドを使用します。
Ok("remove session.").withNewSession
フラッシュスコープの使い方
「フラッシュスコープ」は1リクエストの間のみ保持されるデータです。公式サイトによると、フラッシュスコープは「非Ajaxアプリケーションの成功/失敗メッセージにのみ使用することを推奨」としています。
早速使ってみましょう。SessionControllerにメソッドを2つ追加します。
def getFlash = Action { implicit request => Ok { flash.get("msg").getOrElse("no msg!") } } def setFlash = Action { Redirect("/readFlash").flashing( "msg" -> "save Flash!") }
フラッシュスコープへ値を保存するには、「flashing」メソッドを使用します。「flash」変数が「request」の持つフラッシュスコープ用変数です。この変数もセッションと同じく、Mapのように使用できます。
「conf/routes」ファイルにルート情報を追加してアプリケーションにアクセスしてみましょう。
GET /saveFlash controllers.SessionController.setFlash GET /readFlash controllers.SessionController.getFlash
「/saveFlash」にアクセスすると、そのまま「/readFlash」にリダイレクトされ、「save Flash!」が表示されます。その後、直接「/readFlash」にアクセスしても、「no msg!」と表示され、メッセージ有効期限が1リクエスト内であることが確認できます。
この章ではセッションとフラッシュスコープの使い方を簡単に紹介しました。セッションとフラッシュスコープに関する詳細は「Documentation: ScalaSessionFlash ― Playframework」で確認してください。
次回はScalaテンプレートエンジンとビュー
今回はPlay 2.1への移行方法やコントローラのさまざまな使い方、さらにはセッションとフラッシュスコープの使用方法を紹介しました。コントローラにはまだ解説していない重要な機能がありますが、それについては必要になった時点で、逐次解説していきます。
次回は、Scalaテンプレートエンジンとビューに関する機能を紹介する予定です。
- Play2プラグインのインストールと使用と新規開発
- Play2+nginx/Akka/WebSocketで高速双方向通信
- Play2(+JavaScript)アプリを高速化、最適化する4つのテクニック
- Play2におけるJSONおよびCoffeeScriptの使い方
- Playのグローバルな設定&spec2でBDDなテスト
- Play 2.xからMySQLに接続してAnormでCRUD操作するには
- Play 2.xのScala Templatesでビュー&フォーム操作
- Play 2.1にアップグレードしてコントローラを使いこなす
- Playコントローラ/Action/HTTP Routerの基本的な使い方
- 便利なPlayコンソールとEclipseでのデバッグ方法
- Play 2.0のアーキテクチャとディレクトリ構成の基礎知識
- Play framework 2.0の概要/5つの特徴とScalaで作るための環境構築
著者プロフィール
中村修太(なかむら しゅうた)
クラスメソッド勤務の新しもの好きプログラマです。昨年、東京から山口県に引っ越し、現在はノマドワーカーとして働いています。好きなJazzを聴きながらプログラミングするのが大好きです。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- スケーラブルで関数型でオブジェクト指向なScala入門
Scalaの特徴を紹介し、基本構文や関数、クラスなど、Scalaの基本的な機能について解説する入門連載 - Javaの常識を変えるPlay framework入門
サーブレット/JSPを基にする重厚長大なJavaのWeb開発のイメージを変える軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載