View
confirm.scala.html
@()
// Cacheと、フォーム用の内部クラスをインポート
@import play.cache.Cache;
@import controllers.TestController.TestForm;
@main("確認画面") {
// asInstanceOfでキャスト、definingでdata変数に入れる
@defining(Cache.get("data").asInstanceOf[TestForm]) { data =>
// 再格納
@Cache.set("data", data, 60 * 30)
// 表示
@data.foo
}
}
Controller
TestController.java
import static play.data.Form.*;
import play.cache.Cache;
import play.data.Form;
public class TestController extends Controller {
// フォーム用の内部クラス
public static class TestForm {
String foo;
}
public static Result showConfirm() {
// フォームの入力内容を取得
Form<TestForm> form = form(TestForm.class).bindFromRequest();
TestForm data = form.get();
//Cacheにセット
Cache.set("data", data, 60 * 10);
// 確認画面へ
return ok(confirm.render());
}
}
何故こんなことをしたのか
フォームで入力受け付け→確認画面表示→DBにインサート
というWebアプリを作っていて、セッションで値を受け渡そうと思ったが、
PlayFrameworkのセッションは、署名によって偽装できないがただのクッキーであるらしい
そこで、従来のセッションに似た機能のCacheを使ってみた
https://www.playframework.com/documentation/ja/2.3.x/JavaCache
しかしCache.setしたは良いが、それをいざ確認画面のViewで使いたいとき
どうすれば良いかわからずにはまってしまったので解決策のメモを残す
Viewで再格納しないとその後のインサート処理で使えなかった(Cache.getしてもnullが返却される)
時間があったらソースを見て詳しい仕様を確認したい
このCacheはスレッドセーフのようなので、多分問題ないはず
http://sourceforge.jp/projects/sfnet_ehcache/