Spring MVC 中@Controller和@RequestMapping注解
在 Spring MVC 中有 @Controller 和 @RequestMapping注解两个常见注解,这一章节我们就来学习
一、@Controller 注解
@Controller 注解 能将一个普通的 Java 类标识成控制器(Controller)类,示例代码如下。
package com.augus.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { //下面可以写具体的请求方法 }
Spring MVC 是通过组件扫描机制查找应用中的控制器类的,为了使控制器能够被 Spring MVC 扫描到,我们需要在springmvc.xml文件中添加包扫描才可以
<!--配置spring包扫描--> <context:component-scan base-package="com.augus.controller"></context:component-scan>
二、@RequestMapping 注解
@RequestMapping 注解通常用在控制器方法上,能将请求与处理请求的控制器方法建立映射关系。Spring MVC 的前端控制器(DispatcherServlet)拦截到用户发来的请求后,会通过 @RequestMapping 注解提供的映射信息找到对应的控制器方法,对这个请求进行处理。
2.1.@RequestMapping 注解的使用方式
@RequestMapping 注解既可以标注在控制器类上,也可以标注在控制器方法上。
2.1.1. 修饰方法
当 @RequestMapping 注解用在方法上的时候,value 属性值就表示访问该方法的 URL 地址。当用户发送过来的请求想要访问该 Controller 下的控制器方法时,请求路径就必须与这个 value 值相同,示例代码如下。
访问的时候通过:http://localhost:8080/springmvc_01_war_exploded/welcome 即可
package com.augus.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping("/welcome") public String HelloWorld(){ //视图名,视图为:视图前缀+index+视图后缀,即 /WEB-INF/view/index.jsp //但是我们在springmvc.xml中配置了,前置和后置解析器,自动会分别拼接拼接/WEB-INF/view/ 和 .jsp return "index"; }
2.1.2. 修饰类
当 @RequestMapping 注解用在控制器类上时,value 属性的取值就是这个控制器类中的所有控制器方法 URL 地址的父路径。后面访问这个 Controller 下的任意控制器方法都需要带上这个父路径(例如下面,就必须携带 /springmvc 这个路径)。
package com.augus.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/springmvc") public class HelloController { @RequestMapping("/welcome") public String HelloWorld(){ //视图名,视图为:视图前缀+index+视图后缀,即 /WEB-INF/view/index.jsp //但是我们在springmvc.xml中配置了,前置和后置解析器,自动会分别拼接拼接/WEB-INF/view/ 和 .jsp return "index"; } }
上面的代码块在控制器类加上了@RequestMapping 这个注解后,网络的地址就变成了:http://localhost:8080/springmvc_01_war_exploded/springmvc/welcome
2.2.@RequestMapping 注解的属性
@RequestMapping 注解中有很多属性,提供了功能的增强
1. value 属性
在 @RequestMapping 注解中,value 属性用来设置控制器方法的请求映射地址。如下
@RequestMapping(value = "/welcome")
value 属性是 @RequestMapping 注解的默认属性,如果 @RequestMapping 注解中只设置了一个 value 属性,则属性名value可以省略不写,
@RequestMapping("/welcome")
value 属性的取值可以是一个字符串类型的数组,表示该控制器方法可以匹配多个请求地址(多个url请求地址,都会走这个控制器)。
@RequestMapping(value = {"/welcome","/helloworld"}) public String HelloWorld(){ //视图名,视图为:视图前缀+index+视图后缀,即 /WEB-INF/view/index.jsp //但是我们在springmvc.xml中配置了,前置和后置解析器,自动会分别拼接拼接/WEB-INF/view/ 和 .jsp return "index"; }
2. name 属性
name 属性则是对该方法的注释,用于解释说明这个方法的作用
@RequestMapping(value = "/welcome", name = "打开欢迎页面") public String HelloWorld(){ //视图名,视图为:视图前缀+index+视图后缀,即 /WEB-INF/view/index.jsp //但是我们在springmvc.xml中配置了,前置和后置解析器,自动会分别拼接拼接/WEB-INF/view/ 和 .jsp return "index"; }
3. method 属性
method 属性用来设置控制器方法支持的请求方式。如果一个控制器方法没有设置 @RequestMapping 注解的 method 属性,则说明该控制器方法支持全部请求类型,可以处理所有类型的请求。常用的请求方式有 GET、POST、DELETE、PUT 等。
例如:这里控制器方法只支持GET类型
@RequestMapping(value = "/welcome", name = "打开欢迎页面", method = RequestMethod.GET) public String HelloWorld(){ //视图名,视图为:视图前缀+index+视图后缀,即 /WEB-INF/view/index.jsp //但是我们在springmvc.xml中配置了,前置和后置解析器,自动会分别拼接拼接/WEB-INF/view/ 和 .jsp return "index"; }
也可以为同一个控制器方法指定支持多种类型的请求。例如,一个方法既支持 GET 方式的请求,也支持 POST 方式的请求,
@RequestMapping(value = "/welcome", name = "打开欢迎页面", method = {RequestMethod.GET, RequestMethod.POST})
4. params 属性
params 属性指定请求中的参数,只有当请求中携带了符合条件的参数时,控制器方法才会对该请求进行处理。
可以通过以下5 种表达式来对请求的参数进行配置。
序号 | 表达式 | 含义 |
---|---|---|
1 | "code" | 表示请求中必须携带名为 code的参数 |
2 | "!code" | 请求中不能携带名为 code的参数 |
3 | "code=231245" | 请求中必须携带名为 code的参数,且参数的取值必须为:231245 |
4 | "code!=231245" | 请求中不能携带参数:code= 231245。 |
5 | "code=!231245" | 请求中必须携带code参数,但是值不能是231245 |
@RequestMapping(value = "/welcome",params = {"name=yehaha","pwd=payload123"}) public String HelloWorld(){ //视图名,视图为:视图前缀+index+视图后缀,即 /WEB-INF/view/index.jsp //但是我们在springmvc.xml中配置了,前置和后置解析器,自动会分别拼接拼接/WEB-INF/view/ 和 .jsp return "index"; }
上面这样写,当请求中携带name和pwd参数的时候,并且name=yehaha。pwd=payload123的时候才会处理
5. headers 属性
headers 属性用于设置请求中请求头信息部分,只有当请求中携带指定的请求头信息时,控制器方法才会处理该请求。
我们可以通过以下 5 种表达式来指定请求中的请求头信息。
序号 | 表达式 | 含义 |
---|---|---|
1 | "Referer" | 请求必须携带请求头信息:Referer |
2 | "!Referer" | 请求中不能携带请求头信息:Referer |
3 | "Referer=http://www.123.com”" | 请求中必须携带请求头信息:Referer=http://www.123.com。 |
4 | "Referer!=http://www.123.com" | 请求中不能携带请求头信息:Referer!=http://www.123.com。 |
5 | "Referer=!http://www.123.com" | 请求中必须携带请求头信息:Referer,但是值不能为http://www.123.com。 |
header 属性是一个字符换类型的数组,表示只有当请求同时携带数组中规定的所有头信息时,控制器方法才会对该请求进行处理
/** * @RequestMapping 注解 headers 属性 */ @RequestMapping(value = "/testHeader", headers = {"Accept-Encoding=gzip, deflate", "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"}) public String headers() { return "header"; }
上面的代码只有当请求的头信息中包含"Accept-Encoding=gzip, deflate", "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"时,控制器方法才会处理该请求。
三、案例演示
3.1.在之前项目的基础上,在com.augus.controller包下创建名为 RequestMappingController 的 Controller 类,内容如下:
package com.augus.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class RequestMappingController { /** * @RequestMapping value、name、method 属性 */ @RequestMapping(value = {"/welcome", "/do"}, name = "跳转到欢迎页", method = RequestMethod.GET) public String testValue() { return "welcome"; } /** * @RequestMapping 注解 params 属性 */ @RequestMapping(value = "/testParam", params = {"name=liming", "url=http://www.baidu.com"}) public String params() { return "param"; } /** * @RequestMapping 注解 headers 属性 */ @RequestMapping(value = "/testHeader", headers = {"Accept-Encoding=gzip, deflate", "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"}) public String headers() { return "header"; } }
3.2.在 WEB-INF/view 目录下创建 welcome.jsp,代码如下。
<%-- Created by IntelliJ IDEA. User: Augus Date: 2022/9/4 Time: 15:13 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1 >欢迎学习springmvc</h1> <form action="testParam" method="post"> <table style="text-align: center;"> <tr> <td>name:</td> <td><input type="text" name="name" required><br></td> </tr> <tr> <td>url:</td> <td><input type="text" name="url" required><br></td> </tr> <tr> <td colspan="2"> <input type="submit" value="验证 params属性"> </td> </tr> </table> </form> </body> </html>
3.3.在 WEB-INF/view 目录下创建 param.jsp,代码如下。
<%-- Created by IntelliJ IDEA. User: Augus Date: 2022/9/4 Time: 15:15 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>设置参数校验</title> </head> <body> <h1>恭喜您,请求参数设置正确!</h1> </body> </html>
3.4.在 WEB-INF/view 目录下创建 header.jsp,代码如下。
<%-- Created by IntelliJ IDEA. User: Augus Date: 2022/9/4 Time: 15:15 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>设置请求头校验</title> </head> <body> <h1>恭喜您,请求头设置正确!</h1> </body> </html>
3.5.验证
- 访问 http://localhost:8080/springmvc_01_war_exploded/do:
- 表单中输入 name 为“liming”,url 为“http://www.baidu.com”,如下图
- 访问 http://localhost:8080/springmvc_01_war_exploded/testHeader:如下