###前提・実現したいこと
SpringBoot(1.3.5)+ThymeleafでWebアプリケーションを作成しています。
Controllerで任意クラスのListを含むクラスを@ModelAttributeに設定し、
該当リストを画面にセレクトボックスとして表示しています。
この状態でformをコントローラーの別メソッドにsubmitすると
リスト選択された値は取得できましたが、元のListがnullになってしまいました。
試行錯誤した結果、下記の方法で実現はできましたが、このやり方が一般的なのか、
何かほかにやり方があるのではないかと思い、質問いたしました。
###該当のソースコード
Controller
Java
@Controller public class TestController { @Autowired private SampleService service; /** * 初期表示. */ @RequestMapping(value = "/Test", params = "init") public ModelAndView init(@ModelAttribute("model")SampleForm form) { form.setSampleModelList(service.getModelList()) return new ModelAndView("test", "model", form); } /** * 登録処理. */ @RequestMapping(value = "/Test", params = "regist") public ModelAndView regist( @ModelAttribute("model")SampleForm form, BindingResult result) { // 処理・・・ // このメソッドでformのsampleModelListを使用したい return new ModelAndView("test", "model", form); } }
Form
Java
public class SampleForm { private String selected_id; private List<SampleModel> sampleModelList; public String getSelected_id() { return selected_id; } public void setSelected_id(String selected_id) { this.selected_id = selected_id; } public List<SampleModel> getSampleModelList() { return sampleModelList; } public void setSampleModelList(List<SampleModel> sampleModelList) { this.sampleModelList = sampleModelList; } }
Model
Java
public class SampleModel { private String id; private String text; public String getId() { return id; } public String setId(String id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } }
test.html
html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>test</title> </head> <body> <form method="post" th:action="@{/Test}" th:object="${model}"> <select name="selected_id" th:field="*{selected_id}" th:if="*{not #lists.isEmpty(sampleModelList)}"> <option th:each="item : *{sampleModelList}" th:value="${item.id}" th:text="${item.text}" </option> </select> <input type="submit" id="regist" value="regist" name="regist" /> </form> </body> </html>
###試したこと
htmlにリストの全項目をhiddenで持つとController側でListがnullにならないことが確認できましたが、
このやり方が一般的なのか?何かほかにやり方があるのではないかと思っています。
test.htmlのform内に以下の記述を追加
html
<th:block th:each="item, stat : *{sampleModelList}"> <input type="hidden" th:text="*{sampleModelList[__${stat.index}__].id}" /> <input type="hidden" th:field="*{sampleModelList[__${stat.index}__].text}" /> </th:block>
まだ回答がついていません
会員登録して回答してみよう