Spring MVC@Controller和@RequestMapper注解

本文介绍了SpringMVC中两个关键注解`@Controller`和`@RequestMapping`的使用,以及如何通过`@RequestMapping`设置请求映射、方法支持的请求类型、参数和请求头条件。此外,还提到了SpringMVC对Ant风格路径的支持。
摘要由CSDN通过智能技术生成

从 Java 5 开始,Java 就增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、加载和运行时被读取,执行相应的处理。通过注解,开发人员可以在不改变原有代码逻辑的情况下,在代码中嵌入补充信息。

Spring 从 2.5 版本开始提供了对注解技术的全面支持,以替换传统的 XML 配置,简化 Spring 的配置。作为 Spring 框架的一个子项目, Spring MVC 自然也提供了对注解的支持。

在 Spring MVC 中有两个十分重要的注解,它们分别是 @Controller 和 @RequestMapping 。

@Controller 注解

@Controller 注解可以将一个普通的 Java 类标识成控制器(Controller)类:

package com.example.first-demo.controller;

import org.springframework.stereotype.Controller;

@Controller
public class TestController {
    // 处理请求的方法
   
}

Spring MVC 是通过组件扫描机制查找应用中的控制器类的,为了保证控制器能够被 Spring MVC 扫描到,我们还需要在 Spring MVC 的配置文件中使用 context:component-scan/ 标签,指定控制器类的基本包(请确保所有控制器类都在基本包及其子包下)

<!-- 使用扫描机制扫描控制器类,控制器类都在com.example.first-demo包及其子包下 -->
<context:component-scan base-package="com.example.first-demo" />

@RequestMapping 注解

@RequestMapping 注解是 Spring MVC 中最常被用到的注解之一。它通常被标注在控制器方法上,负责将请求与处理请求的控制器方法关联起来,建立映射关系。

Spring MVC 的前端控制器(DispatcherServlet)拦截到用户发来的请求后,会通过 @RequestMapping 注解提供的映射信息找到对应的控制器方法,对这个请求进行处理。

@RequestMapper注解的使用方式

@RequestMapping 既可以标注在控制器类上,也可以标注在控制器方法上。

  1. 修饰方法
    当 @RequestMapping 注解被标注在方法上时,value 属性值就表示访问该方法的 URL 地址。当用户发送过来的请求想要访问该 Controller 下的控制器方法时,请求路径就必须与这个 value 值相同:
@Controller
public class HelloController {
    @RequestMapping("/login")
    public String welcome() {
        return "login";
    }
}
  1. 修饰类
    当 @RequestMapping 注解标注在控制器类上时,value 属性的取值就是这个控制器类中的所有控制器方法 URL 地址的父路径。也就是说,访问这个 Controller 下的任意控制器方法都需要带上这个父路径。
@Controller
@RequestMapping(value = "/first-demo")
public class HelloController {
    @RequestMapping("/login")
    public String welcome() {
        return "login";
    }
}

@RequestMapping 注解的属性

@RequestMapping 注解中提供了多个可用属性,下面我们就对其中几个比较常用的属性进行介绍。

  1. value 属性
    在 @RequestMapping 注解中,value 属性用来设置控制器方法的请求映射地址。所有能够匹配到该请求映射地址的请求,都可以被该控制器方法处理
@RequestMapping(value = "/register")

value 属性是 @RequestMapping 注解的默认属性,如果我们在 @RequestMapping 注解中只设置了一个 value 属性,则该属性名可以被省略

//省略 value 属性名
@RequestMapping( "/register")

value 属性的取值是一个字符串类型的数组,表示该控制器方法可以匹配多个请求地址。

@RequestMapping( value = {"/register", "/login"})
public String success() {
    return "success";
}
  1. name 属性
    name 属性相当于方法的注释,用于解释这个方法是用来干什么的,使方法更易理解。

例如,下面的代码表示 getUsers() 方法是一个用来获取用户信息的控制器方法。

@RequestMapping(value = "toUser",name = "获取用户信息")
public String getUsers() {
    ……
}
  1. method 属性
    method 属性用来设置控制器方法支持的请求方式。如果一个控制器方法没有设置 @RequestMapping 注解的 method 属性,则说明该控制器方法支持全部请求类型,可以处理所有类型的请求。

method 属性的取值是一个 RequestMethod 类型的数组,表示一个控制器方法支持多种方式的请求,常用的请求方式有 GET、POST、DELETE、PUT 等。

例如,控制器方法只支持 GET 方式的请求,代码如下。

@RequestMapping(value = "/toUser",method = RequestMethod.GET)

