Skip to content
Playground

演習: 閲覧履歴

この章では、セッションを使って利用者ごとに値を保持します。B- は本文の書店アプリ bookstore の問題です。

本の詳細を開くたびに、その本をセッションに記録し、詳細画面に 閲覧履歴(それまでに見た本の一覧)として表示します。本文ではログイン状態をセッションに保存しました。ここでは同じ HttpSession に、見た本の一覧を蓄積します。次のとおり実装します。

  • BookController.detailHttpSession を受け取り、セッションの historyList<Book>)を取り出して Model に渡す。このとき、今見ている本はまだ加えない(今見ている本を閲覧履歴に出さないため)
  • 取り出したリストの先頭に今見ている本を加え、同じ本が重複しないよう除き、5 件を超えたら最も古いものを取り除いて、セッションに保存し直す
  • books/detail.html に閲覧履歴を th:each で表示する。リストが空のときは th:if で出さない。各本は @{/books/{id}(id=${b.id})} で詳細へのリンクにする

何冊か詳細を開いてから別の本の詳細を開くと、それまでに見た本が閲覧履歴に並べば成功です。

ヒント

セッションへの保存と取得は、本文 値の保存・取得・破棄setAttributegetAttribute を使います。getAttribute の戻り値は Object なので、(List<Book>) session.getAttribute("history") とキャストして受け取ります。まだ何も見ていないと null が返るので、そのときは新しい ArrayList を用意します。

先頭への追加は addFirst、5 件を超えたときの末尾の削除は removeLast です。重複は history.removeIf(b -> b.getId().equals(book.getId())) で、追加する前に同じ id の本を取り除きます。Model への受け渡しを追加より先に行うと、今見ている本は閲覧履歴に出ません。