質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

48421閲覧

SpringBoot+ThymeleafでList内容の保持の仕方について

saipan0426

総合スコア11

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2016/06/11 01:58

###前提・実現したいこと
SpringBoot(1.3.5)+ThymeleafでWebアプリケーションを作成しています。
Controllerで任意クラスのListを含むクラスを@ModelAttributeに設定し、
該当リストを画面にセレクトボックスとして表示しています。
この状態でformをコントローラーの別メソッドにsubmitすると
リスト選択された値は取得できましたが、元のListがnullになってしまいました。

試行錯誤した結果、下記の方法で実現はできましたが、このやり方が一般的なのか、
何かほかにやり方があるのではないかと思い、質問いたしました。

###該当のソースコード
Controller

Java

1@Controller 2public class TestController { 3 4 @Autowired 5 private SampleService service; 6 7 /** 8 * 初期表示. 9 */ 10 @RequestMapping(value = "/Test", params = "init") 11 public ModelAndView init(@ModelAttribute("model")SampleForm form) { 12 13 form.setSampleModelList(service.getModelList()) 14 return new ModelAndView("test", "model", form); 15 } 16 17 /** 18 * 登録処理. 19 */ 20 @RequestMapping(value = "/Test", params = "regist") 21 public ModelAndView regist( 22 @ModelAttribute("model")SampleForm form, 23 BindingResult result) { 24 25 // 処理・・・ 26 // このメソッドでformのsampleModelListを使用したい 27 28 29 return new ModelAndView("test", "model", form); 30 } 31}

Form

Java

1public class SampleForm { 2 3 private String selected_id; 4 private List<SampleModel> sampleModelList; 5 6 public String getSelected_id() { 7 return selected_id; 8 } 9 public void setSelected_id(String selected_id) { 10 this.selected_id = selected_id; 11 } 12 public List<SampleModel> getSampleModelList() { 13 return sampleModelList; 14 } 15 public void setSampleModelList(List<SampleModel> sampleModelList) { 16 this.sampleModelList = sampleModelList; 17 } 18} 19

Model

Java

1public class SampleModel { 2 3 private String id; 4 private String text; 5 6 public String getId() { 7 return id; 8 } 9 public String setId(String id) { 10 this.id = id; 11 } 12 public String getText() { 13 return text; 14 } 15 public void setText(String text) { 16 this.text = text; 17 } 18}

test.html

html

1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" 3 xmlns:th="http://www.thymeleaf.org"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title>test</title> 7 </head> 8 <body> 9 <form method="post" th:action="@{/Test}" th:object="${model}"> 10 <select name="selected_id" th:field="*{selected_id}" th:if="*{not #lists.isEmpty(sampleModelList)}"> 11 <option th:each="item : *{sampleModelList}" 12 th:value="${item.id}" th:text="${item.text}" 13 </option> 14 </select> 15 <input type="submit" id="regist" value="regist" name="regist" /> 16 </form> 17 </body> 18</html> 19

###試したこと
htmlにリストの全項目をhiddenで持つとController側でListがnullにならないことが確認できましたが、
このやり方が一般的なのか?何かほかにやり方があるのではないかと思っています。

test.htmlのform内に以下の記述を追加

html

1<th:block th:each="item, stat : *{sampleModelList}"> 2 <input type="hidden" th:text="*{sampleModelList[__${stat.index}__].id}" /> 3 <input type="hidden" th:field="*{sampleModelList[__${stat.index}__].text}" /> 4</th:block> 5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sampleModelListをSpringのService層から取得していますので、別のController経由でも同じようにsampleModelListを取得しなければ画面には表示されません。
HIDDEN項目で画面間を引き回すのは少々危ういでしょうか…。

なお、Thymeleafをお使いですので、Thymeleaf-Springプラグインを使うことで、ThymeleafのHTML中から直接Service層の(厳密には、Spring管理下にあるすべてのbean)を取得できますのでお試しください。

http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#spring-beans

投稿2016/06/11 02:15

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saipan0426

2016/06/12 02:59

ご回答いただきありがとうございます。 教えていただいた方法でHTMLからbeanにアクセスすることができました。 Service層から都度取得するとなると、前回取得した内容とは変わってしまう 可能性があるかと思います。 内容を保持したい(持ち回りたい)場合はSessionに格納するのが一般的でしょうか?
A-pZ

2016/06/14 15:10

良かったですね。 セッションを利用しているユーザ単位で持ち回りたい情報の場合はSessionの利用が良いでしょうか。もちろん不要になったら破棄や更新するのも大切です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問