我们也可以为同一个控制器方法指定支持多种类型的请求。例如,一个方法既支持 GET 方式的请求,也支持 POST 方式的请求,代码如下。

@RequestMapping(value = "/toUser",method = {RequestMethod.GET,RequestMethod.POST}),
  1. params 属性
    params 属性用于指定请求中的参数,只有当请求中携带了符合条件的参数时,控制器方法才会对该请求进行处理。

我们可以通过以下 4 种表达式来对请求的参数进行配置。

序号表达式含义
“param”请求中必须携带名为 param 的参数
“!param”与表达式 ① 的含义完全相反,请求中不能携带名为 param 的参数
“param=value”请求中必须携带名为 param 的参数,且参数的取值必须为:value
“param!=value”与表达式 ③ 的含义完全相反,请求中不能携带参数:param = value。

params 属性的取值是一个字符串类型的数组,表示只有请求中同时携带了 params 属性指定的全部参数时,控制器方法才会对该请求进行处理。

例如,控制器方法 testParam() 的代码如下:

@RequestMapping(value = "/testParam", params = {"name=测试", "url=http://com.example.first-demo"})
@ResponseBody
public String testParam() {
    return "success";
}

以上代码表示,只有当请求中同时携带 name 和 url 两个请求参数,且参数值必须分别为 “测试 和“http://com.example.first-demot”时,控制器方法 testParam() 才会对该请求进行处理 。
5. headers 属性
headers 属性用于设置请求中请求头信息,只有当请求中携带指定的请求头信息时,控制器方法才会处理该请求。

我们可以通过以下 4 种表达式来指定请求中的请求头信息。

序号表达式含义
“header”请求必须携带请求头信息:header
“!header”与表达式 ① 的含义完全相反,请求中不能携带请求头信息:header
“header=value”请求中必须携带请求头信息:header=value 。
“header!=value”与表达式 ③ 的含义完全相反,请求中不能携带请求头信息:header=value。

header 属性是一个字符换类型的数组,表示只有当请求同时携带数组中规定的所有头信息时,控制器方法才会对该请求进行处理。

例如,控制器方法 method() 的代码如下。

@RequestMapping(value = "toUser",header = "Referer=http://com.example.first-demo")
public String metnod() {
    ……
}

在以上代码中,只有当请求的头信息中包含“Referer=http://com.example.first-demo”时,控制器方法 method() 才会处理该请求。

实例:

  1. 在controller包下创建RequestMapperController类
package com.example.firstdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/springmvc")
public class RequestMappingController {

    /**
     *
     * @RequestMapping value、name、method 属性
     */
    @RequestMapping(value = {"/welcome", "/do"}, name = "跳转到欢迎页", method = RequestMethod.GET)
    public String testValue() {
        return "welcome.html";
    }

    /**
     * @RequestMapping 注解 params 属性
     */
    @RequestMapping(value = "/testParam", params = {"name=first-demo", "url=http://com.example.first-demo"})
    public String params() {
        return "param";
    }
   
    /**
     * @RequestMapping 注解 headers 属性
     */
    @RequestMapping(value = "/testHeader", headers = {"Content-Type=application/json", "Referer=http://com.example.first-demo"})
    public String headers() {
        return "header";
    }
}
  1. 在对应的WEB-INF/templates目录下创建页面:
    welcome.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>XXXXX网</title>
</head>
<body>

<h1 th:text="欢迎您访问XXXX网"></h1>

<form th:action="@{/springmvc/testParam}" th: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>

param.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>XXXXX网</title>
</head>
<body>

<h1 th:text="恭喜您,请求参数设置正确!"></h1>

</body>
</html>

header.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>XXXX网</title>
</head>
<body>

<h1 th:text="恭喜您,请求头设置正确!"></h1>

</body>
</html>

支持 Ant 风格的路径

Spring MVC 还提供了对 Ant 风格路径的支持,我们可以在 @RequestMapping 注解的 value 属性中使用 Ant 风格的统配符,来设置请求映射地址。

常用的 Ant 风格的通配符:

通配符说明请求映射举例匹配的请求地址举例
?表示任意的单个字符。@RequestMapping(value = “/test-user?”)localhost:8080/test-userA。localhost:8080/test-userb。localhost:8080/test-user1
*表示任意的 0 个或多个字符。@RequestMapping(value = “/test-user*”)localhost:8080/test-user。localhost:8080/test-userA。localhost:8080/test-user-abc
**表示任意的一层或多层目录。注意,在使用该通配符时,其使用方式只能时 “/**/xxx”。@RequestMapping(value = “/**/testuser”)localhost:8080/test-user。localhost:8080/aa/test-user。localhost:8080/aa/bb/test-user

原文地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值