SpringMVC对restful请求的支持

[1] restful格式请求的介绍

问题:

目前我们浏览器发起请求给服务器的时候,一般我们常用的请求方式有两个,get post方式。不管get还是post方式,请求数据的格式都是键值对格式,get 方式请求数据是在请求地址上以问号隔开的形式,拼接在请求地址后,post请求 呢是有专门的请求实体的,例如:

get方式请求:

localhost:8080/project/aa?uname=zhangsan&age=18

post方式请求:

地址:localhost:8080/project/aa

请求数据:

uname=zhangsan

age=18

要求我们后台获取请求数据的代码,必须按照指定的键名来获取请求数据。键名

就是请求数据的键名。这样造成,一旦请求数据的键名发生变更,造成后台的逻辑

代码也需要进行变更。前台的请求数据的键名和后台的逻辑代码之间的耦合性过 ,造成前台和后台的开发过程中相互依赖性过高。怎么办?

解决:

让前台和后台代码之间进行解耦。也就说不再让请求请求数据的键名造成前后台

代码之间的依赖。前台请求数据的键名发生变更,不影响后台逻辑代码的正常执行

实现:

请求数据不再以键值对的形式发送给后台使用。直接发送数据本身给后台即可。

既然请求数据不再使用键值对,请求数据必须按照指定的格式来进行发送。使用

restful格式。

restful格式:

传统的get方式请求格式:

localhost:8080/project/aa?uname=zhangsan&age18

restful请求格式:

localhost:8080/project/aa/zhangsan/18

注意:

restful格式要求请求数据作为请求地址的一部分发送给后台使用。

[2] restful格式请求后台获取请求数据

问题:

按照以前键值对格式的请求数据,我们在后台直接使用req.getParameter方法

根据键名获取请求数据即可。但是在restful请求格式中,请求数据是作为请求

地址的一部分来进行发送的,那么在后台我们如何获取restful格式的请求数据呢?

解决:

从服务器的角度,服务器在接收到请求后,会根据请求地址调用对应的Servlet

来处理请求。

①传统请求格式的流程:

localhost:8080/project/aa?uname=zhangsan&age=18

服务器在接收到此请求后,会调用一个url-pattern为aa的Servlet来处理 请求

  ②restful格式请求的流程:

localhost:8080/project/aa/zhangsan/18
服务器在接收到此请求后,会调用一个url-pattern为aa/zhangsan/18的 Servlet来处理请求。

③通过原有方式和restful格式的请求流程处理的比较,在后台处理请求的Servlet 就不能针对的声明某个url-pattern值为确定值的Servlet来处理请求。创建一个 公共Servlet来处理请求,而公共的Servlet的url-pattern的值为”/”即可。除 jsp请求以外的所有的请求都会被该Servlet拦截处理,无需关心请求数据是单独 携带还是在请求地址中携带了。

④封装的公共的Servlet既可以处理键值对类型的请求,又可以处理restful格式 的请求。

实现:

必须在后台封装一个公共Servlet,该Servlet可以处理键值对请求,和restful

请求,并且能够按照执行的格式获取restful中的请求数据。

[3] SpringMVC对restful格式的支持

解释:

DispactherServlet拦截除jsp请求以外的所有请求,浏览器发起了一个

restful格式的请求,会被DispatcherServlet拦截处理。而DispatcherServlet

根据请求调用对应的单元方法处理请求。比如:

locahost:8080/project/aa/zhangsan/18

DispatcherServlet会调用一个@RequestMapping的值为”aa/zhangsan/18”

的单元方法来处理此次请求。但是restful格式请求的请求数据每次都不同,也就

说每次请求地址都不相同,我们无法声明对应的单元方法来处理请求。所以 SpringMVC在单员方法中使用指定的格式来进行模糊匹配,具体实现参照示例代 码。

示例代码:

/***
 * SpringMVC处理restful格式请求
 *
 * 1.
 *      在 @RequestMapping注解中可以使用{字母}来声明单元方法的拦截范围
 *      比如:
 *       @RequestMapping("aa/{uname}/{age}")
 *      表示请求地址要请求的单元方法以aa开头,后面为两位任意。
 * 2.
 *      我们可以在单元方法的形参声明上使用注解@PathVariable
 *      来告诉DispatcherServlet将请求地址中的数据截取后作为
 *      实参传递给单元方法使用,默认按照地址占位中的参数名和
 *      形参名一致的规则赋值,如果不一致可以在@PathVariable中
 *      指明赋值@PathVariable("un")
 *
 * 3.
 *  注意:
 *      说白了SpringMVC的restful格式的支持就是单元方法模糊拦截+注解声明来实现。
 *
 */
@RequestMapping("aa/{un}/{age}")
public String demoResful(@PathVariable("un")  String uname,@PathVariable Integer age){
    //处理请求
    System.out.println("MyController.demoResful:SpringMVC处理restful格式请求:"+uname+":"+age);
    //响应结果
    return "aa";
}

  

原文地址:https://www.cnblogs.com/vincentmax/p/14309043.html