spring thymeleaf - 从 html 表中删除对象并将 id 传递给控制器

Posted

技术标签:

【中文标题】spring thymeleaf - 从 html 表中删除对象并将 id 传递给控制器【英文标题】:spring thymeleaf - delete object from html table and pass id to controller 【发布时间】:2017-09-22 04:42:09 【问题描述】:

我将一个包含对象的列表从我的控制器传递到我的 html,然后 thymeleaf 为列表中的每个对象创建一个。

我想通过一个按钮删除一个条目并将对象 ID 传递给我的控制器,以便从数据库中删除它。

但是,当我在控制器中处理发布请求时,id 属性是空的。

带有 Thymeleaf 的 HTML:

<tbody>
     <tr th:each="user : $users">
       <td th:text="$user.personId"></td>
       <td th:text="$user.firstName"></td>
       <td th:text="$user.lastName"></td>
       <td>
           <form th:action="@delete_user" method="post" th:object="$user">
              <input type="hidden" th:field="$user.personId"/>
              <button type="submit" value="Submit" class="btn btn-danger">Delete</button>
           </form>
       </td>
     </tr>
</tbody>

控制器:

@RequestMapping(value = "/delete_user", method = RequestMethod.POST)
public String handleDeleteUser(@ModelAttribute("user") User user) 
    System.out.println(user.getPersonId());
    System.out.println("test");
    return "redirect:/external";

我怎样才能做到这一点? 还是有别的办法?

谢谢!

【问题讨论】:

【参考方案1】:

您可以尝试将th:action="@delete_user" 更改为th:action="@/delete_user"。 或者您可以使用路径变量/查询字符串并使用 get 方法传递 id。 例如 html:

<a th:href="|@/delete_user/$user.personId|" class="btn btn-danger">Delete</a>

控制器:

@RequestMapping(value = "/delete_user/personId", method = RequestMethod.GET)
public String handleDeleteUser(@PathVariable String personId) 
    System.out.println(personId);
    System.out.println("test");
    return "redirect:/external";

html:

<a th:href="@/delete_user(personId=$user.personId)" class="btn btn-danger">Delete</a>

控制器:

@RequestMapping(value = "/delete_user", method = RequestMethod.GET)
public String handleDeleteUser(@RequestParam(name="personId")String personId) 
    System.out.println(personId);
    System.out.println("test");
    return "redirect:/external";

【讨论】:

使用 method=GET 删除用户,这是一个好习惯吗? @user641887 其实这里并不是通过GET方式删除用户,只是通过GET方式传递了一个id,删除操作可以通过一些POST方式的web服务来进行。 我能够使用 - RequestParam 注释获得删除工作。删除不适用于@PathVariable。试图了解它们的不同之处。 实际上,我得到了它的双向工作。忽略我上面的评论。在 Spring 中实现 Delete 的更好方法是什么 - RequestParam 或使用 PathVariable【参考方案2】:

下面是视图部分。

<tbody>
<tr th:each="income : $incomes">
<td th:text="$income.createDate"></td>
<td th:text="$income.name"></td>
<td th:text="$income.description"></td>
<td th:text="$income.amount"></td>
<td><a th:href="@/income/edit/id(id=$income.id)" class="btn btn-primary"><i class="fas fa-user-edit ml-2"></i></a></td>
<td><a th:href="@/income/delete/id(id=$income.id)" class="btn btn-primary"><i class="fas fa-user-times ml-2"></i></a></td>
</tr>
</tbody>

下面是控制器

@GetMapping("/delete/id")
public String deleteIncome(@PathVariable(value = "id") Long id,Model model) 
    Income note = incomeRepo.findById(id)
            .orElseThrow(() -> new ResourceNotFoundException("Income", "id", id));
    incomeRepo.delete(note);
    model.addAttribute("incomes",incomeRepo.findAll());
    return "viewIncome";

在视图部分的上述代码中,我将 id 传递给控制器​​。然后在controller中通过查找id,删除相关记录。

【讨论】:

【参考方案3】:

带有 Thymeleaf 的 HTML:

  <table class="table table-responsive">

        <th >
            <td>ID</td>
            <td>Name</td>
            <td>Address</td>
            <td>Delete</td>
        </th>

        <tr th:each="student : $students">
            <td th:text="$student.id"/>
            <td th:text="$student.name"/>
            <td th:text="$student.address"/>
            <td >
              <form th:action="@delete" method="post">
                  <input type="hidden" name="id" th:value="$student.id" />
                  <input type="submit" value="Delete" class="btn btn-danger" />
              </form>
            </td>
        </tr>
    </table>

控制器:

@RequestMapping(value = "/delete", method = RequestMethod.POST)
private String deleteStudent(@RequestParam String id)
    System.out.println("Student_Id : "+id);
    return "redirect:/display";

带有 Thymeleaf 的 HTML:

  <table class="table table-responsive">

        <th >
            <td>ID</td>
            <td>Name</td>
            <td>Address</td>
            <td>Delete</td>
        </th>

        <tr th:each="student : $students">
            <td th:text="$student.id"/>
            <td th:text="$student.name"/>
            <td th:text="$student.address"/>
            <td >
                <a th:href="@delete/__$student.id__" class="btn btn-danger">Delete</a>
            </td>
        </tr>
    </table>

控制器:

@RequestMapping(value = "/delete/id")
private String deleteStudent(@PathVariable(name = "id") String id)
    System.out.println("Student_Id : "+id);
    return "redirect:/display";

【讨论】:

以上是关于spring thymeleaf - 从 html 表中删除对象并将 id 传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf/Spring - 将项目从组合框添加到表中

使用 Thymeleaf 和 Spring Boot 将我的 HTML 中的整数数组传递给控制器

在thymeleaf spring框架中从本地目录插入图像(使用maven)

带有 Thymeleaf 的 Spring Boot - 未找到 css

Spring Boot中添加Thymeleaf模板

将数据从 html 发送到 Thymeleaf 中的控制器?