Spring MVC常见注解详解

news2025/5/11 8:03:18

Spring MVC提供了丰富的注解,以简化Web应用开发过程。下面我将详细描述一些主要的注解、它们的作用、应用场景以及具体的应用示例。

1. @Controller

  • 作用: 标记一个类作为Spring MVC的控制器组件。这个注解是定义处理HTTP请求的入口点。
    • 标识控制器组件@Controller注解用来标记一个Java类为Spring容器中的一个Bean,并且这个Bean主要用于处理HTTP请求。
    • 支持自动扫描: 当配置了组件扫描(例如通过<context:component-scan>)时,Spring会自动发现并注册这些被@Controller标注的类为Spring Bean。
  • 应用场景:
    • Web层开发: 主要用于构建Web应用的控制层,负责处理客户端发来的请求,调用业务逻辑层的方法,并返回相应的视图或数据给客户端。
    • MVC架构中的C部分: 在Model-View-Controller (MVC)设计模式中,@Controller代表控制器(Controller),负责接收用户请求,处理业务逻辑,并指定响应结果。
  • 示例:

    以下是一个简单的例子,展示了如何使用@Controller来创建一个基本的Spring MVC控制器:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class HelloController {
    
        // 映射URL到特定的处理器方法
        @RequestMapping("/hello")
        public String hello() {
            // 返回逻辑视图名称,视图解析器会根据这个名称找到具体的视图页面
            return "hello";
        }
    }

2. @RestController

  • 作用: 组合了@Controller@ResponseBody的功能,适用于构建RESTful Web服务。
    • 标识REST控制器@RestController 注解用来标记一个Java类作为处理REST请求的控制器。它结合了 @Controller 和 @ResponseBody 注解的功能,意味着在这个控制器里的每个方法都会直接返回响应体,而不是视图名称。
    • 支持自动扫描: 类似于 @Controller, 当配置了组件扫描时,Spring会自动发现并注册这些被 @RestController 标记的类为Spring Bean。
  • 特点:
    • 简化开发: 使用 @RestController 可以避免在每个处理方法上都添加 @ResponseBody 注解,简化了代码。
    • 默认返回JSON/XML: 该注解下的方法通常返回的是数据而非视图,因此非常适合用于构建RESTful API。返回的数据一般会被转换成JSON或XML格式(取决于客户端接受的内容类型和配置)。
  • 应用场景: 在需要直接返回响应体(如JSON或XML)而不是视图名称时使用。
  • 示例:

    下面是一个简单的例子,展示了如何使用 @RestController 创建一个基本的RESTful API:

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
        // 映射GET请求到特定的处理器方法
        @GetMapping("/greeting")
        public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
            return String.format("Hello, %s!", name);
        }
    }

    在这个例子中,当用户访问 /greeting URL时(例如:/greeting?name=Spring),GreetingController 中的 greeting() 方法会被调用,它接收一个名为 name 的查询参数,并返回一个字符串形式的问候消息。如果未提供 name 参数,则使用默认值 "World"。

3. @RequestMapping

  • 作用:

    • URL映射: 主要用于映射HTTP请求到控制器的方法上。可以指定HTTP请求的URL、HTTP方法(GET, POST等)、请求参数、头部信息等。
    • 支持多种HTTP方法: 可以用来处理GET、POST、PUT、DELETE等多种类型的HTTP请求。
  • 属性
    • value / path: 定义请求路径或路径模式,如 /home/user/{id}
    • method: 指定HTTP请求方法类型,比如 RequestMethod.GETRequestMethod.POST
    • params: 通过请求参数来缩小匹配范围,例如 params = "action=update" 表示只有当请求中包含特定参数时才匹配。
    • headers: 根据请求头信息来限制映射,例如 headers = "content-type=text/plain"
    • produces / consumes: 指定媒体类型来限制映射,适用于RESTful服务,produces 用于响应内容类型,consumes 用于请求内容类型。
  • 示例:

    以下是一些具体的使用示例,帮助理解 @RequestMapping 的不同用法:
  • 基本映射
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

此代码段展示了最基本的用法,访问 /hello URL时返回字符串 "Hello, World!"。

  • 指定HTTP方法
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public String getUserList() {
        return "User list";
    }
}

