演習: 閲覧履歴
この章では、セッションを使って利用者ごとに値を保持します。B- は本文の書店アプリ bookstore の問題です。
B-4. 閲覧履歴
Section titled “B-4. 閲覧履歴”本の詳細を開くたびに、その本をセッションに記録し、詳細画面に 閲覧履歴(それまでに見た本の一覧)として表示します。本文ではログイン状態をセッションに保存しました。ここでは同じ HttpSession に、見た本の一覧を蓄積します。次のとおり実装します。
BookController.detailでHttpSessionを受け取り、セッションのhistory(List<Book>)を取り出してModelに渡す。このとき、今見ている本はまだ加えない(今見ている本を閲覧履歴に出さないため)- 取り出したリストの先頭に今見ている本を加え、同じ本が重複しないよう除き、5 件を超えたら最も古いものを取り除いて、セッションに保存し直す
books/detail.htmlに閲覧履歴をth:eachで表示する。リストが空のときはth:ifで出さない。各本は@{/books/{id}(id=${b.id})}で詳細へのリンクにする
何冊か詳細を開いてから別の本の詳細を開くと、それまでに見た本が閲覧履歴に並べば成功です。
ヒント
セッションへの保存と取得は、本文 値の保存・取得・破棄 の setAttribute/getAttribute を使います。getAttribute の戻り値は Object なので、(List<Book>) session.getAttribute("history") とキャストして受け取ります。まだ何も見ていないと null が返るので、そのときは新しい ArrayList を用意します。
先頭への追加は addFirst、5 件を超えたときの末尾の削除は removeLast です。重複は history.removeIf(b -> b.getId().equals(book.getId())) で、追加する前に同じ id の本を取り除きます。Model への受け渡しを追加より先に行うと、今見ている本は閲覧履歴に出ません。