我正在关注提交要保存在数据库中的表数据的链接
http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/
但给定链接和我的实现之间的区别是链接的前端使用JSTL(JSP),而我使用的是Thymeleaf(HTML)
以下是正在使用的文件
HTML表单:
<form method="POST" th:action="@{/updateAllRules}" th:field="${ruleForm}">
<table>
<thead>
<tr>
<th>S No</th>
<th>Title</th>
<th>Body</th>
</tr>
</thead>
<tbody>
<tr th:each="ruleModel,iteration : ${allRules}">
<td th:text="${ruleModel.id}"></td>
<td><input type="text" th:name="${'rule'+iteration.index+'.title'}" th:value="${ruleModel.title}"></td>
<td><input type="text" th:name="${'rule'+iteration.index+'.body'}" th:value="${ruleModel.body}"></td>
</tr>
</tbody>
</table>
<br>
<input type="submit" value="Update All">
</form>
模特课程:
public class Rule {
private Integer id;
private Date timestamp;
private String title;
private String body;
// constructor and Getter/Setters
}
表格类:
public class RuleForm {
private List<Rule> rule;
public List<Rule> getRule() {
return rule;
}
public void setRule(List<Rule> rule) {
this.rule = rule;
}
}
控制器方法:
@RequestMapping(value = "/updateAllRules", method = RequestMethod.POST)
public String updateAllRules(@ModelAttribute("ruleForm") RuleForm ruleForm) throws IOException
{
System.out.println(ruleForm); // this prints com.web.model.RuleForm@235f9fcb
System.out.println(ruleForm.getRule()); //this prints null
return "redirect:/admin";
}
请让我知道我错过了什么。
更新1:
按建议进行更改。我的新HTML表单如下所示
<form method="POST" th:action="@{/updateAllRules}" th:object="${ruleForm}">
<table>
<thead>
<tr>
<th>S No</th>
<th>Title</th>
<th>Body</th>
</tr>
</thead>
<tbody>
<tr th:each="rule,iteration : ${ruleForm}">
<td th:field="*{rule[__${iteration.index}__].id}"></td>
<td><input type="text" th:field="*{rule[__${iteration.index}__].title}"></td>
<td><input type="text" th:field="*{rule[__${iteration.index}__].body}"></td>
</tr>
</tbody>
</table>
<br>
<input type="submit" value="Update All">
</form>
在页面加载时收到异常后进行这些更改。
org.springframework.expression.spel.SpelEvaluationException:EL1008E:属性或字段&#39;规则&#39;在#java; java.util.ArrayList&#39;类型的对象上找不到 - 也许不公开?
请注意我在模型属性中发送原始列表&#34; ruleForm&#34;在页面加载。一旦页面加载数据并且用户进行了更改,我想将完整表格POST回控制器。
答案 0 :(得分:2)
表单应该有th:object
,而不是th:field
:
<form method="POST" th:action="@{/updateAllRules}" th:object="${ruleForm}">
而不是使用th:name
和th:value
,而应该使用th:field
来为您执行这两项操作。还应使用*{...}
语法指定字段,该语法自动采用th:object
。
<input type="text" th:field="*{rule[__${iteration.index}__].title}" />
其他一切对我来说都是正确的。