【SpringMVC笔记整理六】RESTful风格

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/104613756







RESTful(Representational State Transfer,资源表现层状态转换),说的专业点它是一种交互类的软件设计风格的架构。其实我认为它就是一个 HTTP 请求方法的规则而以,我们传统的请求方法有 GETPOST,而 RESTful 风格的请求方法有 GET、POST、PUT、DELETE 四种请求方法,这四种请求方法分别代表四种 CRUD 的资源操作:

  • GET: 用来获取资源(R);
  • POST: 用来创建资源(C);
  • PUT: 用来修改资源(U);
  • DELETE: 用来删除资源(D)。

对于 RESTful 架构也有很多好处:

  1. URL 传参更加简洁:

    传统的 URL:http://localhost:8080/test?id=1

    RESTful:http://localhost:8080/test/1

  2. 完成不同终端之间的资源共享,RESTful 提供了一套规范,不同终端之间只需要遵守该规范,就可以实现数据交互。

Spring MVC 默认是支持 RESTful 架构。本篇博客主要讲解 Spring MVC 中的 RESTful 架构。


一、HiddenHttpMethodFilter

在页面表单中只支持 GETPOST 的请求方法,不支持 PUTDELETE,为了支持 PUTDELETE,在 Spring 3.0 的时候添加了一个过滤器,可以将这些请求转换为标准的 HTTP 方法,使得支持 GET、POST、PUT 和 DELETE 请求,该过滤器就是 HiddenHttpMethodFilter

HiddenHttpMethodFilter 过滤器是可以检测请求参数中是否包含了 _method 参数,如果包含则获取该参数的值,将值作为请求的方法。

以下是一个接收 PUTDELETE 请求方法的小例子:

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 来测试 PUTDELETE 时,可能会在浏览器中报 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";   // 转发后面必须跟完整的视图
}


博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章