SpringMVC学习笔记-REST风格请求实现
RESTful概念及功能
RESTful的概念:RESTful是 一种资源定位及资源操作的风格,其本身既不是标准也不是协议,而是一种设计风格,可以使得软件整体层次更加分明、代码更加简洁,并且有利于实现缓存等机制。
RESTful的功能:RESTful主要体现在对软件资源的操作上,把请求方法分为了POST、DELETE、PUT、GET四个部分,各个方法对资源进行操作分别对应了增删改查四个功能,使得代码整体层次分明。
RESTful与传统操作资源的对比:传统方式对资源操作形式单一,只有GET、POST两种方式,对于增删改查各种方式往往难以加以区分,且部分参数在url中过于暴露,各种不同参数实现不同效果
http://127.0.0.1/user/query?id=1 ;查询用户(GET)
http://127.0.0.1/user/add ;新增用户(POST)
http://127.0.0.1/user/update ;更新用户(POST)
http://127.0.0.1/user/delete?id=1 ;删除用户(GET或POST)而RESTful确能很好地解决这个问题,可以将增删改查分为POST、DELETE、PUT、GET,并可以通过相同的请求地址实现
http://127.0.0.1/user/1 ;查询用户(GET)
http://127.0.0.1/user ;新增用户(POST)
http://127.0.0.1/user ;更新用户(PUT)
http://127.0.0.1/user/1 ;删除用户(DELETE)
SpringMVC实现RESTful风格
在传统jsp及大部分浏览器中只能处理POST、GET请求,在SpringMVC中针对这两种请求可以正常处理,并且在该框架控制器 @RequestMapping 注解中提供了method参数用以注明请求方式,可以使同参数请求实现不同功能
@RequestMapping(value="testRest/{id}",method = RequestMethod.POST)
public String testPost(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
@RequestMapping(value="testRest/{id}",method = RequestMethod.GET)
public String testGet(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
但对于 DELETE、 PUT而言则无法通过简单的注解标明实现,因此为了能够使RESTful风格能够正常实现,SpringMVC中通过在Filter过滤器中添加 HiddenHttpMethodFilter类处理来实现对DELETE、PUT的处理, HiddenHttpMethodFilter类源码中对请求的处理如下:
/** Default method parameter: {@code _method}. */
public static final String DEFAULT_METHOD_PARAM = "_method"; //默认_method规范
private String methodParam = DEFAULT_METHOD_PARAM;
/**
* Set the parameter name to look for HTTP methods.
* @see #DEFAULT_METHOD_PARAM
*/
public void setMethodParam(String methodParam) {
Assert.hasText(methodParam, "'methodParam' must not be empty");
this.methodParam = methodParam;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpServletRequest requestToUse = request;
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) { //POST及隐藏域条件判断
String paramValue = request.getParameter(this.methodParam); // 获取name为_method的value
if (StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
if (ALLOWED_METHODS.contains(method)) {
requestToUse = new HttpMethodRequestWrapper(request, method); //将name为_method的value设置为新的请求方式
}
}
}
filterChain.doFilter(requestToUse, response); // 返回更改后的request
}
在这段处理代码中,只针对了 POST和 WebUtils.ERROR_EXCEPTION_ATTRIBUTE为空的请求进行处理,并且最终返回请求类型为method的value,因此SpringMVC处理DELETE、PUT等附加请求时,需要遵守 Method 为 POST且存在类型为 hidden 、name 为 method 、value 为指定请求方式的隐藏域约定,默认格式表单如下
<form action="SpringMVCHandler/testRest/1234" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="删">
</form>
在经过HiddenHttpMethodFilter过滤器处理后,系统交由controller处理,此时@RequestMapping便可成功识别请求类型,成功完成映射跳转。
@RequestMapping(value="testRest/{id}",method = RequestMethod.DELETE)
public String testDelete(@PathVariable("id") Integer id){
System.out.println("删"+id);
return "success";
}
运行中存在的问题及解决方法
在SpringMVC的RESTful风格实现过程中,往往会遇到一系列问题,这里便给出一些常见问题及其解决方法。
请求兼容问题:在按照上述步骤运行时,极大可能会遇到这一问题:

产生原因:通常这一问题是由于jsp对于DELETE、PUT请求不兼容造成的,在HiddenHttpMethodFilter过滤器将请求处理完成后交由controller处理,但在传统SpringMVC控制器映射处理后,都会返回目标文件名字符串再由配置xml中的视图解析器对返回字符串进行前后缀追加处理,在这过程中DELETE、PUT请求便由jsp处理了,因此便出现了这一问题。
解决方法:针对这一问题,只需要在控制器映射方法前增加@ResponseBody()注释表明返回的时json而不是jsp即可,使返回时跳过视图解析器,因此不会产生请求兼容错误。
中文乱码问题:在表单中传入中文时,可能会产生乱码问题。
产生原因:在发送请求时,虽然jsp页面已经设置了charset=“UTF-8”,但其实页面编码类型还是默认的ISO-8859-1,因此在接收时便会产生乱码。
解决方法:可以参考Java Web中利用Filter过滤器进行编码处理来解决这一问题。
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
System.out.println("haha");
chain.doFilter(req, resp);
}但在SpringMvc中使用改该方法解决编码问题时还需要注意过滤先后问题,即如果在web.xml配置文件中HiddenHttpMethodFilter过滤器位于编码过滤器之前,则在编码过滤器处理编码之前先由HiddenHttpMethodFilter过滤器处理,这样依旧会造成乱码问题,因此需要注意配置文件中过滤器映射先后顺序,尽量将编码过滤器位于最上方,并且不要使用注释方法实现过滤器映射。
SpringMVC学习笔记-REST风格请求实现的更多相关文章
- SpringMVC学习笔记一(请求流程和配置,启动项目)
springmvc请求流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映 ...
- 史上最全的SpringMVC学习笔记
SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...
- springmvc学习笔记(19)-RESTful支持
springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...
- SpringMVC:学习笔记(3)——REST
SpringMVC:学习笔记(3)——REST 了解REST风格 按照传统的开发方式,我们在实现CURD操作时,会写多个映射路径,比如对一本书的操作,我们会写多个URL,可能如下 web/delete ...
- springmvc学习笔记---面向移动端支持REST API
前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...
- SpringMVC:学习笔记(8)——文件上传
SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...
- springmvc学习笔记(简介及使用)
springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...
- springmvc学习笔记(常用注解)
springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...
随机推荐
- Spring Boot demo系列(六):HTTPS
2021.2.24 更新 1 概述 本文演示了如何给Spring Boot应用加上HTTPS的过程. 2 证书 虽然证书能自己生成,使用JDK自带的keytool即可,但是生产环境是不可能使用自己生成 ...
- 13.Quick QML-RowLayout、ColumnLayout、GridLayout布局管理器介绍、并通过GridLayout设计的简易网站导航界面
上章我们学习了:12.Quick QML-QML 布局(Row.Column.Grid.Flow和嵌套布局) .Repeater对象,本章我们继续来学习布局管理器 1.RowLayout.Column ...
- redis实际应用-限流
为什么要做限流 首先让我们先看一看系统架构设计中,为什么要做"限流". 旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票 ...
- WordPress 缩率图学习笔记
WordPress 缩率图学习笔记 Wordpress在生成缩略图的过程中,有两种不同的规则 缩放模式:缩放模式就是将图片等比例缩小,且新生成的缩略图长度或高度两者之中,有一个是你设置的缩略图的尺寸 ...
- overflow和absolute之间的问题,transfrom可以解决
CSS代码: .overflow { width: 191px; height: 191px; border: 2px solid #beceeb; overflow: hidden; } .over ...
- Think5之ajax批量删除数据功能
//批量删除学员信息 public function deleteMany() { $id = input('post.'); //判断id是数组还是一个数值 if(is_array($id)){ f ...
- DexHunter的原理分析和使用说明(一)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53710357 Android通用脱壳工具DexHunter是2015年下半年,大牛 ...
- UVA10020(最小区间覆盖)
题意: 给你一个区间[0,m]和一些小的区间[l,r]让你选择最少的小区间个数去把整个区间覆盖起来. 思路: 算是比较经典的贪心题目吧(经典于难度没什么对应关系),大体思路可以 ...
- Cauchy-Binet 公式的应用
Binet-Cauchy 公式 我们知道,方阵的行列式不是方阵的线性函数,即对 \(\forall \lambda\in F,A,B\in F^{n\times n}\),有 \(det(A+B)\n ...
- vue的快速入门【IDEA版本】
和vscode相比,使用IDEA进行前端开发并没有那么容易,需要先进行配置 . 安装vue插件,重启idea 鼠标右键添加vue component 点击 file 打开设置 settings,展开 ...