6

我真的开始为我的小应用程序使用控制器,我现在有这个:

@RequestMapping("/users/{id}")
public ModelAndView showMemeber(@PathVariable Integer id) {

    ModelAndView mav = new ModelAndView("user/show");

    mav.addObject("title", "Show User");
    mav.addObject("user", userService.findById(id));
    return mav;

}

@RequestMapping(value="/users/{id}", method=RequestMethod.DELETE)
public String deleteMemeber(@PathVariable Integer id) {

    userService.delete(id);

    return "redirect:users";

}

第一个工作正常,但第二个没有,我对第一个控制器有以下视图:

<div class="panel-heading">Personal information</div>
<div class="panel-body">

  <form method="post">

    ...

    <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-pencil"></span> Edit</button>
    <button type="submit" class="btn btn-danger" onclick="return confirm('Are you sure you want to delete {{ user.username }}?')"><span class="glyphicon glyphicon-remove"></span> Delete</button>
  </form> 
</div>

如您所见,我这里有两个按钮,一个用于编辑对象,一个用于删除它。一旦删除它,必须重定向到https://<my domain>/users.

问题是,当我单击Delete它时,只需刷新页面并且对象会保留在数据库中,这里有什么问题?

  • 我尝试发送DELETE类似的请求,curl -X "DELETE" http://localhost:8080/my-app/users/18但这没有用。
4

3 回答 3

8

通过 HTTP 进行通信时,有很多方法可用。最常见的是 GET、PUT、POST 和 DELETE。

在您的控制器中,您声明您期望一个 DELETE 请求:

@RequestMapping(value="/users/{id}", method=RequestMethod.DELETE)
public String deleteMemeber(@PathVariable Integer id) {...}

默认情况下浏览器不支持此功能 - 浏览器仅支持 POST 和 GET。为了从浏览器发送删除请求,您必须使用 JavaScript。

一种替代方法是使用例如jQuery 的 ajax 方法

$.ajax({
    url: '/users/' + someUserId,
    type: 'DELETE',
    success: function(result) {
        // Do something with the result
    }
});

测试删除请求的一种方法是使用命令 cUrl:

curl -X DELETE "http://myhost:port/users/someUserId"
于 2014-12-28T11:29:16.333 回答
1

正如其他人所提到的,您实际上并没有发送 HTTP DELETE 请求。您的删除按钮是表单帖子的一部分,因此当您提交表单时,它实际上会发送 HTTP POST 请求。其他人已经展示了一些调用 DELETE(Ajax 和 CURL)的方法,但我发现最简单的方法是在您喜欢的浏览器上安装插件。如果您使用的是 Chrome,您可以尝试 Advanced Rest Client 扩展等。

于 2015-02-11T10:55:18.293 回答
0

正如其他人所说,您的 html 表单将发送 POST,因为这是您的操作。

如果您想保留按钮并在没有 javascript(AJAX 调用)的情况下进行删除,那么您应该尝试更改 java 端的 url 模式,并将删除按钮 html 放在单独的形式中

@RequestMapping(value="/users/delete/{id}", method=RequestMethod.POST)

于 2015-02-13T18:22:55.943 回答