Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

Locked History Actions

Play/Session

セッション管理

セッション管理については特にscala版の特記事項は無い模様。つまり、Java版と同じらしい。 また、セッションをキャッシュとして使わないよう、playはキャッシュ機構を備えている。

フラッシュスコープとは

いきなりフラッシュスコープという耳慣れない言葉が出てくるが、以下に参考を示す。

例えば、フォームをサブミットし、その内容がエラーだった場合、エラーページにリダイレクトするが、その際のメッセージをエラーページに受け渡すためには、以下のいずれかを行わなければならない。

  • エラーメッセージをパラメータとして受け渡す。
  • エラーメッセージをセッションに保存し、エラーページにて表示した後にそれを消す。

フラッシュスコープを利用すると以下のような動作になるようだ。

  • エラー内容をフラッシュスコープに保存する
  • エラーページにリダイレクトする
  • エラーページでエラー内容を表示する
  • フラッシュスコープの内容は自動的に消える

セッションの使い方

play.mvc.ScalaControllerには、以下のような定義がある。

    implicit def request = Request.current()
    implicit def response = Response.current()
    implicit def session = Session.current()
    implicit def flash = Flash.current()
    implicit def params = Params.current()
    implicit def renderArgs = RenderArgs.current()
    implicit def validation = Validation.current()

通常、コントローラは

object Application extends Controller {
    
    import views.Application._
    
    case class User(name: String, addr: String)
    
    def index() = html.index("Your Scala application is ready!")
}

などと記述されるが、このControllerは実はplay.mvc.packageにて「 type Controller = ScalaController」とされており、ScalaControllerのことになる。

つまり、上記コントローラコード中で、sessionを参照すると、これはSession.current()になる。Sessionは play.mvc.Scope.Sessionのこと。

おそらく、put(key: String, value: String)を呼び出せばセッションに名前付文字列を保持することができる。

キャッシュの利用

セッションには極めて小さな文字列しか保存できず、大きなデータやバイナリを保存するにはキャッシュを用いる必要がある。 ただし、ユーザごとに個別のセッション保持領域とは異なり、キャッシュはplay環境でグローバルであることに注意。 ユーザごと(セッションごと)の情報を保持するには、セッションのIDをキャッシュ用キーに含める必要がある。 もちろん、ユーザが識別できれば何でもよい。

※注意:Cacheというクラスは、実際にはScalaCacheを参照する(Controllerが実際にはScalaControllerであるように)。 例えばgetの戻り値がOption[T]となっているので注意しなければならない。

参考