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";
}

但对于 DELETEPUT而言则无法通过简单的注解标明实现,因此为了能够使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
}

在这段处理代码中,只针对了 POSTWebUtils.ERROR_EXCEPTION_ATTRIBUTE为空的请求进行处理,并且最终返回请求类型为method的value,因此SpringMVC处理DELETE、PUT等附加请求时,需要遵守 Method 为  POST且存在类型为 hiddennamemethodvalue 为指定请求方式的隐藏域约定,默认格式表单如下

<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风格请求实现的更多相关文章

  1. SpringMVC学习笔记一(请求流程和配置,启动项目)

    springmvc请求流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映 ...

  2. 史上最全的SpringMVC学习笔记

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  3. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

  4. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

  5. SpringMVC:学习笔记(3)——REST

    SpringMVC:学习笔记(3)——REST 了解REST风格 按照传统的开发方式,我们在实现CURD操作时,会写多个映射路径,比如对一本书的操作,我们会写多个URL,可能如下 web/delete ...

  6. springmvc学习笔记---面向移动端支持REST API

    前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...

  7. SpringMVC:学习笔记(8)——文件上传

    SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...

  8. springmvc学习笔记(简介及使用)

    springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...

  9. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

随机推荐

  1. Spring Boot demo系列(六):HTTPS

    2021.2.24 更新 1 概述 本文演示了如何给Spring Boot应用加上HTTPS的过程. 2 证书 虽然证书能自己生成,使用JDK自带的keytool即可,但是生产环境是不可能使用自己生成 ...

  2. 13.Quick QML-RowLayout、ColumnLayout、GridLayout布局管理器介绍、并通过GridLayout设计的简易网站导航界面

    上章我们学习了:12.Quick QML-QML 布局(Row.Column.Grid.Flow和嵌套布局) .Repeater对象,本章我们继续来学习布局管理器 1.RowLayout.Column ...

  3. redis实际应用-限流

    为什么要做限流 首先让我们先看一看系统架构设计中,为什么要做"限流". 旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票 ...

  4. WordPress 缩率图学习笔记

    WordPress 缩率图学习笔记 Wordpress在生成缩略图的过程中,有两种不同的规则 缩放模式:缩放模式就是将图片等比例缩小,且新生成的缩略图长度或高度两者之中,有一个是你设置的缩略图的尺寸 ...

  5. overflow和absolute之间的问题,transfrom可以解决

    CSS代码: .overflow { width: 191px; height: 191px; border: 2px solid #beceeb; overflow: hidden; } .over ...

  6. Think5之ajax批量删除数据功能

    //批量删除学员信息 public function deleteMany() { $id = input('post.'); //判断id是数组还是一个数值 if(is_array($id)){ f ...

  7. DexHunter的原理分析和使用说明(一)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53710357 Android通用脱壳工具DexHunter是2015年下半年,大牛 ...

  8. UVA10020(最小区间覆盖)

    题意:       给你一个区间[0,m]和一些小的区间[l,r]让你选择最少的小区间个数去把整个区间覆盖起来. 思路:       算是比较经典的贪心题目吧(经典于难度没什么对应关系),大体思路可以 ...

  9. Cauchy-Binet 公式的应用

    Binet-Cauchy 公式 我们知道,方阵的行列式不是方阵的线性函数,即对 \(\forall \lambda\in F,A,B\in F^{n\times n}\),有 \(det(A+B)\n ...

  10. vue的快速入门【IDEA版本】

    和vscode相比,使用IDEA进行前端开发并没有那么容易,需要先进行配置 . 安装vue插件,重启idea 鼠标右键添加vue component 点击 file 打开设置 settings,展开 ...