我们大部分用的都是@RequestMapping中的value或者path属性,但实际上@RequestMapping中可不止这两个属性,本日我们一起来看看。

首先@RequestMapping表明中一共有八个参数:

String name() default "";String[] value() default {};String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};

接下来我们分别来理解一下

jsp创建mappingRequestMapping注解你真的会用吗 GraphQL

value和path

这个是最常用的,但实在他是个数组,也便是说我们可以设置多个路径;

由于@RequestMapping也可以写在类上,因此,如果类上是多个路径、方法上也是多个路径,那么我们可以通过任何类路径+任何方法路径访问到此接口

@RequestMapping(value = {"/hh","/ii","jj","kk"})public String hh(){ return "hh";}//或者是下面这种,效果一样@RequestMapping(path = {"/hh","/ii","jj","kk"})public String hh(){ return "hh";}name

这个字段是我最陌生的的一个,这是我在跟踪源码的时候看到的,Spring通过RequestMappingInfoHandlerMethodMappingNamingStrategy来天生name,如果没有指定名字的话,在类上则是所有大写字母,在方法上则是方法名,通过'#'进行拼接,例如:

@RequestMapping(value = {"/demo","/demo1","/demo2"})@RestControllerpublic class DemoController { @RequestMapping(path = {"/hh","/ii","jj","kk"}) public String hh(){ return "hh"; }}//则天生的名字是DC#hh

那天生的这个name到底有鸡毛用呢?

实在我也不知道,但是官方给出理解释:

大概便是说它能让你非常方便的在JSP页面上利用它,这么写至少觉得比你这样拼装URL:pageContext.request.contextPath/people/1/addresses/china 显得更好看一点?

哈哈哈哈哈哈,JSP这玩意不早就过期了嘛,难道便是这么玩的?

然后Spring又连续给出理解释:

依赖于Spring标记库(即META-INF/Spring.tld)中申明的mvcUrl函数,此函数的声明如下:

<function> <description>Helps to prepare a URL to a Spring MVC controller method.</description> <name>mvcUrl</name> <function-class>org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder</function-class> <function-signature>org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.MethodArgumentBuilder fromMappingName(java.lang.String)</function-signature></function>

如果你是其它模版技能(如Thymeleaf)也是很随意马虎自定义一个这样类似的函数的,那么你就依旧可以利用此便捷、强大的功能来帮助你开拓。

JSP我早就忘了,Thymeleaf也没详细利用过,对付利用过的小伙伴该当知道是干嘛的吧,这个我就不多说了,知道有这么个东西就行。

method

这个也比较常用,它是要求办法:GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE,常日也可以利用对应的GetMapping,PostMapping等表明代替利用。
须要把稳的是在@RequestMapping中,method也是一个数组,因此,它也可以指定多种要求办法

@RequestMapping(path = {"/hh","/ii","jj","kk"},method = {RequestMethod.GET,RequestMethod.POST})public String hh(){ return "hh";}params

这个字段也是一个String数组,它也相称于一个条件,例如:

//我指定了要求中指定了user!=wangpeng@RequestMapping(value = "/aa",params ={"user!=wangpeng"} )public String dd(){ return "dd";}

当我携带user=wangpeng时,要求不会进入到我当前接口中

当我携带user=wangpeng1时,要求会进入到我当前接口中,也便是说user!=wangpeng会作为条件,当知足条件时会进入到接口中

headers

这个字段也是一个String数组,它也相称于一个条件,与params有类似的效果,例如:

//指定了要求头中参数user!=wangpeng@RequestMapping(path = {"/ii"},method = {RequestMethod.GET,RequestMethod.POST},headers = "user!=wangpeng")public String ii(){ return "ii";}

当要求头中无参数或者参数user!=wangpeng时,会进入此接口

consumes

这个的浸染是指定我们要求中要求体的类型(ContentType),同样的,它也是一个数组,因此可以指定多个类型,例如:

//指定了类型为text/plain,当要求时,如果类型不是text/plain类型,则要求不会进入此接口@RequestMapping(value = "/aa",consumes = {MediaType.TEXT_PLAIN_VALUE})public String ff(){ return "ff";}produces

用来限定Accept,Accept是要求头的一种,浸染是用来见告做事器,客户端能认识哪些格式,最好返回这些格式中的个中一种。
produces这个元向来缩小要求映射类型的范围。
为了能用要求的媒体类型来产生工具, 你要用到 @RequestMapping 的 produces 元素再结合着 @ResponseBody 表明。

例如:

//我指定了Accept=text/plain,当我要求头中的Accept不是这种类型时,则不会进入到这个方法@RequestMapping(value = "/aa",consumes = {MediaType.TEXT_PLAIN_VALUE},produces = MediaType.TEXT_PLAIN_VALUE)public String ff(){ return "ff";}

当Accept=text/plain时才会进入到此接口中