我有这段代码,工作得很好。
它从存储库中检索数据,将其设置为listPlaces并将listPlaces绑定到视图。
控制器
ListPlaces listPlaces = new ListPlaces();
listPlaces.setListPlaces(placeRepository.selectPlaces(idUser));
ModelAndView modelAndView = new ModelAndView("/myplaces.html");
modelAndView.addObject("listPlacesBind", listPlaces);
模型public class ListPlaces {
private List<Place> listPlaces;
public List<Place> getListPlaces() {
return listPlaces;
}
public void setListPlaces(List<Place> listPlaces) {
this.listPlaces = listPlaces;
}
}
视图<th:block th:each="place, itemStat : *{listPlaces}">
<span th:text="*{listPlaces[__${itemStat.index}__].codPlace}" />
然后我想到我可以通过以下方式简化这段代码:
- 删除ListPlaces模型类
- 控制器代码修改如下:
List<Place> listPlaces;
listPlaces = placeRepository.selectPlaces(idUser);
ModelAndView modelAndView = new ModelAndView("/myplaces.html");
modelAndView.addObject("listPlacesBind", listPlaces);
也就是说,不是在中间使用模型类,而是想尝试直接在控制器中创建列表并将其绑定到视图。
但是我得到以下错误:
Property or field 'listPlaces' cannot be found on object of type 'java.util.ArrayList' - maybe not public or not valid?
在调试模式下运行,我将listPlaces设置为"手表";视图。
注意,在第一个例子中,它创建了两层" listplace ",而在第二个例子中,它只创建了一层。
看来它缺少了第二层。
那么,不需要中产阶级就能做到这一点吗?
也许有一种方法可以在不需要中产阶级的情况下增加第二级。
您没有显示所有相关代码,但猜测缺失的部分,在需要的地方进行更改。一种选择是改变你的控制器方法,如:
@GetMapping("/myplaces")
public String whateverIsTheName(Model model) {
model.addAttribute("listPlaces", placeRepository.selectPlaces(idUser));
return "myplaces";
}
不需要创建任何中间类,你可以像上面那样使用Model
,并保持那些'两层',这样就有一个对象,其中有这个属性listPlaces
。
你犯了一个错误。在第一个控制器中,你将ListPlaces的对象绑定到ModelAndView。
ListPlaces listPlaces = new ListPlaces();
listPlaces.setListPlaces(placeRepository.selectPlaces(idUser));
ModelAndView modelAndView = new ModelAndView("/myplaces.html");
modelAndView.addObject("listPlacesBind", listPlaces);// Here listPlaces is an Object Of ListPlaces model
但在第二次更改,listPlaces是一个列表,而不是listPlaces模型的对象,所以在你的HTML中,它期待一个listPlaces模型的对象,但得到一个列表,所以它显示一个错误。
List<Place> listPlaces;
listPlaces = placeRepository.selectPlaces(idUser);
ModelAndView modelAndView = new ModelAndView("/myplaces.html");
modelAndView.addObject("listPlacesBind", listPlaces);// Here listPlaces is a list not an object of ListPlaces model
所以修改你的HTML代码来接受列表,而不是对象。如果有任何疑问,请告诉我。
名称listPlaces在模型中不再存在,因为您现在将其命名为listPlacesBind:
modelAndView.addObject("listPlacesBind", listPlaces)
也就是说,列表不再是模型中对象的字段,您必须像这样访问它:
<th:block th:each="place, itemStat : ${listPlacesBind}">
<span th:text="${listPlacesBind[__${itemStat.index}__].codPlace}" />