你如何在Thymeleaf的DTO中迭代一个List?

时间:2018-04-13 19:58:47

标签: java spring-boot jpa data-binding thymeleaf

我的项目使用Spring Boot和JPA,MySQL和Thymeleaf。我似乎无法通过存储在DTO中的对象列表在视图内迭代,该对象作为模型属性传递给视图。

以下是DTO的相关内容:

public class Form {
    private SimpleModel simpleModel = new SimpleModel();
    private List<Cities> listOfCities;
//......getters and setters
}

以下是城市模型:

@Entity
@Table(name="Cities")
public class Cities {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id_city;

    @Column(name="name")
    private String name;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_country")
    private Countries id_country;
//getters and setters
}

这是控制器:

@GetMapping("/simple")
public String simpleGet(Model model) {
    Form form = new Form();
    form.setCities(citiesService.all());
    model.addAttribute("form", form);
    return "simple";
}

最后,这是观点:

<form action="#" th:action="@{/simple}" method="POST" th:object="${form}">
 <input type="text"  th:field="*{simpleModel.userName}">
 <select name="id_city">
   <option th:each="city : ${listOfCities}" th:value="${city.id_city}" th:text="${city.name}"></option>
 </select>
 <input type="submit"  value="Assign">
</form>

我在“form.setCities(citiesService.all());”之后检查了控制器内部通过在for循环中打印到控制台并且数据在那里,但是在视图中,我没有得到任何东西,选择列表是空的,没有选项元素。如何访问数据?

1 个答案:

答案 0 :(得分:0)

您的表单需要包含城市列表。您可以在return语句之前将listOfCities添加到模型中:

model.addAttribute("listOfCities", form.getListOfCities());

除了:

  • 在选项标记中包含一些默认文本。当您在浏览器中(而不是在容器/服务器上)加载页面时,您可以看到它将如何显示。这是使用Thymeleaf的主要原因。
  • 很难根据您的命名惯例告诉您正在做什么。 Cities是一个城市列表吗?因为你有name的字符串,所以看起来它没有被正确命名。您可能希望将其更改为Cityid。然后,您的方法变为getCity().getId()而不是getCities().getId_city()。同样适用于Countries
  • 如果可以,请避免使用EAGER

或者,请查看使用Project Lombok中的@Data@Builder