使用SpringBoot的Thymeleaf - 如何循环模型和删除?

时间:2016-07-04 04:31:10

标签: java spring spring-boot thymeleaf

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

我的基础是THIS GUIDE

该实体是一个具有Id和内容的问候语。

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

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

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

  

java.lang.IllegalStateException:BindingResult和bean名称的明确目标对象' greeting'可用作请求属性

控制器和存储库对象

    @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>

希望在这里推进正确的方向: - )

2 个答案:

答案 0 :(得分:0)

我想你错过了这一行。

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";
}

答案 1 :(得分:0)

您不必使用form delete问候语,您可以使用此方法轻松完成此问候。隐藏idgreeting的{​​{1}}。所以你不需要使用urlform。和hidden tags annotate方法采用以下方法接受controller的{​​{1}}。 用incoming id替换当前greeting代码form中的html代码{/ 1}}。

replace

编辑: - 因为您需要在控制器中存在对象 你可以使用findOne方法从给定的id中获取对象。检查下面的例子。

delete