RequestMapping直译成中文就是请求映射,通过@RequestMapping可以映射请求、请求的Content-Type或者Acdept头、http请求头、指定请求参数或头是否存在,或者这些信息的任意组合。
1.URL限制
@RequestMapping注解将把请求被映射的方法缩小到特定的方法上。可以只在控制器方法中添加@RequestMapping,或者同时在控制器类和它的方法中添加。
例如:
直接映射方法:
@RequestMapping("viewProduct")
public String viewProduct(...){...}
此时,该方法的URL映射为:localhost:8080/XXX(工程名)/viewProduct
同时在控制器类和它的方法中添加
@Controller
@RequestMapping("product")
public class ProductControler
{
@RequestMapping("viewProduct")
public String viewProduct(...){...}
}
此时,该方法的URL映射为:localhost:8080/XXX(工程名)/product/viewProduct
URL映射的另一个重要方面呢是:如果请求匹配到多个不同的URL映射,那么最具体的映射胜出
如下面映射:
@RequestMapping("view/*")
public String viewAll(...){...}
@RequestMapping("view/*.json")
public String viewJson(...){...}
@RequestMapping("view/id/*")
public String view(...){...}
@RequestMapping("view/other")
public String viewOther(...){...}
许多不同的URL可能会匹配到不止一个方法:
例如URL:....../view/other.json可以匹配到viewAll、viewJson或者viewOther方法,但是viewOther方法更为具体,所以请求将被路由到viewOther方法。
2.http请求限制
@RequestMapping方法特性接受一个或多个org.springframework.web.bind.annotation.RequestMethod枚举常量。如果控制器方法映射在method特性中添加一个或多个值,那么只有请求的HTTP方法匹配制定的常量之一时,请求才会被映射到该控制器方法。
如:
@Conntroller
@RequestMapping("account")
public class AccountManagementConntroller
{
@RequestMapping(value="add",method=RequestMethod.GET)
public String addFrom(...){...}
@RequestMapping(value="add",method=RequestMethod.POST)
public String addSubmit(...){...}
}
此时,.../account/add URL将同时匹配addFrom和addSubmit方法。该URL的GET请求将被路由至addForm方法,而POST请求将被路由至addSubmit方法。使用其他HTTP方法发出的请求将被拒绝。
3.请求参数限制
@RequestMapping注解的params(n.参数的复数形式)特性可以指定一个或多个参数表达式,它们大的执行结果必须为真。如果请求无法匹配params特性指定的所有的表达式,那么它就不会被映射到控制器方法
例如:
@RequestMapping(value="can",params={"employee","confirm=true"})
public String addSubmit(...){...}
只有在参数存在并且confirm参数存在还等于true时,才会调用该方法。
4.请求头限制
@RequestMapping注解的headers特性和params特性类似,我们可以为任何头指定值或者表达式,也可以使用感叹号对这些表达式取反。但头限制有一个额外的特性:可以为每天类型头指定含有通配符的值。
例如:
@RequestMapping(value="user",headers="X-Client","content-type"="text/*")
public User user(...){...}
只有包含了X-Client头并且Content-type头为任意文本类型的请求才会匹配该方法。注意:不区分头名称的匹配的大小写
5.内容类型限制
特性consumes将接受一个或多个多媒体类型,它们必须匹配请求的Content-Type头,因此它定义了方法可以处理的内容类型。
特性produces将接受一个或多个媒体类型,它们必须匹配请求的Accept头。它指定了方法可以产生的内容类型。
例如:
@RequestMapping(value="song",consumes={"text/json","application/json"},produces={"text/json","application/json"})
public User song(...){...}
gai该请求映射只会匹配Content-Type头为application/json或者text/json,并且Accept头包含了application/json或者text/json的请求
在日常的使用中,@RequestMapping注解常用的还是URL限制和请求限制,其它的似乎不怎么常用,但是还是有可能会用到的,所以了解还是很有必要的