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:如下

posted @ 2019-10-23 15:17  酒剑仙*  阅读(164)  评论(0编辑  收藏  举报