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