1、RequestMapping接口的源码如下,里面定义了七个属性
(1)@Target中有两个属性,分别为 ElementType.METHODElementType.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一样

参考博客:

  1. RequestMapping 中produces 和 consumes:https://www.jianshu.com/p/f78b43f048e6