这里仅当收到对 /users 的GET请求时,才会调用 getUserList() 方法。

  • 路径变量
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class BookController {

    @RequestMapping("/books/{bookId}")
    public String getBook(@PathVariable("bookId") String bookId) {
        return "Details for book id: " + bookId;
    }
}

这个例子演示了如何从URL中提取变量(如 {bookId})并将其作为参数传递给处理方法。

  • 请求参数
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SearchController {

    @RequestMapping("/search")
    public String search(@RequestParam(value = "query", defaultValue = "spring") String query) {
        return "You searched for: " + query;
    }
}

该示例展示了如何获取和使用查询参数,如果未提供 query 参数,则默认值为 "spring"

4. @GetMapping & @PostMapping

它们分别用于处理HTTP GET和POST请求。这两个注解实际上是 @RequestMapping 的特例,提供了更加简洁、直观的方式来指定需要处理的HTTP方法类型。下面我将详细介绍这两个注解,并提供一些代码示例帮助理解。

@GetMapping

@GetMapping 注解是一个组合注解,它等同于 @RequestMapping(method = RequestMethod.GET)。这意味着它专门用于处理HTTP GET请求,即当用户尝试从服务器获取资源时所使用的请求类型。

示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, welcome to the application!";
    }
}

在这个例子中,每当客户端向 /hello 发送GET请求时,sayHello() 方法就会被调用,并返回欢迎信息。

@PostMapping

类似地,@PostMapping 也是一个组合注解,它等价于 @RequestMapping(method = RequestMethod.POST)。这个注解用于处理HTTP POST请求,通常用来处理客户端提交的数据,比如表单提交或通过API发送的数据。

示例:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DataController {

    @PostMapping("/submit")
    public String handleSubmit(@RequestParam("name") String name) {
        return "Received data: Name is " + name;
    }
}

在上面的例子中,如果客户端向 /submit 路径发送一个POST请求,并且请求参数中包含名为 name 的参数,则 handleSubmit() 方法会被调用,并返回接收的数据信息。

结合使用

有时你可能需要同时处理GET和POST请求,或者根据不同的条件执行不同的逻辑。这时可以结合使用 @GetMapping@PostMapping 来分别处理不同类型的请求。

示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MultiRequestController {

    @GetMapping("/data")
    public String getData() {
        return "This is data from a GET request.";
    }

    @PostMapping("/data")
    public String postData(@RequestParam("content") String content) {
        return "Received via POST: " + content;
    }
}

在这个例子中,/data 路径既可以接受GET请求也可以接受POST请求,但是会根据请求的类型执行不同的方法。

5. @PathVariable

  • 作用: 获取URL中的占位符参数值。
    • 用于从URL中提取路径变量。它通常与 @RequestMapping(或其特化形式如 @GetMapping, @PostMapping 等)一起使用,以实现RESTful风格的Web服务。通过 @PathVariable,你可以将URL的一部分绑定到处理器方法的参数上,使得URL不仅仅是一个静态地址,而是可以包含动态数据。
  • 应用场景: REST风格的URL设计中获取动态部分

示例:

下面是如何使用 @PathVariable 注解的基本示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello/{name}")
    public String sayHello(@PathVariable String name) {
        return "Hello, " + name + "!";
    }
}

在这个例子中,当用户访问类似 /hello/John 的URL时,Spring会自动将 John 作为 name 参数传递给 sayHello() 方法,并返回 "Hello, John!"。

指定路径变量名

默认情况下,@PathVariable 绑定的参数名称需要与URL模板中的变量名称匹配。然而,如果你想要使用的参数名称与路径变量名称不同,可以通过指定 valuename 属性来明确指定要绑定的路径变量。

@GetMapping("/greet/{username}")
public String greetUser(@PathVariable("username") String user) {
    return "Greetings, " + user + "!";
}

在这个例子中,尽管方法参数名为 user,但通过 @PathVariable("username") 明确指定了要绑定的是URL模板中的 {username} 变量。

路径变量的数据类型

除了字符串之外,路径变量还可以是其他数据类型,比如整数、浮点数等。Spring会尝试自动转换这些类型。

@GetMapping("/product/{id}")
public String getProductById(@PathVariable Long id) {
    // 假设这里有一些逻辑来根据ID查找产品
    return "Product ID: " + id;
}

如果提供的路径变量不能被转换为指定的数据类型(例如,提供了一个非数字的字符串作为ID),Spring会返回一个HTTP 400错误(Bad Request)。

