1、RequestMapping接口的源码如下,里面定义了七个属性
(1)@Target
中有两个属性,分别为 ElementType.METHOD
和 ElementType.TYPE
,也就是说 @RequestMapping
可以在方法和类的声明中使用
(2)可以看到注解中的属性除了 name() 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如 value()可以同时定义多个字符串值来接收多个URL请求;
(3)value, method;
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
(4)consumes,produces;
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
(5) params,headers;
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String[] value() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
注解@RequestMapping中属性method的解释和用法:
@Controller
@RequestMapping("/Register")
public class Register{
/**
* method限制请求方式
*/
@RequestMapping(value="/test", method={RequestMethod.GET, RequestMethod.POST})
public void test() {
}
}
注解@RequestMapping中属性params的解释和用法:
映射请求的参数过滤主映射请求。
任何环境都采用相同的格式:
(1)“myParam = myValue”风格表达式的序列,只有当每个这样的参数具有给定的值时才映射请求。
(2)使用“!=”运算符可以取消表达式,如“myParam!= myValue”中所示。
(3)还支持“myParam”样式表达式,这些参数必须存在于请求中(允许有任何值)。
(4)最后,“!myParam”风格的表达式表明指定的参数不是应该出现在请求中的。
(5)在类型级别和方法级别都支持!在类型级别使用时,所有方法级别映射都会继承此参数限制(即在处理程序方法甚至解决之前,将检查类型级别限制)。
(6)在Servlet环境中,参数映射被认为是在类型级别强制执行的限制。主路径映射(即指定的URI值)仍然必须唯一标识目标处理程序,参数映射只是简单地表示调用处理程序的先决条件。
(7)在Portlet环境中,将参数作为映射区分因素进行考虑,即主要portlet模式映射加上参数条件唯一标识目标处理程序。只要参数映射不同,不同的处理程序可能会映射到同一个portlet模式。
params实例如下:
@Controller
@RequestMapping("/Register")
public class Register{
/**
* params的四种用法:
* age=20 有参数age并且等于20
* name!=xiaoming 有参数name但是不等于xiaoming
* address 有参数address,可以是任何值
* !sex 没有参数sex
*/
@RequestMapping(value="/test", params={"age=20", "name!=xiaoming", "address", "!sex"})
public void test() {
}
}
注解@RequestMapping中属性headers的解释和用法:
映射请求的标题缩小了主映射。
任何环境都采用相同的格式:
(1)“My-Header = myValue”风格表达式的序列,只有在发现每个这样的头部具有给定的值时才映射请求。
(2)使用“!=”运算符可以取消表达式,如“My-Header!= myValue”中所述。
(3)“My-Header”样式表达式也被支持,这些头部必须存在于请求中(允许有任何值)。
(4)最后,“!My-Header”风格的表达式表明指定的头部不应该出现在请求中。
(5)还支持媒体类型通配符(*),用于Accept和Content-Type等标题。例如,
@RequestMapping(value = "/something", headers = "content-type=text/*")
将匹配具有“text/html”,“text/plain”等内容类型的请求。
(6)在类型级别和方法级别都支持!
在类型级别使用时,所有方法级别映射都会继承此头限制(即在处理程序方法得到解决之前,将检查类型级别限制)。
(7)在Servlet环境中映射HttpServletRequest头,以及针对Portlet 2.0环境中的PortletRequest属性。
headers实例:
@Controller
@RequestMapping("/Register")
public class Register{
/**
* headers的四种用法:意思和params的四种意义一样
*/
@RequestMapping(value="/test", headers={"Content-Length=14", "Referer!=http://127.0.0.1:8020/test/html/index.html", "User-Agent", "!Content-Type"})
public void test() {
}
}
注解@RequestMapping中属性consumes的解释和用法:
指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
----------------------------------------------------------
映射请求的可使用介质类型(数据类型ContentType),缩小主映射。
(1)格式是单一媒体类型或媒体类型的序列,仅当Content-Type匹配这些媒体类型之一时才映射请求。
例子:
consumes = "text/plain"
consumes = {"text/plain", "application/*"}
(2)表达式可以通过使用“!”来取消 运算符,如“!text/plain”,匹配除“text/plain”之外的所有请求都带有“Content-Type”。
(3)在类型级别和方法级别支持
在类型级别使用时,所有方法级别映射都会覆盖此消耗限制。
consumes实例:
@Controller
@RequestMapping("/Register")
public class Register{
/**
* headers的三种用法
*/
@RequestMapping(value="/test", consumes={"text/plain", "application/*", "!pplication/application/x-www-form-urlencoded"})
public void test() {
}
}
注解@RequestMapping中属性produces的解释和用法:
指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
----------------------------------------------
使用方法与consumes一样
参考博客:
- RequestMapping 中produces 和 consumes:https://www.jianshu.com/p/f78b43f048e6