我的目标是遍历一个对象列表,一些要显示在屏幕上,另一些要作为对象传递到一个表单中,我可以定义该表单的某些方面,然后将要修改的对象和属性返回给控制器。
以下方法的问题是列表中的对象没有正确传递给表单,因此会出现错误,因为它试图对不存在的对象进行更改。
另一方面,如果我试图通过ModelAndView将它作为一个对象传递,它显然可以工作,但不具备我通过list传递的对象的所有特征。
控制器
@GetMapping("/")
public ModelAndView home() throws IOException {
ModelAndView mv = new ModelAndView();
mv.setViewName("home");
List<Comics> allComics = cs.getAll();
mv.addObject("comics", allComics);
return mv;
}
@PostMapping("/update")
public ModelAndView update(Comics com, @RequestParam("attr") String attr) throws IOException {
ModelAndView mv = new ModelAndView();
com.setLastRead(attr);
cs.updateAttributes(com);
mv.setViewName("home");
List<Comics> allComics = cs.getAll();
mv.addObject("comics", allComics);
return mv;
}
主页.html
<html xmlns:th="http://www.thymeleaf.org">
<tr th:each="comic : ${comics}">
<td th:text="${comic.title}"></td>
<td th:text="${comic.lastChapter}"></td>
<td>
<a th:href="${comic.lastChapterLink}" target="_blank"
role="button" class="btn btn-md btn-block btn-info"> Link
</a>
</td>
<td></td>
<td>
<form th:action="@{/update}" th:object="${comic}" method="post">
<input type="text" name="attr" id="attr"/>
<button type="submit">Sub</button>
</form>
</td>
</tr>
PS:我去掉了html页面的标题,因为它充满了不相关的CDN
如何将Spring MVC与Thymeleaf集成以实现传递对象列表可以显示在屏幕上并在html页面中用于其他目的而不会引发错误的结果?
显然,如果你知道更有效的方法来达到我正在倾听的结果;我只使用了这个方法,因为我不知道其他方法。
谢谢你。
回复@RafaeldaSilva:
我同意,但这并不能解决问题。让我解释一下:我要通过表单修改的属性已经有了它的名称,以允许您所写的内容。但是对象迭代通过:
tr th:each="comic : ${comics}">
不能作为输入直接传递,因为它是一个从列表中获取的值,并且仅单独存在于html页面中。有人可能会考虑将其作为隐藏输入传递,但在这种情况下,结果是相同的(我已经尝试过):
<form th:action="@{/update}" th:object="${comic}" method="post">
<input type="hidden" value="${comic}" name="com"/>
<input type="text" name="attr" id="attr"/>
<button type="submit">Sub</button>
</form>
@PostMapping("/update")
public ModelAndView update(@RequestParam("com") Comics com, @RequestParam("attr") String attr) throws IOException {
ModelAndView mv = new ModelAndView();
com.setLastRead(attr);
System.out.println("Comic: " + com);
cs.updateAttributes(com);
mv.setViewName("home");
List<Comics> allComics = cs.getAll();
mv.addObject("comics", allComics);
return mv;
}
错误:[org.springframework.web.bind.MissingServletRequestParameterException:方法参数类型漫画的必需请求参数“com”存在,但转换为空]
尝试删除type=“hidden”
以查看此输入
中的内容,因为我知道您是通过执行value=“${comic}”
来插入对象,这样输入就不会发送所需的值。。
更改此内容:
为此:
所以你可以看到表单发送给控制器的是什么,我相信这是对象的内存路径,而不是其中存在的数据。
在输入
中,您必须通知对象的属性,而不是整个对象。