多个路径变量

你也可以在同一个映射中使用多个路径变量:

@GetMapping("/order/{orderId}/item/{itemId}")
public String getOrderItem(@PathVariable Long orderId, @PathVariable Long itemId) {
    return "Order ID: " + orderId + ", Item ID: " + itemId;
}

这个例子展示了如何处理更复杂的URL结构,其中包含了两个不同的路径变量。

6. @RequestParam

  • 作用: 绑定web请求参数到方法参数上。
  • 属性介绍:
    • value / name: 指定请求参数的名字,默认为变量名。
    • required: 是否必须提供该参数,默认是 true。如果设置为 false 并且请求中没有提供此参数,则会使用默认值或者传入 null
    • defaultValue: 当请求中未提供该参数时使用的默认值。
  • 应用场景: 获取请求参数值。

基本示例:

@GetMapping("/greet")
public String greetUser(@RequestParam("name") String name) {
    return "Hello, " + name;
}

如果用户访问 /greet?name=John,则返回 "Hello, John"

  • 指定默认值:

    @GetMapping("/welcome")
    public String welcomeUser(@RequestParam(value = "name", defaultValue = "Guest") String name) {
        return "Welcome, " + name;
    }

    如果用户访问 /welcome 而不提供 name 参数,则默认使用 "Guest" 作为 name 的值。

  • 非必填参数:

    @GetMapping("/info")
    public String userInfo(@RequestParam(value = "id", required = false) Integer id) {
        if (id == null) {
            return "No user specified.";
        } else {
            return "User ID: " + id;
        }
    }

    在这个例子中,id 参数不是必需的。如果请求中没有提供 id 参数,方法将返回 "No user specified."

7. @RequestBody

  • 作用: 用于将HTTP请求的正文(body)直接绑定到一个方法参数上。它通常用于处理 POSTPUT 请求,特别是当客户端发送的数据格式为 JSON 或 XML 时。
  • 应用场景: 当你需要从客户端接收复杂的对象数据而不是简单的查询参数或表单数据时,@RequestBody 就非常有用。例如,在 RESTful Web 服务中,客户端可能会发送一个 JSON 格式的用户信息给服务器以创建一个新的用户账户。
  • 工作原理:@RequestBody 注解告诉 Spring 框架,方法参数应绑定到 HTTP 请求体中的数据。Spring 使用 HttpMessageConverter 将请求体中的数据转换为你指定的方法参数类型。如果请求体是 JSON 格式,Spring 默认会使用 Jackson 库将其转换为 Java 对象。

  • 示例代码详解:

    假设我们有一个简单的 User 类:

    public class User {
        private String name;
        private int age;
    
        // Getters and Setters
    }

    接下来,我们将编写一个控制器来处理创建新用户的请求:

    @RestController
    @RequestMapping("/users")
    public class UserController {
    
        @PostMapping("/create")
        public ResponseEntity<String> createUser(@RequestBody User user) {
            // 在这里处理业务逻辑,比如保存用户到数据库
            System.out.println("Creating user: " + user.getName() + ", Age: " + user.getAge());
    
            return new ResponseEntity<>("User created successfully", HttpStatus.CREATED);
        }
    }

    在这个例子中,@RequestBody User user 表明我们需要从请求体中接收一个 JSON 格式的 User 对象。假设客户端发送如下 JSON 数据:

    {
        "name": "John Doe",
        "age": 30
    }

    Spring 将自动将这个 JSON 转换为 User 对象并传递给 createUser 方法。

