質問: ### 前提 SpringMVC+thymeleafにて、検索画面を作っています。 検索条件のフォームと、検索結果のリストの画面構成です。 検索条件の一部に、マスタから取得したドロップダウンボックスがあります。 検索テンプレート内のドロップダウンボックス、検索結果リストはth:eachで展開をさせるためのセレクターを用意しています。 初期遷移時、ドロップダウンボックスにマスタを詰めてあげる必要があるので、DBアクセスしてマスタを取得し、返却するModelにマスタをAddAttributeしてテンプレート名を返却します。検索結果リストは空なので、検索結果のヘッダ項目リストだけ出る動きです。 検索実行して、リストをModelに追加してテンプレート名を返却すると、検索結果リストは展開されますが、ドロップダウンリストが空の状態になってしまいました。 こういう場合、テンプレート名を返却する度に必要なマスタをいちいち取得して詰めてあげないといけないのでしょうか?その際、ドロップダウンボックスの選択位置も設定しないといけないので、非常に面倒です。 そう思って以下の施策をやりました。 1検索結果リストを別テンプレート(fragment)にし、検索結果を返す際に、リストのfragment名を返すようにした→リストのみの画面になってしまったのでNG 2検索結果を返す際は、テンプレート名でなく、検索リストを返すようにして、JSで検索リストのみを構築する→検索フォームも初期化されず、マスタを取ってくる必要もありません。 現状は2のやり方をしてますが、その後別の方が画面共通のページャのテンプレート(fragment)を作って頂き、それはありがたいのですが、2のやり方ではそのページャを画面に組み込む事が出来ません。 結局冒頭に記述したように、テンプレートを返却する際に必要なものを全てModelに詰めてあげるやり方しか無いのでしょうか?よっぽどシンプルな画面でない限りこの問題が付きまとうと思うのですが、みなさんどうしているのでしょうか?
回答: 既にベストアンサーが出ていますが、補足を。 Thymeleaf+Springの構成の場合、Thymeleafテンプレート内からSpring管理にあるbeanのアクセスが可能です。 具体的には、データベースやその他マスターデータとなるRepository層からデータを取得するService層のbeanをThymeleafテンプレート内から呼び出し、表示したい内容を出力ができます。 View層から直接Repositoryの内容を参照するのはやや行儀が悪いですし、このままだとThymeleafテンプレートから毎回別途データベースアクセスが発生するようになってしまいますが、現在のSpringにはキャッシュ機構が標準で利用できますので、Repositoryの内容をキャッシュしておけば、毎回データベースアクセスすることはなく、かつ複数の画面で全く同じクエリを実装するといったことはなくなるでしょう。 ご参考までに。