Play framework 2.0 betaが出たようです12 – Controller,Session

2012.02.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Controller関連の追加情報

先日Playframework2.0のgithubのwikiを見たらけっこうな量が更新されてました。いよいよRC版の登場も近そうです。
wikiをみると興味深い追加情報がいろいろとあったので、かいつまんでご紹介します。
今回はController周りに関する機能の紹介です。

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.2
  • Playframework : HEAD
  • Java : 1.6.0_26
  • Eclipse : 3.7

注意:
この記事ではgithubから取得したHEAD版を使用して試しています。
正式リリース前の状況のため思わぬ不具合が生じるかもしれませんので、ご了承ください。

ソースのHEADを取得してセットアップ

まだgithubからソースを取得していない人は、play2.0のソースを取得してビルドしましょう。

$ git clone https://github.com/playframework/Play20.git
$ cd Play20/framework
$ ./build
> complile
> build-repository
> publish-local

すでにソースを取得している人は、最新の状態に更新してビルドします。

$ git pull
$ cd Play20/framework
$ ./cleanEverything
$ ./build
> compile
> build-repository
> publish-local

これで準備ができました。

プロジェクト作成

Scalaベースのプロジェクトを作成し、sbtコンソールを起動します。

% play new cont
% cd cont
% play

eclipsifyを実行してeclipseプロジェクト化してインポートしてソースの修正をしましょう。

>[myConfig] $ eclipsify

Resultのcontent type

Play2.0のControllerの関数はplay.api.mvc.Requestを受け取ってplay.api.mvc.Resultを返すようにするのが基本です。
ResultオブジェクトとしてOkやNotFoundが用意されているのですが、これらは渡した値によって適切なcontent typeが選択されます。
また、自分でcontent typeを指定することも可能です。

//Scalaテンプレートに渡す
Ok(views.html.index("Your new application is ready."))

//text/plainで返す
Ok("text plain")

//text/xmlで返す
Ok(<message>Hello World!</message>)

もしXMLオブジェクトを渡してhtmlで表示したいなら、asメソッドにcontent typeを指定します。

Ok(<message>Hello World!</message>).as("text/html")
//またはOk(<message>Hello World!</message>).as(HTML)

ヘッダーとクッキー

ヘッダーを変えたいときはwithHeaders、クッキーを使用したいときはwithCookiesメソッドを使用します。

Ok("Hello World!!!").withHeaders(
  CACHE_CONTROL -> "max-age=3600", 
  ETAG -> "xx"
).withCookies(
  Cookie("theme", "blue")
)

Session

Playでは複数のHTTPリクエストにまたがるデータを保持したい場合、SessionかFlashスコープにデータを保存することができます。
Sessionのデータは、ユーザーセッション中に使用可能で、Flashスコープのデータは次のリクエストのみ使用可能です。
また、Sessionにタイムアウトはなく、ユーザーがWebブラウザを閉じたときには消滅します。

Sessionにデータを格納するには、withSessionメソッドを使用します。

//取得
Ok("Welcome!").withSession(
  "キー" -> "値"
)

//取り出し
def auth = Action { implicit request =>
  session.get("キー").map { value =>
     Ok(value)
  }.getOrElse {
    Unauthorized("Oops!!")   
  }
}

しかし、上記コードはSession全体を書き換えてしまうので注意してください。
既存のSessionに追加するには++を、既存のSessionから削除するには-メソッドを使用します。

Ok("Hello World!").withSession(
  session ++ ("saidHello" -> "yes")
)

Ok("Theme reset!").withSession(
  session - "theme"
)

Flash

次のリクエストまでの間だけ有効なデータでいいのならば、Flashを使用します。

def index = Action { implicit request =>
  Ok {
    flash.get("success").getOrElse("Welcome!")
  }
}

def save = Action {
  Redirect("/index").flashing(
    "success" -> "The item has been created"
  )
}

まとめ

これ以外にもController周りには興味深いドキュメントがいろいろとあるのでwikiを参照してみてください。

参考サイトなど