删除控制器不起作用

时间:2014-12-28 09:01:52

标签: java spring-mvc jtwig

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

@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请求,但这不起作用。

3 个答案:

答案 0 :(得分:8)

通过HTTP进行通信时,有一堆methods available。最常见的是GET,PUT,POST和DELETE。

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

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

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

一种替代方案是使用例如jQuery's ajax-method

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

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

curl -X DELETE "http://myhost:port/users/someUserId"

答案 1 :(得分:1)

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

答案 2 :(得分:0)

正如其他人所说,你的html表格将发送POST,因为这是你的行动。

如果你想保留按钮并在没有javascript的情况下删除(AJAX调用) 那么你应该尝试更改java方面的url模式,并将删除按钮html分成单独的形式

@RequestMapping(value =&#34; / users / delete / {id}&#34;,method = RequestMethod.POST)