【问题标题】:Thymeleaf with SpringBoot - how to loop model and delete?带有 Spring Boot 的 Thymeleaf - 如何循环模型和删除?
【发布时间】:2016-11-05 17:31:17
【问题描述】:

我正在使用带有 Thymeleaf 的 SpringBoot 构建一个简单的示例来帮助我学习这两种技术。

我的示例基于THIS GUIDE

实体是一个 Greeting,它有一个 Id 和一个 Content。

我创建的问候语很好,我可以列出我创建的所有问候语。

然后我想为列表页面中的每个问候添加一个删除选项。单击删除时,我希望删除对象并再次提供列表页面。

唉,当我加载列表页面时,我得到了这个错误:

java.lang.IllegalStateException: Bean 名称“greeting”的 BindingResult 和普通目标对象都不能用作请求属性

控制器和存储库对象

    @Controller
public class GreetingController {

    @Autowired
    GreetingRepo gr;

    @RequestMapping(value="/greeting/list", method=RequestMethod.GET)
    public String greetingsForm(Model model) {
        model.addAttribute("greetings", gr.findAll());
        return "greeting/list";
    }

    @RequestMapping(value="/greeting/delete", method=RequestMethod.POST)
    public String deleteGreeting(@ModelAttribute("greeting") Greeting greeting) {
        gr.delete(greeting);
        return "redirect:/greeting/list";
    }


}

@RepositoryRestResource
interface GreetingRepo extends JpaRepository<Greeting, Long> {

}

List.html 页面:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Handling Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Result</h1>
    <div th:each="greeting : ${greetings}">
        <p th:text="'id: ' + ${greeting.id}" />
        <p th:text="'content: ' + ${greeting.content}" />
        <form action="#" th:action="@{/greeting/delete}" th:object="${greeting}" method="post">
            <input type="hidden" th:field="*{id}"/>
            <input type="hidden" th:field="*{content}"/>
            <input type="Submit" value="Delete"/>
        </form>
    </div>
    <a href="/greeting/add">Add another</a>
    <a href="/greeting/list">Show All</a>
</body>
</html>

希望能在这里朝着正确的方向前进 :-)

【问题讨论】:

    标签: java spring spring-boot thymeleaf


    【解决方案1】:

    您不必使用formdelete 的问候语,您可以使用这种方法很容易地做到这一点。在url 中隐藏greetingid。所以你不需要使用formhidden tags。和annotatecontroller 方法和下面的方法,接受greetingincoming id。 将当前的form 替换为给定的html 代码和replace 以及controller 中的delete 方法。

        <a th:href="@{/greeting/{id}/delete(id=${greeting.id})}" th:text="delete"></a>
    
             @RequestMapping(value="/greeting/{id}/delete",method=RequestMethod.GET)
            public String deleteGreeting(@PathVariable int id) {
                gr.delete(id);
                return "redirect:/greeting/list";
            }
    

    edit:- 因为您需要对象存在于控制器中 您可以使用 findOne 方法从给定的 id 中获取对象。查看以下示例。

        <a th:href="@{/greeting/{id}/edit(id=${greeting.id})}" th:text="edit"></a>
    
        @RequestMapping(value="/greeting/{id}/edit",method=RequestMethod.GET)
        public String Edit(@PathVariable int id){
        greeting greetingob = gr.findOne(id);
        return "edit";
        }
    

    【讨论】:

    • 感谢 Priyamal,我将 @RequestMapping(value="/{id}/edit", method=RequestMethod.GET) 更改为 @RequestMapping(value="/greeting/{id}/delete", method=RequestMethod.GET) 并且它有效。然而,我真的很喜欢一个按钮和一个例子,展示如何在这种情况下将对象传递给方法。我的下一步是编辑对象,因此我对此感兴趣。
    • &lt;p th:text="'id: ' + ${greeting.id}" /&gt; 这一行在视图中的输出是什么。是0 吗?。
    • 在我的示例中,(如果我注释掉“表单”以便它运行),输出将类似于:id: 6
    • 困惑,在我之前的评论中我说我已经做了那个改变。这就是我让您的超链接建议起作用的方式。我正在寻找一个按钮并将对象传递给控制器​​。
    • 你可以使用findOne方法获取对象。在控制器内部。
    【解决方案2】:

    我想你错过了这条线。

    model.addAttribute("greeting", new Greeting());
    
    @RequestMapping(value="/greeting/list", method=RequestMethod.GET)
    public String greetingsForm(Model model) {
        model.addAttribute("greeting", new Greeting());
        model.addAttribute("greetings", gr.findAll());
        return "greeting/list";
    }
    

    【讨论】:

    • 感谢 Hasitha,这解决了错误,但是,当 Greeting 对象到达控制器的 delete 方法时,它没有被实例化。 IE。尽管我点击了什么,但 id 始终为 0。另外,我很好奇为什么我需要在模型中添加一个空对象,而实际对象已经在模型中? IE。 'greetings' 对象是一个包含所有 'greeting' 对象的列表。我以为我可以在嵌套删除表单中使用当前迭代(问候)变量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2018-01-26
    • 2023-03-23
    • 2019-10-31
    • 2019-10-29
    相关资源
    最近更新 更多