如何将list绑定到没有中间模型类的视图?



我有这段代码,工作得很好。

它从存储库中检索数据,将其设置为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}" />

然后我想到我可以通过以下方式简化这段代码:

  1. 删除ListPlaces模型类
  2. 控制器代码修改如下:
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}" />

相关内容

  • 没有找到相关文章

最新更新