目录
[1. 注解介绍](#1. 注解介绍)
[2. 属性介绍](#2. 属性介绍)
[2.1 value属性【记】](#2.1 value属性【记】)
[2.2 name属性](#2.2 name属性)
[2.3 path属性](#2.3 path属性)
[2.4 method属性【记】](#2.4 method属性【记】)
[2.5 params 属性](#2.5 params 属性)
[2.6 headers 属性](#2.6 headers 属性)
[2.7 consumes 属性](#2.7 consumes 属性)
[2.8 produces 属性](#2.8 produces 属性)
[3. 映射路径](#3. 映射路径)
[3.2 Ant 风格的映射路径](#3.2 Ant 风格的映射路径)
1. 注解介绍
@RequestMapping 注解可以写在控制器类上,也可以写在控制单元方法上。
- 如果写在类上,表示当前类所有控制单元的映射路径,都以指定路径开头。
- 如果写在方法上,表示当前方法的映射路径。最终访问这个控制单元的映射路径为 : 类上 @RequestMapping 映射路径 + 方法上@RequestMapping 映射路径。
2. 属性介绍
2.1 value属性【记】
定义映射路径。URL 中出现指定映射路径时会执行当前控制单元。支持一个方法多个 映射路径。value 属性可以省略不写,且 Java 的注解中,如果属性是数组类型,且取值只有一 个时,{}可以省略不写。四种写法如下:
注意:如果@RequestMapping 只需要设置 value 属性的话可以省略。但是需要设置 多个属性时 value 不能省略。
2.2 name属性
给控制单元定义一个名称。可以理解 name 是控制单元的注释。
2.3 path属性
path 属性和 value 属性使用方式是相同的,都是设置控制单元的映射路径。
2.4 method属性【记】
- method 属性类型是 RequestMethod[],RequestMethod 是枚举类型,支持 HTTP 协议中绝 大多数请求类型。其类结构如下。
- 当设置了 method 属性后,表示只有指定类型请求方式才能访问这个控制单元方法,其他的请求方式访问时,响应会出现 405 状态码。
简写的方式,如下:
- @PostMapping("/first")
- @GetMapping("/first")
- @DeleteMapping("/first")
- @PutMapping("/first")
- @PatchMapping("/first")
加上这些注解后,可以省略,后面的method属性。
2.5 params 属性
- params 属性类型是 String[],表示请求中必须包含指定名称的请求参数。
- 如果请求中没有包含指定类型参数,响应会出现 400 状态码。并且明确提示在实际的请求参数 中没有明确设置 name 属性。
2.6 headers 属性
headers 属性类型是 String[], 表示请求头中必须包含指定的请求头参数。如果请求头中没有指定的请求头参数,浏览器会报 404
2.7 consumes 属性
consumers 表示处理请求内容(Content-Type)的类型,平时多不设置,由 Spring MVC 自动 判断。
2.8 produces 属性
produces 类型是 String[],作用是设置@ResponseBody 注解的响应内容类型。且仅当请求头 中 Accept 中包含的值才生效。比较抽象,看示例
注意:produces 只有在使用@ResonseBody 注解中才生效。
3. 映射路径
- 映射路径在之前 Java EE 阶段中学习过,就是 web.xml 中 的值或者 @WebServlet("")注解的值。
- 映射路径无论是在 Servlet 中还是在 Spring MVC 中,都表示:当 URL 中出现指定路径时会执 行 Servlet 的方法或执行 Spring MVC 的控制单元。
3.1多级路径问题
看下面一个例子:下面这个单元方法,在浏览器输入 http://localhost:8080/demoPath就能访问到my.jsp页面,该请求转发的路径为相对路径,直接是从webapp目录下找my.jsp页面。
再看下面一个单元方法,有两级访问路径,此时如果在输入http://localhost:8080/demoPath/test就会报404错误,这是因为他会在webapp/demoPath这个目录下找my.jsp页面没有找到,因为是相对路径,test和my.jsp是同级的,会生成一个虚拟路径demoPath,会从虚拟路径demoPath目录下找。
解决方法:只需要在返回值中使用绝对路径就可以减少出错的情况。 跳转时 / 表示项目根目录,也就是 webapp 目录的根目录。这样无论你访问路径上有多少层,都会从直接从webapp目录下找。
正确的方式如下,访问成功。
3.2 Ant 风格的映射路径
所谓的 Ant 风格就是支持三种特殊的符号。
- ? : 表示任意的一个字符
- * :表示0到多个的任意字符
- ** :表示任意层级的路径
以第一个用法为例,如下图所示,wollo后面只要跟一个字符访问的页面都是my.jsp页面。
注意: 使用 Ant 的特殊符号时,表示模糊匹配。可能出现客户端发送过来的 URL 能匹配上多个 映射路径,这时的优先级为: 固定值 (wollo1) > ? 形式(wollo?) > 一个 号( ) > 形式