SpringMVC教程之HiddenHttpMethodFilter过滤器

一、前言

在使用HiddenHttpMethodFilter过滤器之前大家得先了解REST风格的URL。我们常用的请求是POST和GET,而REST风格的URL还有PUT和DELETE请求,这四种请求对应的是数据库的CURD。POST对应新增,PUT对应修改, GET对应查询,DELETE对应删除。
通常的浏览器都只支持POST和GET,而DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与DELETE 请求。HiddenHttpMethodFilter过滤器可以将POST请求转换为PUT和DELETE 请求。
示例:

  • /order/1 HTTP GET :得到 id = 1 的 order
  • /order/1 HTTP DELETE:删除 id = 1的 order
  • /order/1 HTTP PUT:更新id = 1的 order
  • /order HTTP POST:新增 order

SpringMVC教程之HiddenHttpMethodFilter过滤器的照片 - 1
HiddenHttpMethodFilter的父类是OncePerRequestFilter,它继承了父类的doFilterInternal方法,工作原理是将jsp页面的form表单的method属性值在doFilterInternal方法中转化为标准的Http方法,即GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE,然后到Controller中找到对应的方法。例如,在使用注解时我们可能会在Controller中用于@RequestMapping(value = “list”, method = RequestMethod.PUT),所以如果你的表单中使用的是<form method=”put”>,那么这个表单会被提交到标了Method=”PUT”的方法中。但是由于doFilterInternal方法只对method为POST的表单进行过滤,所以在页面中必须如下设置:

<form action="..." method="post">  
        <input type="hidden" name="_method" value="put" />  
        ......  
</form>  

而不是使用

<form action="..." method="put">  
        ......  
</form>  

通过查看HiddenHttpMethodFilter源代码我们知道,过滤器将POST请求转换为我们对应的PUT跟DELETE请求的时候需要有一个name为_method的参数。

二、案例

♦配置web.xml文件
HiddenHttpMethodFilter必须配置在dispatcher前面

<!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter可以将POST转换成DELETE和PUT请求 -->
<filter>
	<filter-name>hiddenHttpMethodFilter</filter-name>
	<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>hiddenHttpMethodFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

♦然后写一个页面发出POST请求,当然别忘了带一个name为_method的参数,这个参数可以通过隐藏域来传递

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试</title>
</head>
<body>
	<form action="springmvctest/testHiddenHttpMethodFilter/1" method="post">
        	<input type="hidden" name="_method" value="PUT"/>
        	<input type="submit" value="testHiddenHttpMethodFilter PUT"/>
        </form>
        <br>
    
        <form action="springmvctest/testHiddenHttpMethodFilter/1" method="post">
            <input type="hidden" name="_method" value="DELETE"/>
            <input type="submit" value="testHiddenHttpMethodFilter DELETE"/>
        </form>
        <br>
        
        <form action="springmvctest/testHiddenHttpMethodFilter" method="post">
            <input type="submit" value="testHiddenHttpMethodFilter POST"/>
        </form>
        <br>
        
        <a href="springmvctest/testHiddenHttpMethodFilter/1">Test HiddenHttpMethodFilter Get</a>
        <br>
</body>
</html>

♦接下来写对应的方法,进行简单测试即可

@RequestMapping(value = "/testHiddenHttpMethodFilter/{id}", method = RequestMethod.PUT)
public String testHiddenHttpMethodFilterPut(@PathVariable Integer id) {
        System.out.println("testHiddenHttpMethodFilter Put: " + id);
        return "update";
}

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

@RequestMapping(value = "/testHiddenHttpMethodFilter", method = RequestMethod.POST)
    public String testHiddenHttpMethodFilter() {
        System.out.println("testHiddenHttpMethodFilter POST");
        return "add";
}

@RequestMapping(value = "/testHiddenHttpMethodFilter/{id}", method = RequestMethod.GET)
public String testHiddenHttpMethodFilter(@PathVariable Integer id) {
        System.out.println("testHiddenHttpMethodFilter GET: " + id);
        return "search";
}

注意到了吗?HiddenHttpMethodFilter帮助我们实现对PUT请求和DELETE请求的模拟。它会将带有隐藏域_method的POST请求转换为PUT请求和DELETE请求提交给服务器。
过程:
SpringMVC教程之HiddenHttpMethodFilter过滤器的照片 - 3
点击四个链接和表单按钮:
SpringMVC教程之HiddenHttpMethodFilter过滤器的照片 - 5
SpringMVC教程之HiddenHttpMethodFilter过滤器的照片 - 7
SpringMVC教程之HiddenHttpMethodFilter过滤器的照片 - 9
SpringMVC教程之HiddenHttpMethodFilter过滤器的照片 - 11
控制台输出结果:

testHiddenHttpMethodFilter GET: 1
testHiddenHttpMethodFilter POST
testHiddenHttpMethodFilter Delete: 1
testHiddenHttpMethodFilter Put: 1

至此,我们关于SpringMVC教程之HiddenHttpMethodFilter过滤器介绍完毕。想要了解更多关于SpringMVC开发的教程,请参考http://www.marsitman.com/springmvc
博客地址:http://www.marsitman.com/springmvc/springmvc-hiddenhttpmethodfilter.html
版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。

 

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!



点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注