上一篇文章搭建起来了hello world。今天主要来看看RequestMapping注解都有什么用法和功能。上一篇文章说了,RequestMapping可以用来映射URL,可以用在类上,也可以用在方法上面。
RequestMapping有以下几个属性:value、method、params、headers,下面简单说一下属性的功能
value:映射请求的url,当只定义一个url的时候,可以不写,即以下两种方式等价:
@RequestMapping("/testRequestMapping") @RequestMapping(value="/testRequestMapping")
value属性还支持通配符模式:
?:匹配单个字符
*:匹配多个字符,单层路径匹配
**:匹配多层路径
例如:
@RequestMapping("/user/?/ef") 可以匹配:/user/a/ef、/user/s/ef、/user/y/ef、/user/3/ef @RequestMapping("/user/*/ef") 可以匹配:/user/adf/ef、/user/gggs/ef、/user/y/ef、/user/fdfdf/ef @RequestMapping("/user/**") 可以匹配:/user/abc、/user/abd、/user/abc/ef
method:定义请求的方式,一共有四种:get、post、put、delete
params:请求参数的定义,定义一次请求必须传递的参数和参数的值
headers:定义请求的头部,params和headers两个不常用
其中params和headers支持简单的表达式
param1:表示请求必须包含名为param1的请求参数 !param1:表示请求不能包含名为param1的请求参数 param1 != value1:表示请求包含参数名为param1的请求参数,但其值不能为value1 {"param1=value1", "param2"}:表示请求必须包含参数名为param1和param2的参数, 且param1的参数值必须为value1
下面结合具体的例子来看一次requestMapping注解及其属性定义的使用方法
1、@RequestMapping注解定义在类上,我的理解,定义在类上,类似于java中的包一样,此时方法访问的路径为:类路径/方法路径,这里为testRequestMapping/greeting
@Controller @RequestMapping("/testRequestMapping") public class TestRequestMappingController { @RequestMapping("/greeting") public String greeting() { return "greeting"; } }
2、method属性的使用,指定请求的方式为post,如果使用get请求的话,就会出现404
@RequestMapping(value = "/testMethod", method = RequestMethod.POST) public String testMethod() { return "greeting"; }
测试代码,上面的链接会出现405的,见下图:
<!-- 请求失败,因为后面定义了请求类型为post --> <p>测试注解RequestMapping的method属性,访问失败,因为后台定义了请求为post方式 <a href="/testRequestMapping/testMethod">test RequestMapping method attr</a> </p> <form action="/testRequestMapping/testMethod" method="post"> <p>请求成功,因为使用form表单,定义为post请求</p> <input type="submit" value="submit" /> </form>
3、params属性的使用,params定义了请求的参数情况,支持表达式,支持数组
/** * 使用params参数指定请求参数 * 此处示例:请求必须包含请求参数name和age,并且age的值不能为10 * /testRequestMapping/testParams?name=Jim&age=10:请求失败 * /testRequestMapping/testParams?name=Jim&age=11:请求成功 * @return */ @RequestMapping(value = "/testParams", params = {"name", "age!=10"}) public String testParams() { return "greeting"; }
测试代码,上面的链接会出现404的:
<p>测试注解RequestMapping的params属性,后面定义必需name和age,且age不能等于10,访问失败 <a href="/testRequestMapping/testParams?name=Jim&age=10">test RequestMapping </a> </p> <p>测试注解RequestMapping的params属性,后面定义必需name和age,且age不能等于10,访问成功 <a href="/testRequestMapping/testParams?name=Jim&age=11">test RequestMapping </a> </p>
4、headers属性,定义了请求头相关参数,我使用的时firefox浏览器,查看发起请求的请求头,以设定Accept-Language进行测试:
下面定义了两个方法,上面的方法和浏览器中的一致,可以请求成功,下面的方法请求失败
@RequestMapping(value = "/testHedersSuccess", headers = {"Accept-Language=zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"}) public String testHedersSuccess() { return "greeting"; } @RequestMapping(value = "/testHedersFailure", headers = {"Accept-Language=zh-CN,zh;q=0.8"}) public String testHedersFailure() { return "greeting"; }
测试代码如下,上面的出现404:
<p>测试注解RequestMapping的headers属性,失败 <a href="/testRequestMapping/testHedersFailure">test RequestMapping </a> </p> <p>测试注解RequestMapping的headers属性 ,成功 <a href="/testRequestMapping/testHedersSuccess">test RequestMapping </a> </p>
5、value属性的通配符定义,下面的示例,不能匹配多个层次,
例如不能匹配:/testWildcardPath/abc/d/ef
@RequestMapping("/testWildcardPath/*/ef") public String testWildcardPath() { return "greeting"; }
测试代码:可以把请求路径中的any替换为任意字符串,不能批评多个层次
<p>url通配符形式 ,可以把请求路径中的any换成任意字符,都可以成功 <a href="/testRequestMapping/testWildcardPath/any/ef">test RequestMapping </a> </p>
6、于@PathVariable注解的配合使用,RequestMapping的value定义的url可以包含占位符,PathVariable注解就可以把url中的占位符映射到方法的参数上去
@RequestMapping("/testPathVariable/{id}") public String testPathVariable(@PathVariable("id") int id) { System.out.println(id); return "greeting"; }
测试代码:后面的11就是参数,方法可以接收到,也可以传递不同的参数
<p>PathVariable测试,11就是参数,方法可以接受到这个参数 <a href="/testRequestMapping/testPathVariable/11">test RequestMapping </a> </p>
项目源代码:
https://git.oschina.net/acesdream/spring-mvc