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

use*_*896 6 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的看法.

<!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>
Run Code Online (Sandbox Code Playgroud)

Avn*_*ish 13

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

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

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

<form th:action="@{/users/doDelete}" th:object="${customer}" method="post">
    <input type="hidden" th:field="${id}" />
    <button type="submit">Delete</button>
</form>
Run Code Online (Sandbox Code Playgroud)

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


Ble*_*zer 12

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

<td>
    <a th:href="@{'/users/doDelete/' + ${user.id}}">
        <span>Delete</span>
    </a>
</td>
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的..这​​应该是这样的:<a th:href="@{/users/doDelete/{id}(id=${user.id})}"> <span>删除</ span> </A> (9认同)