如何将 spring mvc 与 thymeleaf 结合使用来遍历列表?
How to use spring mvc with thymeleaf to iterate over a list?
我的目标是循环对象列表,一些要显示在屏幕上,另一些作为对象传递到表单中,我可以定义对象的某些方面,然后 return给控制器要修改的对象和属性。
以下方法的问题是列表中的对象没有正确传递给表单,因此给出错误,因为它试图对不存在的对象进行更改。
另一方面,如果我尝试通过 ModelAndView 将其作为对象传递,它显然可以工作,但不具备我通过列表传递的对象的所有特征。
控制器
@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;
}
home.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: 方法参数类型 Comics 的必需请求参数 'com' 存在但已转换为 null]
尝试删除 type="hidden"
以查看此 input
中存在的内容,据我了解,您正在通过 value="${comic}"
插入对象,这样输入不应想要的价值..
改变这个:<input type="hidden" value="${comic}" name="com"/>
为此:<input type="text" value="${comic}" name="com"/>
所以你可以看到表单发送到控制器的内容,我相信这是对象的内存路径,而不是其中存在的数据。
在input
中你必须告知对象的属性,而不是完整的对象..
我的目标是循环对象列表,一些要显示在屏幕上,另一些作为对象传递到表单中,我可以定义对象的某些方面,然后 return给控制器要修改的对象和属性。
以下方法的问题是列表中的对象没有正确传递给表单,因此给出错误,因为它试图对不存在的对象进行更改。
另一方面,如果我尝试通过 ModelAndView 将其作为对象传递,它显然可以工作,但不具备我通过列表传递的对象的所有特征。
控制器
@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;
}
home.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: 方法参数类型 Comics 的必需请求参数 'com' 存在但已转换为 null]
尝试删除 type="hidden"
以查看此 input
中存在的内容,据我了解,您正在通过 value="${comic}"
插入对象,这样输入不应想要的价值..
改变这个:<input type="hidden" value="${comic}" name="com"/>
为此:<input type="text" value="${comic}" name="com"/>
所以你可以看到表单发送到控制器的内容,我相信这是对象的内存路径,而不是其中存在的数据。
在input
中你必须告知对象的属性,而不是完整的对象..