上一篇文章搭建起来了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/efmethod:定义请求的方式,一共有四种: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
本文出自 “艾斯的梦想” 博客,请务必保留此出处http://acesdream.blog.51cto.com/10029622/1904881
原文:http://acesdream.blog.51cto.com/10029622/1904881