😀前言
本篇讲解了Spring-Rest- url 请求风格
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
🥰教会你什么是Spring-Rest- url 请求风格
😊Rest-基本介绍
● 说明
1. REST:即 Representational State Transfer。(资源)表现层状态转化。是目前流行的请求方式。它结构清晰, 很多网站采用
2. HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源
实例
传统的请求方法:
getBook?id=1 GET
delete?id=1 GET
update POST
add POST
说明:
传统的 url 是通过参数来说明 crud 的类型,rest 是通过 get/post/put/delete 来说明 crud 的类型
● REST 的核心过滤器
1. 当前的浏览器只支持 post/get 请求,因此为了得到 put/delete 的请求方式需要使用 Spring提供的 HiddenHttpMethodFilter 过滤器进行转换.
2. HiddenHttpMethodFilter:浏览器 form 表单只支持 GET 与 POST 请求,而 DELETE、PUT等 method 并不支持,Spring 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求
3. HiddenHttpMethodFilter 能对 post 请求方式进行转换,因此我们需要特别的注意这一点
4. 这个过滤器需要在 web.xml 中配置
😉代码说明Rest 风格的 url-完成增删改
需求说明
修改 web.xml 添加 HiddenHttpMethodFilter
1. 作用是 把 以post方式提交的delete和put请求进行转换
2. 配置url-pattern 是 /* 表示请求都经过 hiddenHttpMethodFilter过滤
3. 后面通过debug源码,就看的很清楚
<!--配置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>
修改 springDispatcherServlet-servlet.xml
作用
加入两个常规配置
支持SpringMVC的高级功能,比如JSR303校验, 映射动态请求
将springmvc不能处理的请求,交给tomcat处理,比如css, js
<!--加入两个常规配置--> <!--支持SpringMVC的高级功能,比如JSR303校验, 映射动态请求--> <mvc:annotation-driven></mvc:annotation-driven> <!--将springmvc不能处理的请求,交给tomcat处理,比如css, js-->
创建rest.jsp
注意
需要引入 jquery, 测试的时 候查询/添加/删除/修改一个一个的来
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>rest </title> <%-- 引入jquery--%> <script type="text/javascript" src="script/jquery-3.6.0.min.js"></script> <script type="text/javascript"> $(function () { //当页面加载完成后,就执行=> 如果你完全忘记,去回顾我们讲过的jquery //给删除超链接绑定一个点击事件 $("#deleteBook").click(function (){ //alert("点击。。。。"); //我们自己定义给提交的行为 $("#hiddenForm").attr("action", this.href); $(":hidden").val("DELETE"); $("#hiddenForm").submit(); return false; //改变点击超链接的行为, 不在提交 }) }) </script> </head> <body> <h3>Rest风格的crud操作案例</h3> <br><hr> <h3>rest风格的url 查询书籍[get]</h3> <a href="user/book/200">点击查询书籍</a> <br><hr> <h3>rest风格的url 添加书籍[post]</h3> <form action="user/book" method="post"> name:<input name="bookName" type="text"><br> <input type="submit" value="添加书籍"> </form> <br><hr> <h3>rest风格的url, 删除一本书</h3> <a href="user/book/600" id="deleteBook">删除指定id的书</a> <form action="" method="post" id="hiddenForm"> <input type="hidden" name="_method"/> </form> <br><hr> <h3>rest风格的url 修改书籍[put]~</h3> <form action="user/book/666" method="post"> <input type="hidden" name="_method" value="PUT"> <input type="submit" value="修改书籍~"> </form> </body> </html>
🧐解读
删除为什么要这么弄
1. 默认情况下 删除指定id的书 是get
2. 怎么样将 get 请求转成 springmvc 可以识别的 delete 就要考虑HiddenHttpMethodFilter机制
public static final String DEFAULT_METHOD_PARAM = "_method"; --------------------------------------------------- private static final List<String> ALLOWED_METHODS = Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.PATCH.name())); --------------------------------------------------- if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) { String paramValue = request.getParameter(this.methodParam); if (StringUtils.hasLength(paramValue)) { String method = paramValue.toUpperCase(Locale.ENGLISH); if (ALLOWED_METHODS.contains(method)) { requestToUse = new HttpMethodRequestWrapper(request, method); } } }
3. 上面代码可以看到 HiddenHttpMethodFilter 过滤器
可以对以Post方式提交的delete,put,patch进行转换,
成springmvc识别的 RequestMethod.DELETE / RequestMethod.PUT /...
4. 我们需要将
get 删除指定id的书 以post方式提交给后端handler,
这样过滤器还会生效
5. 我们可以同jquery来处理-引入jquery
创建BookHandler.java , 处 理 rest 风格的请求
1. redirect:/user/success重定向
2. 会被解析成 /springmvc/user/success
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; /** * BookHandler处理rest风格的请求-增删改查 */ @RequestMapping("/user") @Controller public class BookHandler { //查询[GET] @RequestMapping(value = "/book/{id}", method = RequestMethod.GET) public String getBook(@PathVariable("id") String id) { System.out.println("查询书籍 id=" + id); return "success"; } //添加[POST] @PostMapping(value = "/book") public String addBook(String bookName) { System.out.println("添加书籍 bookName== " + bookName); return "success"; } //删除[DELETE] @RequestMapping(value = "/book/{id}", method = RequestMethod.DELETE) public String delBook(@PathVariable("id") String id) { System.out.println("删除书籍 id= " + id); //return "success"; //[如果这样返回会报错 JSPs only permit GET POST or HEAD] //解读 //1. redirect:/user/success重定向 //2. 会被解析成 /springmvc/user/success return "redirect:/user/success"; } //如果请求是 /user/success , 就转发到 success.jsp //successGenecal对应的url http://ip:port/springmvc/user/success @RequestMapping(value = "/success") public String successGenecal() { return "success"; //由该方法 转发到success.jsp页面 } //修改[PUT] @PutMapping(value = "/book/{id}") public String updateBook(@PathVariable("id") String id) { System.out.println("修改书籍 id=" + id); return "redirect:/user/success"; } }
🧐注意事项和细节说明
1、HiddenHttpMethodFilter,在将 post 转成 delete / put 请求时,是按_method 参数名 来读取的如果 web 项目是运行在 Tomcat 8 及以上,会发现被过滤成 DELETE 和 PUT 请求,到达控制器时能顺利执行,但是返回时(forward)会报 HTTP 405 的错误提示:消息 JSP 只允许 GET、POST 或 HEAD。
1) 解决方式 1: 使用 Tomcat7
2) 解决方式 2: 将请求转发(forward)改为请求重定向(redirect):重定向到一个 Handler,由 Handler转发到页面
3、页面测试时, 如果出现点击修改书籍,仍然走的是删除 url ,是因为浏览器原因(缓存等原 因), 换成 chrome 即可
😄总结
DELETE、PUT等 method 并不支持,Spring 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求
HiddenHttpMethodFilter 能对 post 请求方式进行转换,因此我们需要特别的注意这一点
这个过滤器需要在 web.xml 中配置
REST:即 Representational State Transfer。(资源)表现层状态转化。是目前流行的请求方式。它结构清晰, 很多网站采用
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