RequestMapping
1. 注解的功能
@RequestMapping注解为控制器指定可以处理哪些 URL 请求。在类和方法上均可以标注 ① 标记在类上:提供初步的请求映射信息。 ② 标记在方法上:提供进一步的细分映射信息。
@Controller
@RequestMapping("/laoma")
public class MyController {
@RequestMapping("/first")
public String first() {
System.out.println("hello world");
return "first";
}
}
如这里的注解:拼在一起就是:/laoma/first
@RequestMapping作用
DispatcherServlet 截获请求后,就是通过 @RequestMapping 提供的映射信息确定请求所对应的处理方法。
特别说明:
理论上不管是类上还是方法上映射路径的第一个”/“是可以省略的。但是为了规范,建议第一个反斜线都保留
2. 参数说明
| 参数值 | 参数说明 |
|---|---|
| value或path | 定义处理方法的请求 URL 地址。这可以是字符串或字符串数组。 @RequestMapping("/hello") 将请求映射到/hello到注解方法上。 |
| method | 映射到处理程序方法的 HTTP 方法。这可以是RequestMethod枚举值或枚举值数组。 method=RequestMethod.GET,仅将GET方式的请求映射到注解方法上。 |
| params | 要映射到处理程序方法的请求参数。这可以是形式为 "param=value" 的字符串或字符串数组 params="name=laoma",仅将等于"laoma"的name参数的请求映射到注解方法上。 |
| headers | 要映射到处理程序方法的请求头。这可以是形式为 "header=value" 的字符串或字符串数组。 headers = "X-MyHeader=MyValue",仅将表头中X-MyHeader=MyValue映射到注解方法上 |
| consumes | 可以接受请求请求媒体类型。这可以是字符串或字符串数组。 consumes="application/json",仅将Content-Type为application/json映射到注解方法上。 |
| produces | 响应报文的媒体类型。可以是字符串或字符串数组。 produces="application/json",返回类型为json数据 |
RequestMapping示例
1. 不加首反斜线
@Controller
@RequestMapping("test")
public class MyController2 {
@RequestMapping("hello")
public String hello() {
System.out.println("hello world");
return "first";
}
}
postman测试请求:
注意:
虽然也是可以的。但为了编码规范,我们均加首个反斜线
2. 请求映射value或path
@RequestMapping(value = {"hello", "hello2.json"})
public String hello() {
System.out.println("hello world");
return "first";
}
这样不管是请求:
都会和1例中返回的结果一样的。
3. 控制请求方式method
// 这里控制方法仅仅用GET方式才能请求
@RequestMapping(value = "hello2", method = RequestMethod.GET)
public String hello2() {
System.out.println("hello world");
return "first";
}
postman发送请求时采用POST方式,报错如下:
4. 控制请求参数params
| 参数格式 | 描述 |
|---|---|
| param | 表示请求中必须包含名为param的参数 |
| !param | 表示请求中不能包含名为param的参数 |
| param = value | 示请求中包含名为param的参数,但是值必须是value |
| param != value | 表示请求中包含名为param的参数,但是值不能是value |
| {"param1","param2=value"} | 可以将对于多个参数的要求写入数组,他们之间是与的关系 |
@RequestMapping(value = "hello3", params = {"username","password!=123456"})
public String hello3() {
System.out.println("hello world");
return "first";
}
什么参数都不传的情况:
传了username=root,password=123456的情况:
5. 控制请求头headers
它的控制语法和上面的params一样的。这里我们举个比较常见的请求头控制的例子,比如:头中必须有token
@RequestMapping(value = "hello4", headers = "token")
public String hello4() {
System.out.println("hello world4");
return "first";
}
请求头中没有传token的情况:
6. 控制请求媒体类型consumes
// 控制请求的媒体类型为json
@RequestMapping(value = "hello5", consumes = "application/json")
public String hello5() {
System.out.println("hello world4");
return "first";
}
请求媒体为text/plain的情况:
后台报警信息:
23-Mar-2023 15:05:48.716 警告 [http-nio-8080-exec-12] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/plain' not supported]
7.控制返回的媒体类型produces
仅当request请求头中的(Accept)类型中包含该指定类型才返回;
@RequestMapping(value = "hello6", produces = "application/json")
@ResponseBody
public String hello6(HttpServletResponse response) throws IOException {
String retJson = "{"username":"laoma","userid":123456}";
System.out.println("hello world6");
return retJson;
}
当Accept接收text/plain时:
当Accept接收包含application/json时:
8. 代码地址
gitee.com/mayuanfei/s…下的springmvc02
记忆印记
- @RequestMapping注解在类上表示所有请求都要加这个前缀,注解到方法上就是类+方法的注解叠加
- @RequestMapping参数中的value和path作用是一样的,都是用于把请求的url映射到方法上的。
- 知道consumes和produces是做什么用的