首页 > 代码库 > 二、Spring MVC的RequestMapping注解

二、Spring MVC的RequestMapping注解

    上一篇文章搭建起来了hello world。今天主要来看看RequestMapping注解都有什么用法和功能。上一篇文章说了,RequestMapping可以用来映射URL,可以用在类上,也可以用在方法上面。


    RequestMapping有以下几个属性:value、method、params、headers,下面简单说一下属性的功能

value:映射请求的url,当只定义一个url的时候,可以不写,即以下两种方式等价:

@RequestMapping("/testRequestMapping")
@RequestMapping(value="http://www.mamicode.com/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="http://www.mamicode.com/testRequestMapping/testMethod">test RequestMapping method attr</a>
 </p>


<form action="/testRequestMapping/testMethod" method="post">
    <p>请求成功,因为使用form表单,定义为post请求</p>
    <input type="submit" value="http://www.mamicode.com/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="http://www.mamicode.com/testRequestMapping/testParams?name=Jim&age=10">test RequestMapping </a>
</p>

<p>测试注解RequestMapping的params属性,后面定义必需name和age,且age不能等于10,访问成功
 <a href="http://www.mamicode.com/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="http://www.mamicode.com/testRequestMapping/testHedersFailure">test RequestMapping </a>
 </p>

<p>测试注解RequestMapping的headers属性 ,成功
<a href="http://www.mamicode.com/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="http://www.mamicode.com/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="http://www.mamicode.com/testRequestMapping/testPathVariable/11">test RequestMapping </a>
</p>


项目源代码:

https://git.oschina.net/acesdream/spring-mvc


本文出自 “艾斯的梦想” 博客,请务必保留此出处http://acesdream.blog.51cto.com/10029622/1904881

二、Spring MVC的RequestMapping注解