提问者:小点点

如何用spring mvc配合百里香叶迭代一个列表?


我的目标是遍历一个对象列表,一些要显示在屏幕上,另一些要作为对象传递到一个表单中,我可以定义该表单的某些方面,然后将要修改的对象和属性返回给控制器。

以下方法的问题是列表中的对象没有正确传递给表单,因此会出现错误,因为它试图对不存在的对象进行更改。

另一方面,如果我试图通过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”存在,但转换为空]


共1个答案

匿名用户

尝试删除type=“hidden”以查看此输入中的内容,因为我知道您是通过执行value=“${comic}”来插入对象,这样输入就不会发送所需的值。。

更改此内容:

为此:

所以你可以看到表单发送给控制器的是什么,我相信这是对象的内存路径,而不是其中存在的数据。

输入中,您必须通知对象的属性,而不是整个对象。