原文链接:http://www.dubby.cn/detail.html?id=9044
1. 基本用法
可以修饰类,也可以修饰方法。修饰类是代表URI由此类(controlller)里的方法处理,修饰方法是详细指定哪个方法处理哪个URI请求。
2. HTTP方法
method
可以指定特定的HTTP方法才可以映射:
@RequestMapping(path = "/hello", method = RequestMethod.GET)
支持的方法有GET
, HEAD
, POST
, PUT
, PATCH
, DELETE
, OPTIONS
, TRACE.
3. URI 映射
基于普通的URI
这种是最简单的url映射,可以接收到/hello
这样的请求
@RequestMapping("/hello")
public @ResponseBody String test() {
return "hello!";
}
基于多个普通的URI路径
@RequestMapping
可以同时指定多个url,映射到同一个应答逻辑中:
@RequestMapping(value={"/multi1","/multi2","/test/multi"})
public @ResponseBody String multiUrl() {
return "test multi url";
}
基于路径变量的URI映射
这种URL映射可以直接在路径上指定变量,通过@PathVariable
可以获得对象。
@RequestMapping(value="/user1/{name}")
public @ResponseBody String basicUrl1(@PathVariable String name){
return "hello"+name;
}
@RequestMapping(value="/user2/{name}/test")
public @ResponseBody String basicUrl2(@PathVariable String name){
return "hello"+name+"test";
}
@RequestMapping(value="/user1/{name}/test/{age}")
public @ResponseBody String basicUrl3(@PathVariable String name,@PathVariable int age){
return "hello"+name+" age"+age;
}
基于通配风格的URI映射
规则参见ANT
- ? 匹配任何单字符
-
- 匹配0或者任意数量的字符
- ** 匹配0或者更多的目录
RequestMapping | URI |
---|---|
@RequestMapping(value=”/ant1?”) | /ant1a和/ant1b和/ant1c |
@RequestMapping(value=”/ant2*”) | /ant2aaaa和/ant2bbbb和/ant2cccc |
@RequestMapping(value=”/ant3/*”) | /ant3/aaaa和/ant3/1234和/ant3/12ab |
@RequestMapping(value=”/ant4/**”) | /ant4/和/ant4/aaa和/ant4/aaa/123 |
混用统配和路径变量
@RequestMapping(value="/ant5/**/{name}")
public @ResponseBody String ant5(@PathVariable String name){
return "ant+url "+name;
}
最后一个会被当作name参数.
基于正则的URI映射
语法是{varName:regex},其中第一部分定义了变量名,第二部分就是所要应用的正则表达式。比如下面的代码样例:
@RequestMapping(value="/student/{name:\\w+}-{age:\\d+}")
public @ResponseBody String regUrl(@PathVariable String name,@PathVariable int age){
return "name:"+name+" age:"+age;
}
用后面的正则来匹配前面的参数.
4. 消费的媒体类型
consumes
可以指定一组可消费的媒体类型,缩小映射的范围。这样只有当请求头中Content-Type
的值与指定可消费的媒体类型中有相同的时候,请求才会被匹配。比如:
@RequestMapping(path = "/hello", method = RequestMethod.POST, consumes="application/json")
指定可消费媒体类型的表达式中还可以使用否定,比如,可以使用!text/plain
来匹配所有请求头Content-Type
中不含text/plain
的请求。同时,在MediaType类中还定义了一些常量,比如APPLICATION_JSON_VALUE、APPLICATION_JSON_UTF8_VALUE等,推荐更多地使用它们。
5. 生产的媒体类型
produces
可以指定一组生产的媒体类型,缩小映射的范围。这样只有当请求头中Accept的值与指定可生产的媒体类型中有相同的时候,请求才会被匹配。而且,使用produces条件可以确保用于生成响应的内容与指定的可生产的媒体类型是相同的。比如:
@RequestMapping(path = "/hello", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
可生产的媒体类型表达式也可以使用否定。比如,可以使用!text/plain
来匹配所有请求头Accept
中不含text/plain
的请求。
6. 请求参数与请求头的值
可以筛选请求参数的条件来缩小请求匹配范围,比如"myParam"
、"!myParam"
及"myParam=myValue"
等。前两个条件用于筛选存在/不存在某些请求参数的请求,第三个条件筛选具有特定参数值的请求。下面的例子展示了如何使用请求参数值的筛选条件:
@RequestMapping(path = "/hello", params="myParam=myValue")
@RequestMapping(path = "/hello", headers="myHeader=myValue")