版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/104613756
文章目录
RESTful(Representational State Transfer,资源表现层状态转换),说的专业点它是一种交互类的软件设计风格的架构。其实我认为它就是一个 HTTP 请求方法的规则而以,我们传统的请求方法有 GET 和 POST,而 RESTful 风格的请求方法有 GET、POST、PUT、DELETE 四种请求方法,这四种请求方法分别代表四种 CRUD 的资源操作:
- GET: 用来获取资源(R);
- POST: 用来创建资源(C);
- PUT: 用来修改资源(U);
- DELETE: 用来删除资源(D)。
对于 RESTful 架构也有很多好处:
URL 传参更加简洁:
传统的 URL:http://localhost:8080/test?id=1
RESTful:http://localhost:8080/test/1
完成不同终端之间的资源共享,RESTful 提供了一套规范,不同终端之间只需要遵守该规范,就可以实现数据交互。
Spring MVC 默认是支持 RESTful 架构。本篇博客主要讲解 Spring MVC 中的 RESTful 架构。
一、HiddenHttpMethodFilter
在页面表单中只支持 GET 和 POST 的请求方法,不支持 PUT 和 DELETE,为了支持 PUT 和 DELETE,在 Spring 3.0 的时候添加了一个过滤器,可以将这些请求转换为标准的 HTTP 方法,使得支持 GET、POST、PUT 和 DELETE 请求,该过滤器就是 HiddenHttpMethodFilter。
HiddenHttpMethodFilter 过滤器是可以检测请求参数中是否包含了
_method
参数,如果包含则获取该参数的值,将值作为请求的方法。以下是一个接收 PUT 和 DELETE 请求方法的小例子:
1、配置 HiddenHttpMethodFilter 过滤器
我们需要先在
web.xml
中配置 HiddenHttpMethodFilter 过滤器。
<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>
2、PUT 和 DELETE 的表单
在 form 表单中添加隐藏域标签,
name="_method"
和value="PUT" 或 value="DELETE"
。
<!-- PUT 表单 -->
<form action="/rest/put" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit"/>
</form>
<!-- DELETE 表单 -->
<form action="/rest/delete" method="post">
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit"/>
</form>
3、测试控制器
写一个控制器,用于测试接收 PUT 的业务方法 和 测试接收 DELETE 的业务方法:
@Controller
@RequestMapping("/rest")
public class RestHandler {
// 用来接收 PUT 请求方法
@RequestMapping(value = "/put", method = RequestMethod.PUT)
@ResponseBody
public String rest(){
System.out.println("rest");
return "PUT";
}
// 用来接收 DELETE 请求方法
@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
@ResponseBody
public String delete(){
System.out.println("delete");
return "DELETE";
}
}
4、可能会出现的问题
也许你在使用 Spring MVC 来测试 PUT 或 DELETE 时,可能会在浏览器中报 405 错误,但在控制台没有报错,一切正常。
你可以参考我之前写的博客:[SpringMVC中写DELETE或PUT时遇到405错误
二、RESTful 带来的四个注解
RESTful 也为我们带来了可以简化代码书写的四个注解,它们的用法与 @RequestMapping 注解 相同,可以简化
method=RequestMethod.XXX
这句代码,但只能用在方法上,不能用在类上。如下:
1、@GetMapping
@GetMapping 注解 是 GET 映射注解,URL 的 GET 请求,在 Restful API 中代表查找。
@GetMapping("/get")
// 等价于
@RequestMapping(value = "/get", method = RequestMethod.GET)
2、@PostMapping
@PostMapping 注解 是 POST 映射注解,URL 的 GET 请求,在 Restful API 中代表添加。
@PostMapping("/post")
// 等价于
@RequestMapping(value = "/post", method = RequestMethod.POST)
3、@PutMapping
@PutMapping 注解 是 PUT 映射注解,URL 的 PUT 请求,在 Restful API 中代表更新。
@PutMapping("/put")
// 等价于
@RequestMapping(value = "/put", method = RequestMethod.PUT)
4、@DeleteMapping
@DeleteMapping 注解 是 DELETE 映射注解,URL 的 DELETE 请求,在 Restful API 中代表删除。
@DeleteMapping("/delete")
// 等价于
@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
三、JSP 页面的转发和重定向
在 Spring MVC 中默认以转发的形式来响应 JSP(如果浏览器地址栏没有改变,那就是转发),我们也可以手动设置为重定向,但在其后面必须跟完整的视图 URL。
// 重定向
@RequestMapping("/test")
public String test() {
return "redirect:/test.jsp"; // 重定向后面必须跟完整的视图
}
转发也能这样写:
// 转发
@RequestMapping("/test")
public String test() {
return "forward:/test.jsp"; // 转发后面必须跟完整的视图
}