この記事は公開されてから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を参照してみてください。
参考サイトなど
- Manipulating Results: https://github.com/playframework/Play20/wiki/ScalaResults
- Session and Flash scopes: https://github.com/playframework/Play20/wiki/ScalaSessionFlash