###前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/12 02:59
2016/06/14 15:10