8. @ResponseBody

  • 作用: 用于指示一个方法的返回值应直接作为 HTTP 响应体写入,并且不会被视图解析器解析。它通常用于 RESTful Web 服务中,返回 JSON 或 XML 格式的数据给客户端。
  • 应用场景: 当你希望从控制器方法直接返回数据而不是视图名称时,@ResponseBody 就显得非常有用。例如,在构建 REST API 时,你可能想要返回一个对象或集合作为响应,而这个响应通常是 JSON 或 XML 格式的
  • 工作原理:当一个方法被标记为 @ResponseBody,Spring 会使用适当的 HttpMessageConverter 将返回的对象转换为 HTTP 响应体的内容。如果客户端请求接受类型是 application/json,Spring 默认会使用 Jackson 库来序列化 Java 对象到 JSON 格式。

  • 示例代码详解:

    假设我们有一个简单的 User 类:

    public class User {
        private String name;
        private int age;
    
        // Getters and Setters
    }

    接下来,我们将编写一个控制器来处理查询用户信息的请求:

    @RestController
    @RequestMapping("/users")
    public class UserController {
    
        @GetMapping("/getUser")
        @ResponseBody
        public User getUser() {
            // 创建并返回一个User对象作为示例
            User user = new User();
            user.setName("John Doe");
            user.setAge(30);
            return user;
        }
    }

    在这个例子中,@ResponseBody 注解表明 getUser() 方法的返回值(即 User 对象)应当直接写入 HTTP 响应体。假设客户端发送了一个 GET 请求到 /users/getUser,服务器将返回如下 JSON 数据:

    {
        "name": "John Doe",
        "age": 30
    }

    注意:在上面的例子中,实际上不需要显式地添加 @ResponseBody 注解,因为 @RestController 注解已经隐式地应用了 @ResponseBody 到所有的请求映射方法上。

以上只是Spring MVC中常用的一部分注解。每个注解都有其特定的作用和适用场景,合理使用这些注解可以大大简化代码编写,提高开发效率。希望这个详细的描述能帮助你更好地理解和应用Spring MVC。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端分享】CSS实现3种翻页效果类型,附源码!

使用 css 可以实现多种翻页效果&#xff0c;比如书本翻页、卡片翻转等。以下是两种常见的翻页效果实现&#xff1a; 效果 1&#xff1a;书本翻页效果 通过 transform 和 rotateY 实现 3D 翻页效果。 html 结构 <divclass"book"> <divclass"page pa…

vue使用rules实现表单校验——校验用户名和密码

