Spring Boot:如何在thymleaf中绑定POST上的对象列表

时间:2017-09-16 06:37:44

标签: java spring-mvc spring-boot thymeleaf

我有GET请求的记录列表,该记录在UI上显示,带有一个复选框。

@GetMapping("/list")
public String list(Model model) {
    model.addAttribute("records", createRecords());
    return "list";
}

这是我的Record POJO

class Record {
    private boolean selected;   
    private Integer id; 
    private String name;    
    private String phone;
    //....

我在UI中显示如下:

<th:block th:each = "record : ${records}">
<tr>
    <td><input type="checkbox" th:field="*{selected}" th:checked="${record.selected}" /></td>
    <td th:field="*{id}" th:text="${record.id}" />
    <td th:field="${name}" th:text="${record.name}" />
    <td th:field="${phone}" th:text="${record.phone}" />
</tr>
</th:block>

我很难从List获取POST上所选记录的UI条。我只是从POST获得了一个对象。

我想在POST映射中找到类似的内容:

@PostMapping("/list")
public String select(@ModelAttribute ArrayList<Record> records) {
    //... at least ids of selected records
    //... or all the records back with selected

请帮忙。

1 个答案:

答案 0 :(得分:2)

您的问题有很多可能的原因。下面列出的三个项目应该可以帮助您正确映射表单:

  1. 您应该正确构建表单,包括使用*表示法来减少重复,例如:

    <th:block th:each = "record : ${records}">
      <tr>
        <td><input type="checkbox" th:field="*{selected}"/></td>
        <td><input type="text" th:field="*{id}"/></td>
        <td><input type="text" th:field="*{name}"/></td>
        <td><input type="text" th:field="*{phone}"/></td>
      </tr>
    </th:block>
    

    Spring + Thymeleaf tutorial

  2. 所示
  3. 在循环${records}时,您可能需要使用双下划线表示法才能在表单中正确填充每个Record。根据{{​​3}}:

      

    .. __${...}__语法是一个预处理表达式,它是在实际计算整个表达式之前计算的内部表达式。

    参见例如the Thymeleaf + Spring tutorial

  4. 仔细检查您是否正在Spring [{1}}中正确处理结果列表,方法是接受@Controller注释List<Record>@ModelAttribute。 (看起来你已经这样做了。

    参见例如this question