当前位置: 首页 > news >正文

Spring MVC @Controller和@RequestMapping注解

@Controller 注解

@Controller 注解可以将一个普通的 Java 类标识成控制器(Controller)类,示例代码如下。

package net.biancheng.controller;
import org.springframework.stereotype.Controller;
@Controller
public class IndexController {// 处理请求的方法
}

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

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

@RequestMapping 注解

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

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

@RequestMapping 注解的使用方式

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

1. 修饰方法

当 @RequestMapping  注解被标注在方法上时,value 属性值就表示访问该方法的 URL 地址。当用户发送过来的请求想要访问该 Controller 下的控制器方法时,请求路径就必须与这个 value 值相同,示例代码如下

@Controller
public class HelloController {@RequestMapping("/login")public String welcome() {return "login";}
}

2. 修饰类

当 @RequestMapping 注解标注在控制器类上时,value 属性的取值就是这个控制器类中的所有控制器方法 URL 地址的父路径。也就是说,访问这个 Controller 下的任意控制器方法都需要带上这个父路径。

@Controller
@RequestMapping(value = "/springmvc")
public class HelloController {@RequestMapping("/login")public String welcome() {return "login";}
}

在上面的控制类中,用户想要访问 HelloController 中的 welcome() 方法,请求的地址就必须带上父路径“/springmvc”,即请求地址必须为“/springmvc/login”。

@RequestMapping 注解的属性

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

1. value 属性

在 @RequestMapping 注解中,value 属性用来设置控制器方法的请求映射地址。所有能够匹配到该请求映射地址的请求,都可以被该控制器方法处理,示例代码如下。

@RequestMapping(value = "/register")

value 属性是 @RequestMapping 注解的默认属性,如果我们在 @RequestMapping 注解中只设置了一个 value 属性,则该属性名可以被省略。value 属性的取值是一个字符串类型的数组,表示该控制器方法可以匹配多个请求地址

@RequestMapping( value = {"/register", "/login"})
public String success() {return "success";
}

2. name 属性

name 属性相当于方法的注释,用于解释这个方法是用来干什么的,使方法更易理解。

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

@RequestMapping(value = "toUser",name = "获取用户信息")
public String getUsers() {……
}

3. 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})

4. params 属性

params 属性用于指定请求中的参数,只有当请求中携带了符合条件的参数时,控制器方法才会对该请求进行处理。

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

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

@RequestMapping(value = "/testParam", params = {"name=zhang", "age=23"})
@ResponseBody
public String testParam() {return "success";
}

以上代码表示,只有当请求中同时携带 name 和 age两个请求参数,且参数值必须分别为 “zhang” 和“23”时,控制器方法 testParam() 才会对该请求进行处理 。

5. headers 属性

headers 属性用于设置请求中请求头信息,只有当请求中携带指定的请求头信息时,控制器方法才会处理该请求。

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

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

http://www.lryc.cn/news/156640.html

相关文章:

  • 软件架构之前后端分离架构服务器端高并发演进之路
  • 第4节-PhotoShop基础课程-Ps格式
  • C语言malloc函数学习
  • 从零开始学习deepsort目标追踪算法----原理和代码详解
  • 第三章 LInux多线程开发 3.1-3.5线程创建 终止 分离
  • 空间曲线的参数方程
  • 非华为机型如何体验HarmonyOS鸿蒙系统 刷写HarmonyOS鸿蒙GSI系统以及一些初步的bug修复
  • Flutter 生成小程序的混合 App 实践
  • 利用 Python-user-agents 解析 User_Agent
  • Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
  • Mybatis如何给字段起别名?
  • php对接AWS S3云存储,上传S3及访问权限问题
  • java 实现单例模式
  • minio文件服务器开启https
  • 每日刷题(回溯法经典问题之子集)
  • PostgreSQL在进行除法时要注意
  • 开开心心带你学习MySQL数据库之第五篇
  • Geotools对geojson的解析
  • 【博客701】shell实现保留网络现场:ping失败时执行mtr
  • 放弃手写代码吧!用低代码你能生成各种源码
  • 什么程度才算精通 Linux?
  • jmeter中的__setProperty用法
  • vue基础知识六:v-show和v-if有什么区别?使用场景分别是什么?
  • SpringBoot几个常用的注解
  • 腾讯JAVA后端秋招面试总结
  • 随着iPhone 15降临,是时候扔掉所有的Lightning充电器了
  • huggingface 使用入门笔记
  • ASP.NET Core 中的 Razor Pages
  • C语言入门 Day_14 for循环
  • 深入解析 Socks5 代理与网络安全