Java
PlayFramework
Playframework2.4

PlayFrameworkでキャッシュの値の有無によってViewを出し分けするサンプル

More than 3 years have passed since last update.


PlayFrameworkでキャッシュの有無によってViewを出し分けするサンプル

複数の画面間でフォームから入力した値を保持したかったのでキャッシュを使うことにしたのだけれど、

キャッシュの値の有無によって画面表示を変更しようとしたらつまづいたのでメモ。


サンプルプロジェクト

https://github.com/satomikko94/play-cache-sample


  • PlayFramework 2.4

  • Java 1.8


サンプルコード


Application.java

    static Form<Task> taskFrom = Form.form(Task.class);

public Result index() {
return ok(setCache.render(taskFrom));
}

public Result setTask() {
// get values from form
Form<Task> filledForm = taskFrom.bindFromRequest();
Task task = filledForm.get();

// set Task model to cache
Cache.set("task", task, 60 * 1);

return redirect(routes.Application.index());
}



Task.java

public class Task {

public String id;
public String taskName;
}


setCache.scala.html

@(taskForm: Form[Task])

<!DOCTYPE html>
<html lang="en">
<head>
<title>Play framework - Cache sample</title>
</head>
<body>
<!-- send data from form -->
@form(routes.Application.setTask()) {
@inputText(taskForm("id"))
@inputText(taskForm("taskName"))
<input type="submit">
}
<!-- show cache data -->
@showCache()
</body>
</html>


showCache.scala.html

@(task : Task = Cache.get("task").asInstanceOf[Task])

<!-- if cache is not null, show cache data -->
@if(task == null) {
<h1>Cache has no data!</h1>
} else {
<h1>Task data from Cache</h1>
id : @task.id<br>
taskName : @task.taskName<br>
<br>
Cache will expire after 1 minutes.
}


実行結果

http://localhost:9000/ にアクセス。


初期画面

Screen Shot 2015-12-13 at 13.33.02.png

初期画面はCache has no data!と表示される。

フォームに適当な値を入力してSubmit


フォーム送信後

Screen Shot 2015-12-13 at 13.34.14.png

Submitすると、フォームの値が下に表示される。

キャッシュに入れているので、直後に画面を更新してもこの値は残ったまま。

キャッシュ期限の1分を過ぎるとまたCache has no data!と表示される。


ポイント


Cache.set

setCache.scala.htmlのフォームで入力した値をApplication.javaでTask型として取得し、

Cache.set("task", task, 60 * 1);

でキャッシュに保持している。キャッシュ期限は60 * 1 = 1分。

このキャッシュは他のクラスやViewから取り出すことが出来る。


キャッシュデータのviewでの取得

ここがつまづいた所。

この後のif文で使用するためには、キャッシュのデータを

@(task : Task = Cache.get("task").asInstanceOf[Task])

で取得してくる必要がある。asInstanceOfでTask型に直すのを忘れずに。

この1行、これより前にHTMLが書かれていると

')' expected but '=' found.というコンパイルエラーが表示されてしまうので

必ずincludeしてるhtmlの最初に持ってくる必要がある。

この件についてはちゃんとした理由書いてあるページあると思うのだけれど見つからなかった・・・

どなたかわかったら教えて下さい。


取得したキャッシュデータの利用

取得できればあとは簡単。if文は

@if(task == null) { }

このように@ifのなかで取得したデータを使用できる。

また、HTMLに取得したデータを埋め込みたい場合は

id : @task.id<br>

という使い方もできる。