LoginSignup
6
7

More than 5 years have passed since last update.

PlayFramework:フォームの内容をCacheに格納してViewで取り出す

Last updated at Posted at 2015-05-06

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/

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7