RequestMapping注解的作用
# 30.RequestMapping注解的作用
入门案例中我们简单使用了下@RequestMapping,本文继续讲解其作用和属性
# RequestMapping注解的作用
@RequestMapping 用于建立请求 URL 和处理请求方法之间的对应关系。
出现位置可以是类上,也可以是方法上。
如果出现在类上:是配置请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理,例如,我们有账户模块和订单模块,每个模块有不同的路径:
账户模块:
- /account/add
- /account/update
- /account/delete
...
订单模块:
- /order/add
- /order/update
- /order/delete
可以看到每个模块的路径,其前面都是相同的,例如/account,/order/,我们可以在类上配置这个属性,然后在方法上就只需配置二级访问目录了
# 新建控制器
我们新建一个类:
package com.peterjxl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(path = "/user")
public class HelloController2 {
@RequestMapping(path = "/hello")
public String sayHello() {
System.out.println("Hello, RequestMapping!");
return "success2";
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
我们在类上加了@RequestMapping
注解,并配置了/user
路径;
此时我们访问/user/hello路径,就会执行HelloController2
的sayHello
方法。
# 新建index2.jsp
我们在webapp目录下,新建一个index2.jsp,文件内容:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<a href="user/hello">入门程序</a>
</body>
</html>
2
3
4
5
6
7
8
9
10
# 新建success2.jsp
我们在WEB-INF/pages/ 目录下新建一个success2.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Requesting</h1>
</body>
</html>
2
3
4
5
6
7
8
9
10
# 测试
我们重启Tomcat,访问localhost:8080/index2.jsp,并点击超链接,可以看到能正常跳转。
# RequestMapping注解的属性
RequestMapping注解还有一些属性:
value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式,例如HTTP的get方式,post方式等。可以传多个值。
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。例如:
params = {"accountName"},表示请求参数必须有 accountName params = {"accountName = peterjxl"},表示请求参数必须有 accountName,且值必须是peterjxl params = {"moeny!100"},表示请求参数中 money 不能是 100。
1
2
3headers:用于指定限制请求消息头的条件。
# 测试value属性
我们首先将path的配置去掉:
@RequestMapping(/hello")
public String sayHello() {
System.out.println("Hello, RequestMapping!");
return "success2";
}
2
3
4
5
重启服务器,可以看到能正常运行的。
# 测试method属性
@Controller
@RequestMapping(path = "/user")
public class HelloController2 {
@RequestMapping(value = "/hello", method =RequestMethod.POST)
public String sayHello() {
System.out.println("Hello, RequestMapping!");
return "success2";
}
}
2
3
4
5
6
7
8
9
10
由于我们有多个属性,因此注解里的value不能省略了。
我们重启服务器,并点击超链接,可以看到会报错:
我们可以配置多个method:
@RequestMapping(value = "/hello", method = {RequestMethod.GET, RequestMethod.POST})
public String sayHello() {
System.out.println("Hello, RequestMapping!");
return "success2";
}
2
3
4
5
# 测试params属性
params:用于指定限制请求参数的条件,它支持简单的表达式,要求请求参数的 key 和 value 必须和配置的一模一样。
例如:
params = {"accountName"},表示请求参数必须有 accountName
params = {"accountName = peterjxl"},表示请求参数必须有 accountName,且值必须是peterjxl
params = {"moeny!100"},表示请求参数中 money 不能是 100。
2
3
我们可以测试下,配置注解:
@RequestMapping(
value = "/hello",
method = {RequestMethod.GET, RequestMethod.POST},
params = {"username"}
)
public String sayHello() {
System.out.println("Hello, RequestMapping!");
return "success2";
}
2
3
4
5
6
7
8
9
此时我们JSP里没有传任何参数,访问是会报错的:
我们可以在index2.jsp中配置这个参数
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<a href="user/hello?username=peterjxl">入门程序</a>
</body>
</html>
2
3
4
5
6
7
8
9
10
重新部署,再次访问,可以看到正常了。
# 测试headers属性
用于指定限制请求消息头的条件,例如必须包含某个请求头:
@RequestMapping(
value = "/hello",
method = {RequestMethod.GET, RequestMethod.POST},
params = {"username"},
headers = {"Accept"}
)
public String sayHello() {
System.out.println("Hello, RequestMapping!");
return "success2";
}
2
3
4
5
6
7
8
9
10
例如我们配置了,必须包含Accept请求头,否则是不合法的请求。当然一般都会带上该请求头,所以我们目前是能正常访问的
# 小结
一般params属性和headers属性用的少,value和method属性用的比较多
注意:以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。也就是必须都符合每个属性的限制,才算合法的请求
# 源码
本项目已将源码上传到GitHub (opens new window)和Gitee (opens new window)上。并且创建了分支demo2,读者可以通过切换分支来查看本文的示例代码。