如何将 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中你必须告知对象的属性,而不是完整的对象..