Thymeleaf将参数从html发送到控制器

时间:2014-04-01 18:34:02

标签: spring-mvc thymeleaf

我是Thymeleaf的新手。我试图创建简单的crud应用程序。我试图在删除按钮上删除Customer类的对象。如何使用Thymeleaf将参数(例如-id)设置为调用deleteUser的方法。这是我的控制者。

package controllers;

//imports


@Controller
public class WebController extends WebMvcConfigurerAdapter {

    @Autowired
    private CustomerDAO customerDAO;

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/results").setViewName("results");
    }

    //show all users
    @RequestMapping(value="/users", method=RequestMethod.GET)
    public String contacts(Model model) {
        model.addAttribute("users",customerDAO.findAll());
        return "list";
    }

    //show form
    @RequestMapping(value="/users/add", method=RequestMethod.GET)
    public String showForm(Customer customer) {
        return "form";
    }

    //add user
    @RequestMapping(value="/users/doAdd", method=RequestMethod.POST)
    public String addUser(@RequestParam("firstName") String firstName,
                           @RequestParam("lastName") String lastName,
                           @RequestParam("lastName") String email) {
        customerDAO.save(new Customer(firstName, lastName, email));
        return "redirect:/users";
    }

    //delete user
    @RequestMapping(value="users/doDelete/{id}", method = RequestMethod.POST)
    public String deleteUser (@PathVariable Long id) {
        customerDAO.delete(id);
        return "redirect:/users";
    }
}

以下是我的观点。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
List of users
<a href="users/add">Add new user</a>
<table>
    <tr>
        <th>Id</th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Email</th>
        <th>Action</th>
    </tr>
    <tr th:each="user : ${users}">
        <td th:text="${user.id}">Id</td>
        <td th:text="${user.firstName}">First name</td>
        <td th:text="${user.lastName}">Last Name</td>
        <td th:text="${user.email}">Email</td>
        <td>
            <form th:action="@{/users/doDelete/}" th:object="${customer}" method="post">
                <button type="submit">Delete</button>
            </form>
        </td>
    </tr>
</table>
</body>
</html>

3 个答案:

答案 0 :(得分:13)

Blejzer答案是一个简单而直接的解决方案,除非您还使用Spring安全性(始终建议),在这种情况下,您应该更喜欢POST而不是GET用于所有修改操作,例如删除以防止CSRF攻击。这正是spring recommends logout这样做的原因。为了使您适应POST,请更改控制器以从请求参数而不是路径变量

中读取此参数
//delete user
@RequestMapping(value="users/doDelete", method = RequestMethod.POST)
public String deleteUser (@RequestParam Long id) {
    customerDAO.delete(id);
    return "redirect:/users";
}

在表单中添加一个隐藏字段,其中id为name,隐藏参数为

<form th:action="@{/users/doDelete}" th:object="${customer}" method="post">
    <input type="hidden" th:field="${id}" />
    <button type="submit">Delete</button>
</form>

另外,即使您没有使用Spring安全性,也始终建议对任何实体修改操作(如删除或更新)使用post。从长远来看,您可以远离Web上的麻烦。有关详细信息,请查看Quick Checklist for Choosing HTTP GET or POST

答案 1 :(得分:11)

您不需要表单来执行此操作:

<td>
    <a th:href="@{'/users/doDelete/' + ${user.id}}">
        <span>Delete</span>
    </a>
</td>

答案 2 :(得分:3)

路径变量可以设置为:

<a th:href="@{/users/doDelete/__${user.id}__}"><span>Delete</span></a>