0、目录
1、RequestMapping注解使用的介绍
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
- 用于类上:表示类中的所有响应请求的方法都是以该地址作为父路径。
- 用于方法上:父路径 + 该路径为请求的实际路径
2、RequestMapping注解的六个属性
2.1 RequestMapping接口的源码
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
// 指定映射的名称
String name() default "";
// 指定请求路径的地址
@AliasFor("path")
String[] value() default {};
// 指定请求路径的地址
@AliasFor("value")
String[] path() default {};
// 指定请求的方式,是一个RequsetMethod数组,可以配置多个方法
RequestMethod[] method() default {};
// 指定参数的类型
String[] params() default {};
String[] headers() default {};
// 指定数据请求的格式
String[] consumes() default {};
// 指定返回的内容类型
String[] produces() default {};
}
2.2 Value属性
指定请求的实际地址,指定的地址可以是URI Template 模式。
@RequestMapping("/hello1")
@RequestMapping(value="/hello2")
@RequestMapping(value={"/hello3","/hello4"})
value值可以分为类
- 值为普通的具体字符串
@RequestMapping(value="/hello")
- 含有变量的一类值
@RequestMapping(value="/hello/{userId}")
public String sayHello1(@PathVariable String userId) {
System.out.println(userId);
return "index";
}
- 正则表达式类型的值
@RequestMapping(value="/{textualPart:[a-z-]+}.{numericPart:[\\d]+}")
public void sayHello2(@PathVariable String textualPart, @PathVariable String numericPart) {
System.out.println("Textual part: " + textualPart +
", numeric part: " + numericPart);
}
}
比如访问:http://localhost:8080/projectName/hello.888
则输出:Textual part: hello, numeric part: 888.
- 定义位置
若将该属性定义在类上面,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestMapping("/clazz")
@Controller
public class HelloController{
@RequestMapping("hello")
public String hello(){
return "hello";
}
}
如上,访问地址为http://localhost:8080/projectName/clazz/hello
2.3 Method属性
指定请求的method类型, GET、POST、PUT、DELETE等,如果此属性定义了多个值,那么可以适应多种请求方式。
@RequestMapping(value="/hello" , method={RequestMethod.POST, RequestMethod.GET})
public String sayHello1(@PathVariable String userId) {
System.out.println(userId);
return "index";
}
如果声明了方法的访问方式,那么就只支持所声明的方式访问,否则将出现405请求异常(HTTP状态码405,指客户端请求中的方法被禁止)
2.4 MediaType
MediaType,也叫Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。
例如: Content-Type: text/html;charset:utf-8;
Headers里常见Content-Type一般有以下4种:
- application/x-www-form-urlencoded
- 数据被编码为名称/值对。这是标准的编码格式。
- form表单默认提交的content-type。
- 当请求为get时,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串追加到url后面,用?分割,加载这个新的url,此时请求头中的content-type这一属性以具体浏览器为准。
- get请求无需人工设置content-type。
- 当请求为post时,浏览器采用x-www-form-urlencoded提交数据,form数据将以key:value键值对的方式传给server。
- multipart/form-data
- 用于文件上传,此时form的enctype属性必须指定为multipart/form-data。
- application/json
- 将数据以json对象的格式传递。
- 随着json规范的流行,以及前后端分离趋势所致,该编码方式被越来越多人接受。
- text/plain:数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。
2.5 Consumes属性
指定处理请求的提交内容类型(Content-Type),例如application/json, text/html,只有命中了才会接受该请求。
//方法仅处理request Content-Type为“application/json”类型的请求。
@RequestMapping(value = "/hello", method = RequestMethod.POST, consumes="application/json")
public void addPet() {
// implementation omitted
}
HTTP请求415状态,Unsupported Media Type(HTTP状态码415,指服务器无法处理请求附带的媒体格式。)
2.6 Produces属性
指定返回的内容类型,如果返回的是JSON数据一般使用application/json;charset=UTF-8。
//指定了返回的内容类型为application/json;
@RequestMapping(value = "/produces", method = RequestMethod.GET, produces="application/json;charset=utf-8")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
// implementation omitted
}
2.7 Params属性
指定request中必须包含某些参数值,才让该方法处理。否则会报HTTP Status [400 - Bad Request]的错误。
//仅处理请求中包含了名为“myParam”,值为“myValue”的请求;
@RequestMapping(value = "/params", method = RequestMethod.GET, params="myParam=myValue")
public void findPet() {
// implementation omitted
}
2.8 Headers属性
指定request中必须包含某些指定的header值,才能让该方法处理请求。否则会报错误。
@RequestMapping(value = "/headers", method = RequestMethod.GET, headers={"content-type=text/plain","content-type=text/html"})
public void findPet() {
// implementation omitted
}
仅处理request的header中包含了指定“content-type”请求头和对应值为“text/plain”的请求;
2.9 其他处理
(1)默认的处理方法
在控制器类中,你可以有一个默认的处理方法,它可以在有一个向默认 URI 发起的请求时被执行。 下面是默认处理方法的示例:
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping()
String default () {
return "This is a default method for the class";
}
在这段代码中,向 /home 发起的一个请求将会由 default() 来处理,因为注解并没有指定任何值。
(2)变体注解
Spring 4.3 引入了方法级注解的变体,也被叫做 @RequestMapping 的组合注解。组合注解可以更好的表达被注解方法的语义。它们所扮演的角色就是针对 @RequestMapping 的封装,而且成了定义端点的标准方法。 方法级别的注解变体有如下几个:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
例如,@GetMapping 是一个组合注解,它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
@Controller
@RequestMapping("/home")
public class IndexController {
@GetMapping("/person/{id}")
public String getPersonById(@PathVariable String id) {
return "page";
}
@PostMapping("/person/post")
public String postPerson() {
return "page";
}
@PutMapping("/person/put")
public String putPerson() {
return "page";
}
@DeleteMapping("/person/delete")
public String deletePerson() {
return "page";
}
@PatchMapping("/person/patch")
public String patchPerson() {
return "page";
}
在工作中, @RequestMapping 的组合变体注解更加常用,因为组合注解减少了在应用程序上要配置的元数据,并且代码也更易读。
2.10 REST风格URL
(1)概述
REST是一个架构风格,用url来访问网络上的任何资源。REST的一种思想就是用不同的 HTTP 请求(GET,POST,PUT,DELETE)描述对资源的操作,通过 HTTP 的状态码来判断此次对资源操作的结果,这就是 Restful风格。或通俗理解为用http中的请求动作get,post,put,delete,来进行增删改查。
REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。
Fielding是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所以,他的这篇论文一经发表,就引起了关注,并且立即对互联网开发产生了深远的影响。
- Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。
- 中文翻译过来是:表现层状态转化
- 状态转化:客户端通过 http 协议访问服务端资源,通过 http 协议里面定义好的四个动词:GET、POST、PUT、DELETE 来将资源进行状态转化。
- 如果一个架构符合REST原则,就称它为RESTful架构。
(2)风格设计
RESTful 的核心思想就是,客户端发出的数据操作指令都是"动词 + 宾语"的结构。比如,GET /users这个命令,GET是动词,/users是宾语。
动词
通常就是五种 HTTP 方法,对应 CRUD 操作。
- GET:读取(Read)
- POST:新建(Create)
- PUT:更新(Update)
- PATCH:更新(Update),通常是部分更新
- DELETE:删除(Delete)
根据 HTTP 规范,动词一律大写。
那到底什么样url才算是rest风格呢?
传统风格:
| 操作 | 请求 | 访问URL1 | 访问URL2 | | -------- | ---- | ---------------------- | ------------------------ | | 获取列表 | GET | ip/ssm/getUsers | ip/ssm/getOrders | | 获取单条 | GET | ip/ssm/getUser?id=1001 | ip/ssm/getOrder?id=20100 | | 新增数据 | POST | ip/ssm/addUser | ip/ssm/addOrder | | 修改数据 | POST | ip/ssm/updateUser | ip/ssm/updateOrder | | 删除数据 | POST | ip/ssm/deleteUser | ip/ssm/deleteOrder |
REST风格:
| 操作 | 请求 | 访问URL1 | 访问URL2 | | -------- | --------- | ---------------- | ------------------ | | 获取列表 | GET | ip/ssm/users | ip/ssm/orders | | 获取单条 | GET | ip/ssm/user/1002 | ip/ssm/order/20100 | | 新增数据 | POST | ip/ssm/user | ip/ssm/order | | 修改数据 | PUT/PATCH | ip/ssm/user | ip/ssm/order | | 删除数据 | DELETE | ip/ssm/user/1002 | ip/ssm/order/20100 |
后台先开发程序,查询功能(GET,ip/ssm/user/1002),是不是要告诉前端?
(3)REST API
API(Application Programming Interface)应用程序接口,但该接口并非Java中的interface,而是指一个请求路径,比如
http://www.baidu.com/user/1
http://www.baidu.com/order/1
http://www.baidu.com/getUser?id=1
API在开发中是前端和后端进行数据传输的一个路径,通过该路径,可以实现前端和后台的分离,如下:
//豆瓣的请求路径
https://api.douban.com/v2/book/2129650
所以REST API是指符合REST风格的请求路径
(4)REST是什么?
REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用。
3、参考文档
【01】RequestMapping
【02】简书-SpringMVC各个注解的使用
【03】博客园-springmvc常用注解标签详解