SpringMVC ------HiddenHttpMethodFilter 过滤器

可紊 提交于 2019-11-30 14:18:06

    Spring3.0以后添加了HiddenHttpMethodFilter过滤器,来支持支持Rest 风格的URL请求。

    REST  url:

          —  /order/1  HTTP GET  :得到 id = 1 的order

          —  /order/1  HTTP DELETE  :删除 id = 1 的order

          —  /order/1  HTTP PUT  :更新 id = 1 的order

          —  /order/1  HTTP POST :新增 id = 1 的order

    首先配置到web.xml文件中

<!-- 可以报POST转成DELETE请求 或POST 请求 -->
<filter>
    <filter-name>HiddenHttperMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

<filter-mapping>
    <filger-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  在POST的 请求中设置参数 _method="DELETE" 

<form action="/test/order/1" method="post">
    <input type="hidden" name="_method" value="DELETE" />
    <input type="submit" value="test delete" />
</form>

<form action="/test/order/1" method="post">
    <input type="hidden" name="_method" value="PUT" />
    <input type="submit" value="test PUT" />
</form>

    编写Java方法

@RequestMapping(value="/testRest/{id}",method=RequestMethod.DELETE)
public String testRest(@PathVariable Integer id){
    System.out.println("test delete:"+id);
    return "success";
}

@RequestMapping(value="/testRest/{id}",method=RequestMethod.PUT)
public String testRest(@PathVariable Integer id){
    System.out.println("test delete:"+id);
    return "success";
}

    原来,在HiddenHttpMethodFilter中的doFilterInternal ,会先去POST请求中获取_method这个参数,根据参数的名字来转发请求。

    注意:如果你使用ajax进行传输数据,那么你也应该按照上面的方式做。在你传输数据data里面包含:_method:"PUT"的键值对,并且传输方式依旧设置为"POST".

    不然,你用ajax用"PUT"的方式请求,SpringMVC将无法找到你所要传输的数据,throw Handler execution resulted in exception: Request method 'POST' not supported 这样的异常信息。

    看源代码可以知道,在SpingMVC中本质上只识别GET,POST!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!