编写校验规则 常规校验 const rules {username: [{ required: true, message: 请输入用户名, trigger: blur },{ min: 5, max: 16, message: 长度在 5 到 16 个字符, trigger: blur }],password: [{ required: true, message: 请输入密码, trigger: blur },{ min: 5, max: 1…

diy装机成功录

三天前&#xff0c;我正式开启了这次装机之旅&#xff0c;购入了一颗性能强劲的 i5-12400 CPU&#xff0c;一块绘图能力出色的 3060ti 显卡&#xff0c;还有技嘉主板、高效散热器、16G 内存条、2T 固态硬盘&#xff0c;以及气派的机箱和风扇&#xff0c;满心期待能亲手打造一台…

【 Redis | 实战篇 缓存 】

目录 前言&#xff1a; 1.认识缓存 2.添加Redis缓存 2.1.根据id查询商铺缓存 2.2.优化根据id查询商铺缓存 3.缓存更新策略 3.1.三种策略 3.2.策略选择 3.3.主动更新的方案 3.4. Cache Aside的模式选择 3.5.最佳实践方案 4.缓存三大问题 4.1.缓存穿透 4.1.1.介绍 …

2025年全新 GPT 4.5 AI 大模型 国内免费调用

一、中转账号注册 第一步&#xff1a;打开宙流AI中转站&#xff0c;网站地址如下&#xff1a; 宙流AI中转站 按照上图中的操作步骤&#xff0c;通过邮箱进行账号注册&#xff0c;注册完毕后&#xff0c;网站初始会分配0.4刀的免费额度&#xff0c;获取额度后&#xff0c;即可…

“睿思 BI” 系统介绍

“睿思 BI” 商业智能系统是由成都睿思商智科技有限公司自主研发的企业数据分析系统&#xff0c;以下是对该系统的详细介绍&#xff1a; 功能模块 &#xff1a; • 数据集成与准备 &#xff1a;支持数据导入、数据填报、数据 ETL 等功能&#xff0c;可抽取企业在经营过程中产生…

虚假AI工具通过Facebook广告传播新型Noodlophile窃密木马

网络安全公司Morphisec的研究人员发现&#xff0c;攻击者正利用虚假人工智能&#xff08;AI&#xff09;平台传播名为Noodlophile Stealer的新型信息窃取木马。这种复杂攻击手法利用AI工具的热度诱骗用户下载恶意软件&#xff0c;窃取浏览器凭证、加密货币钱包&#xff0c;并可…

麦科信获评CIAS2025金翎奖【半导体制造与封测领域优质供应商】

在苏州举办的2025CIAS动力能源与半导体创新发展大会上&#xff0c;深圳麦科信科技有限公司凭借在测试测量领域的技术积累&#xff0c;入选半导体制造与封测领域优质供应商榜单。本届大会以"新能源芯时代"为主题&#xff0c;汇集了来自功率半导体、第三代材料应用等领…

指针运算典型例题解析

1.题目1 该代码运行的结果是什么&#xff1f; #include <stdio.h> int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } 解析&#xff1a; 运行结果&#xff1a; 2.题目2 在X86…

DAX 权威指南1:DAX计算、表函数与计算上下文

参考《DAX 权威指南 第二版》 文章目录 二、DAX简介2.1 理解 DAX 计算2.2 计算列和度量值2.3 变量2.3.1 VAR简介2.3.2 VAR的特性 2.4 DAX 错误处理2.4.1 DAX 错误类型2.4.1.1 转换错误2.4.1.2 算术运算错误2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函数拦截错误2.4.2.1 安全地进…

使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据

作者&#xff1a;来自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 为 RAG 应用构建可扩展的非结构化文档数据管道。 Elasticsearch 原生集成了行业领先的生成式 AI 工具和提供商。查看我们的网络研讨会&#xff0c;了解如…

20250508在WIN10下使用移远的4G模块EC200A-CN直接上网

1、在WIN10/11下安装驱动程序&#xff1a;Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip 2、使用移远的专用串口工具&#xff1a;QCOM_V1.8.2.7z QCOM_V1.8.2_win64.exe 3、配置串口UART42/COM42【移远会自动生成连续三个串口&#xff0c;最小的那一个】 AT命令&#xf…

C++(6):逻辑运算符

目录 1. 代码示例 示例 1&#xff1a;基础用法 示例 2&#xff1a;条件判断 2. 短路求值&#xff08;Short-Circuit Evaluation&#xff09; 代码示例 3. 实际应用场景 场景 1&#xff1a;输入合法性验证 场景 2&#xff1a;游戏状态判断 4. 注意事项 逻辑运算符用于组…

NXP iMX8MP ARM 平台多屏幕克隆显示测试

By Toradex秦海 1). 简介 NXP i.MX8MP ARM SoC 支持 3 路 Display Controller 分别提供 DSI/HDMI/LVDS 显示输出&#xff0c;在 Yocto Linux BSP 下采用 Wayland Backend 基于 DRM subsystem 显示驱动&#xff0c;前端默认基于 Weston Compositor。因此在默认情况下连接多个屏…

【数据结构】——栈

一、栈的概念和结构 栈其实就是一种特殊的顺序表&#xff0c;其只允许在一端进出&#xff0c;就是栈的数据的插入和删除只能在一端进行&#xff0c;进行数据的插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循先进后出LIFO&#xff08;Last InFirst O…

Navicat中保存的数据库密码找回 Java 8

导出数据库连接打开导出的connections.ncx文件找到加密的password放入java程序中解密即可 package com.asia.card.cloud.enterprise.api;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.cha…

vs code管理员权限启动问题

vs code非管理员启动可以正常启动用管理员启动vs code&#xff0c;会提示 解决办法 找到argv.json文件在argv.json文件中添加 "disable-chromium-sandbox": true重启vs code即可

Spring Cloud与Service Mesh集成:Istio服务网格实践

文章目录 引言一、Spring Cloud与Service Mesh概述二、Istio服务网格架构三、Spring Cloud与Istio集成的基础设施准备四、服务发现与负载均衡五、流量管理与弹性模式六、安全通信与认证授权七、可观测性集成八、配置管理集成总结 引言 微服务架构已成为现代分布式系统的主流设…

React+Taro选择日期组件封装

话不多说&#xff0c;直接上效果 1.页面渲染时间模块 {this.renderCalendarPopup()}2.引入时间组件弹层&#xff0c;state中加入showPopup(控制什么时候展示时间选择弹层)&#xff0c;time(选择后的时间值) private renderCalendarPopup () > {const { showPopup, time…

C++进阶--AVL树的实现续

文章目录 C进阶--AVL树的实现双旋AVL树的查找AVL树的检验结语 很高兴和搭大家见面&#xff0c;给生活加点impetus&#xff0c;开启今天的比编程之路&#xff01;&#xff01; 今天我们来完善AVL树的操作&#xff0c;为后续红黑树奠定基础&#xff01;&#xff01; 作者&#x…