一.@RequestMapping 映射请求注解
1.@RequestMapping 概念
它是SpringMVC中最常用的注解之一,它将http请求映射到MVC或REST的控制器处理方法上。
2.@RequestMapping 源码参考
二.RequestMapping 可标注的位置
①标记在类上:提供初步的请求映射信息。相对于WEB 应用的根目录。
②标记在方法上:提供进一步的细分映射信息。相对于标记在类上的URL。
在类上标注这个注解后,会将所有请求都映射到这个类中,然后你可以继续在方法上加这个注解以达到映射细分的目的。
三.RequestMapping 的使用
@RequestMapping 来处理多个 URI
如果该注解中只有映射路径,可以不加属性名
如果只有一个值可以不加花括号
同时支持通配符
@RequestMapping(value = { "/hello", "/hello2", "/hello*", "/hello/*" })
带有 @RequestParam 的 @RequestMapping
@RequestParam可以获得请求中的参数,前提是两者的参数名必须相同
如果请求参数名和处理方法中的参数名一致的话,既可以省略@RequestParam中的参数
public void handlerHello(@RequestParam("id") String personId) {
System.out.println(personId);
}
当你想不加参数也能调用这个处理方法时,加上required = false
@RequestMapping(value = { "/hello", "/hello2" })
public void handlerHello(@RequestParam(value = "id", required = false) String personId) {
System.out.println(personId);
}
@RequestParam 的 defaultValue 取值就是用来给取值为空的请求参数提供一个默认值的
@RequestMapping(value = { "/hello", "/hello2" })
public void handlerHello(@RequestParam(value = "id", required = false,defaultValue = "我是默认值") String personId) {
System.out.println(personId);
}
在这段代码中,如果请求参数为空,那么处理方法就会接收 “我是默认值” 这个默认值作为其参数。
用 @RequestMapping 处理 HTTP 的各种方法
Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。
所有的请求默认都会是 HTTP GET 类型的。
当然都可以改
@RequestMapping(value = { "/hello", "/hello2" }, method = RequestMethod.POST)
public void handlerHello(@RequestParam(value = "id", required = false, defaultValue = "我是默认值") String personId) {
System.out.println(personId);
}
这样它就只能接受POST请求了
用 @RequestMapping 来处理生产和消费对象
可以使用 @RequestMapping 注解的 produces 和 consumes 这两个元素来缩小请求映射类型的范围
@RequestMapping(value = "/pro", produces = { "application/JSON" })
@ResponseBody
void getProduces() {
}
@RequestMapping(value = "/con", consumes = { "application/JSON", "application/XML" })
void getConsumes() {
}
在上面这段代码中,getConsumes()方法可以接收方法体中的XML和JSON(get方法没有方法体),getProduces只能发出JSON格式的响应
使用 @RequestMapping 来处理消息头
@RequestMapping 注解提供了一个 header 元素来根据请求中的消息头内容缩小请求映射的范围。
@RequestMapping(value = "/head", headers = { "content-type=text/plain" })
String post() {
return "Mapping applied along with headers";
}
意思是只有路径和content-type被指定为text/plain的请求才能正确映射到这个方法中
使用 @RequestMapping 来处理请求参数
@RequestMapping 直接的 params 元素可以进一步帮助我们缩小请求映射的定位范围。使用 params 元素,你可以让多个处理方法处理到同一个URL 的请求, 而这些请求的参数是不一样的。
@RequestMapping(value = "/fetch", params = { "personId=10" })
void getParams(@RequestParam("personId") String id) {
}
上面代码中,只有请求所带参数person=10时,才能映射到这个处理方法
如果说先前的@RequestMapping是用来做参数传递的话,那么这个params就可以用来判断参数是否符合要求
使用 @RequestMapping 处理动态 URI
@RequestMapping 注解可以同 @PathVaraible 注解一起使用,用来处理动态的 URI,URI 的值可以作为控制器中处理方法的参数。你也可以使用正则表达式来只处理可以匹配到正则表达式的动态 URI。
@RequestMapping(value = "/fetch/{id}", method = RequestMethod.GET)
String getDynamicUriValue(@PathVariable String id) {
System.out.println("ID is " + id);
return "Dynamic URI parameter fetched";
}
@RequestMapping(value = "/fetch/{id:[a-z]+}/{name}", method = RequestMethod.GET)
String getDynamicUriValueRegex(@PathVariable("name") String name) {
System.out.println("Name is " + name);
return "Dynamic URI parameter fetched using regex";
}
上面这个代码注意这个@PathVariable是获取请求路径中的花括号包起来的那一坨(可以理解为一个占位符),你如果将@RequestMapping设置成"/",即接受全部路径,然后用@RequestParam来接受参数,现在我的uri为/fetch/10,第一种方式通过,而第二种报错,原因不谈,注意这两者的区别
@RequestMapping 默认的处理方法
在控制器类中,你可以有一个默认的处理方法,它可以在有一个向默认 URI 发起的请求时被执行。
@RequestMapping()
String
default () {
return "This is a default method for the class";
}
@RequestMapping 快捷方式
Spring 4.3 引入了方法级注解的变体,也被叫做 @RequestMapping 的组合注解。组合注解可以更好的表达被注解方法的语义。它们所扮演的角色就是针对 @RequestMapping 的封装,而且成了定义端点的标准方法。
例如,@GetMapping 是一个组合注解,它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
方法级别的注解变体有如下几个:
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
相信以后的注解还会衍变的更简单,因为人总是喜欢偷懒的。