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

Spring MVC常用十大注解

Spring MVC常用十大注解

一,什么要使用注解

使用注解可以简化配置,提高代码的可读性和可维护性。通过注解可以实现依赖注入,减少手动管理对象的代码量。注解还支持面向切面编程,实现切面、切入点和通知等。此外,注解提供了声明式事务管理的支持,简化了事务配置和管理。注解还可以用于组件扫描和自动装配,提高开发效率。最后,注解在测试时也有很好的支持。总之,注解使得代码更简洁、灵活,并能更好地利用框架的功能和特性。

1.@Controller

1.作用

在使用 Spring MVC 框架开发 Web 应用程序时,@Controller 注解是用来标识一个类为控制器(Controller)的注解。控制器层负责接收用户请求,并根据请求处理逻辑选择合适的业务逻辑进行处理,最终返回响应给用户。

2.示例代码

控制器的主要作用包括:

  1. 接收用户请求:控制器负责接收用户发起的请求,可以通过注解中的 @RequestMapping 来定义请求的 URL 地址和请求方法(如 GET、POST 等),从而将请求映射到相应的处理方法。

  2. 处理请求:控制器包含多个处理方法,每个方法用于处理不同的请求或请求路径。这些方法通常返回数据模型、视图名称或者响应体,完成请求的处理逻辑。

  3. 调用业务逻辑:控制器通过调用合适的服务层或业务逻辑组件来处理业务逻辑,以满足用户请求的需求。

  4. 返回响应:控制器根据处理结果,可以选择返回数据模型给视图进行渲染,或者直接返回响应体给客户端。可以通过注解如 @ResponseBody@RestController 来标识方法返回的是响应体。

下面是一个示例代码,展示了一个简单的 Spring MVC 控制器类:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping("/example")
public class ExampleController {@RequestMapping("/hello")@ResponseBodypublic String hello() {return "Hello, World!";}
}

上述代码中,通过 @Controller 注解将类标识为控制器,并使用 @RequestMapping 注解定义了请求路径的前缀为 “/example”。方法 hello() 使用 @RequestMapping 注解来定义了处理 “/hello” 路径的 GET 请求,@ResponseBody 则表示将返回的字符串直接作为响应体返回给客户端。

通过以上示例代码,可以看到控制器的作用是接收并处理用户请求,并根据请求的逻辑选择合适的处理方法进行处理,并最终返回响应给客户端。

2.@RequestMapping

1.作用

@RequestMapping 注解是 Spring MVC 框架中的一个核心注解,用于将请求映射到相应的处理方法。它可以用在类级别和方法级别上,具体作用如下:

  1. 类级别的 @RequestMapping 用于指定该类中所有处理方法的公共请求路径前缀。当用户请求的 URL 匹配该前缀时,会进入该类中的处理方法进行处理。

  2. 方法级别的 @RequestMapping 用于指定处理请求的方法和请求路径。当用户请求的 URL 匹配该路径时,会调用该方法进行处理。

2.示例代码

下面是一个示例代码:

@Controller
@RequestMapping("/example")
public class ExampleController {@RequestMapping(value = "/hello", method = RequestMethod.GET)@ResponseBodypublic String hello() {return "Hello, World!";}
}

以上示例代码展示了类级别和方法级别的 @RequestMapping 的使用。类级别的 @RequestMapping 指定了公共请求路径前缀为 “/example”,而方法级别的 @RequestMapping 指定了处理 “/hello” 路径的 GET 请求。

这意味着,当用户访问 “/example/hello” 路径时,会由 hello() 方法来处理该请求,并将返回的字符串 “Hello, World!” 作为响应体返回给客户端。

使用 @RequestMapping 注解可以灵活地定义请求的路径和处理方法,同时支持多种请求方法(如 GET、POST、PUT、DELETE 等),以满足不同的业务需求。

3.@RequestParam

1.作用

@RequestParam 注解用于将 HTTP 请求中的参数绑定到控制器方法的参数上,即获取请求中的参数值并映射到方法参数。它支持几乎所有的数据类型,包括基本数据类型和复杂数据类型。

2.示例代码

下面是一个使用 @RequestParam 注解的示例代码:

@Controller
@RequestMapping("/example")
public class ExampleController {@RequestMapping(value = "/hello", method = RequestMethod.GET)@ResponseBodypublic String hello(@RequestParam("name") String name) {return "Hello, " + name + "!";}
}

以上示例代码中,@RequestParam("name") 表示方法参数 name 与请求参数 name 相对应,Spring MVC 框架会自动将请求参数 name 的值注入到方法参数 name 中。

当用户访问 “/example/hello?name=world” 时,框架会将请求参数 name 的值 “world” 绑定到方法参数 name 上,并执行 hello() 方法,返回 “Hello, world!”。

此外,@RequestParam 还支持一些可选属性,例如 required 属性可以指定该参数是否是必须的,默认为 truedefaultValue 属性可以指定当参数未传递时的默认值。

总之,@RequestParam 注解是用来获取请求参数并在控制器方法中使用的重要注解,可以让我们方便地获取 HTTP 请求参数,并进行相应的处理。

4.@PathVariable

1.作用

@PathVariable 注解用于获取 URL 中的动态参数,即将 URL 中的变量映射到控制器方法的参数上。这样就可以通过 URL 传递参数,而不是通过查询字符串的方式来传递参数。

2.示例代码

下面是一个使用 @PathVariable 注解的示例代码:

@Controller
@RequestMapping("/example")
public class ExampleController {@RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)@ResponseBodypublic String hello(@PathVariable("name") String name) {return "Hello, " + name + "!";}
}

以上示例代码中,@PathVariable("name") 表示将 URL 中的变量 name 映射到方法参数 name 上。

当用户访问 “/example/hello/world” 时,框架会将 URL 中的动态变量 world 绑定到方法参数 name 上,并执行 hello() 方法,返回 “Hello, world!”。

另外,@PathVariable 还支持一些可选属性,例如 required 属性可以指定该参数是否是必须的,默认为 true。如果没有提供该路径变量,则将设置为 null 值。

总之,@PathVariable 注解是用于获取 URL 中动态参数值并在控制器方法中使用的重要注解,可以方便地将 URL 中的动态变量转换为对应的方法参数值。

5.@RequestBody

1.作用

@RequestBody 注解用于将 HTTP 请求体中的数据绑定到控制器方法的参数上,即获取 POST 请求中的数据并映射到方法参数。它通常用于处理 JSON 或 XML 格式的请求体数据。

2.示例代码

下面是一个使用 @RequestBody 注解的示例代码:

@Controller
@RequestMapping("/example")
public class ExampleController {@RequestMapping(value = "/addUser", method = RequestMethod.POST)@ResponseBodypublic String addUser(@RequestBody User user) {// 处理用户数据return "User added successfully!";}
}

在上述示例代码中,@RequestBody 用于将 HTTP 请求体中的数据转换成 User 对象,并将其作为参数传递给 addUser() 方法进行处理。

当用户提交 POST 请求时,将会包含一个 JSON 或 XML 格式的请求体数据,然后框架会使用 Jackson 或 JAXB 等工具将其转换成 User 对象。

注意,使用 @RequestBody 注解时需要确保请求体数据的格式与方法参数类型匹配。例如,如果控制器方法的参数是 String 类型,那么请求体中的数据应该是纯文本格式的。

总之,@RequestBody 注解是用于获取 POST 请求体中的数据并在控制器方法中使用的重要注解,可以方便地将请求体中的数据转换成 Java 对象并进行相应的处理。

6.@ResponesBody

1.作用

@ResponseBody 注解用于将方法的返回值直接作为 HTTP 响应的内容,而不是通过视图解析器返回一个视图。它通常与 @RequestMapping 注解一起使用。

2.示例代码

下面是一个使用 @ResponseBody 注解的示例代码:

@Controller
@RequestMapping("/example")
public class ExampleController {@RequestMapping(value = "/hello", method = RequestMethod.GET)@ResponseBodypublic String hello() {return "Hello, World!";}
}

在上述示例代码中,@ResponseBody 注解表示将方法的返回值直接作为 HTTP 响应的内容返回。

当用户访问 “/example/hello” 时,框架会执行 hello() 方法,并将方法返回的字符串 “Hello, World!” 作为 HTTP 响应的内容返回给客户端。

@ResponseBody 注解不仅可以返回纯文本响应,还可以返回其他类型的数据,例如 JSON 或 XML。

总之,@ResponseBody 注解用于将方法的返回值直接作为 HTTP 响应的内容返回给客户端,提供了方便的方式来返回不需要通过视图解析器进行处理的响应内容。

7.@RestController

1.作用

@RestController 是一个组合注解,它是 @Controller@ResponseBody 两个注解的整合。它表示控制器类中的所有方法都会返回 JSON、XML 或其他格式的数据,而不是视图。

2.示例代码

下面是一个使用 @RestController 注解的示例代码:

@RestController
@RequestMapping("/example")
public class ExampleController {@RequestMapping(value = "/hello", method = RequestMethod.GET)public String hello() {return "Hello, World!";}
}

在上述示例代码中,@RestController 表示该控制器类中的所有方法都将返回数据(可以是 JSON、XML 等格式),而不是视图。

当用户访问 “/example/hello” 时,框架会执行 hello() 方法,并将其返回的字符串 “Hello, World!” 作为 HTTP 响应的内容返回给客户端。

@Controller 注解不同的是,如果使用 @RestController 注解,则不必为每个方法都添加 @ResponseBody 注解,因为该注解已经包含在 @RestController 中了。

总之,@RestController 注解是用于表示控制器类中所有方法都将返回数据的注解,方便快捷地返回 JSON、XML 或其他格式的响应内容,减少了在控制器方法中添加 @ResponseBody 注解的重复性工作。

8.@ModelAttribute

1.作用

@ModelAttribute 注解用于绑定请求参数到方法的参数或方法级别的模型属性上。

2.示例代码

  1. 绑定请求参数到方法的参数上:

    @RequestMapping(value = "/example", method = RequestMethod.GET)
    public String example(@ModelAttribute("name") String name) {// 处理请求参数return "Hello, " + name + "!";
    }
    

    在上述示例代码中,@ModelAttribute("name") 表示将名为 “name” 的请求参数绑定到方法的 name 参数上。当用户发送一个 GET 请求时,例如 /example?name=John,框架会自动将请求参数中的 “name” 值赋值给 name 参数。

  2. 绑定请求参数到方法级别的模型属性:

    @ModelAttribute("user")
    public User getDefaultUser() {User user = new User();user.setName("John");user.setAge(20);return user;
    }
    

    在上述示例代码中,@ModelAttribute("user") 表示将方法返回的 User 对象绑定为模型属性,并使用 “user” 作为模型属性的名称。

    当在视图中需要访问该模型属性时,可以直接使用 ${user} 进行访问。例如,在 JSP 视图中,可以使用 ${user.name} 获取用户的名称。

总之,@ModelAttribute 注解用于绑定请求参数到方法的参数或方法级别的模型属性上,提供了方便的方式来获取请求参数或预设模型属性的值,并在控制器方法中进行处理或在视图中使用。

9.@SessionAttributes

1.作用

@SessionAttributes 注解是用于将模型属性暂时存储在会话(Session)中的注解。它可以用在控制器类级别或控制器方法级别。

2.示例代码

  1. 在控制器类级别使用 @SessionAttributes

    @Controller
    @SessionAttributes("user")
    public class UserController {// ...
    }
    

    在上述示例代码中,@SessionAttributes("user") 表示将名为 “user” 的模型属性存储在会话中。当请求处理方法返回时,存储在会话中的模型属性将保留下来,直到会话结束或被清除。

  2. 在控制器方法级别使用 @SessionAttributes

    @Controller
    @SessionAttributes("user")
    public class UserController {@RequestMapping(value = "/user", method = RequestMethod.GET)public String getUser(@RequestParam("id") int id, Model model) {User user = userService.getUserById(id);model.addAttribute("user", user);return "user";}
    }
    

    在上述示例代码中,@SessionAttributes("user") 表示将控制器方法中添加的名为 “user” 的模型属性存储在会话中。在这个例子中,getUser() 方法从数据库中获取用户信息,并将其添加到模型中。模型属性 “user” 将存储在会话中,并在后续请求中仍然可用。

需要注意的是,@SessionAttributes 注解只能用于存储模型属性,不能用于存储任意类型的对象。

总结来说,@SessionAttributes 注解用于将模型属性存储在会话中。通过在控制器类或方法上添加该注解,可以方便地管理会话中的模型属性,并在多个请求之间共享数据。

10.@ExceptionHandler

1.作用

@ExceptionHandler 注解用于定义一个处理异常的方法。它可以用在控制器类级别或控制器方法级别。

2.示例代码

  1. 在控制器类级别使用 @ExceptionHandler

    @ControllerAdvice
    public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ModelAndView handleException(Exception e) {ModelAndView mv = new ModelAndView();mv.addObject("errMsg", "系统异常:" + e.getMessage());mv.setViewName("error");return mv;}
    }
    

    在上述示例代码中,@ControllerAdvice 注解用于定义一个全局的异常处理器,可以处理所有控制器中抛出的异常。@ExceptionHandler(Exception.class) 注解表示该方法用于处理所有类型的异常。当控制器中抛出异常时,就会调用该方法来处理异常,并返回错误页面。

  2. 在控制器方法级别使用 @ExceptionHandler

    @Controller
    public class UserController {@ExceptionHandler(UserNotFoundException.class)public ModelAndView handleUserNotFoundException(UserNotFoundException e) {ModelAndView mv = new ModelAndView();mv.addObject("errMsg", "用户不存在:" + e.getMessage());mv.setViewName("error");return mv;}@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)public String getUser(@PathVariable("id") int id) {User user = userService.getUserById(id);if (user == null) {throw new UserNotFoundException("id=" + id);}return "user";}
    }
    

    在上述示例代码中,@ExceptionHandler(UserNotFoundException.class) 注解表示该方法用于处理 UserNotFoundException 类型的异常。当控制器方法中抛出该异常时,就会调用该方法来处理异常,并返回错误页面。

总之,@ExceptionHandler 注解用于定义一个处理异常的方法,可以用在控制器类级别或控制器方法级别。通过添加该注解,可以方便地处理控制器中抛出的异常,并返回错误信息或错误页面。

相关文章:

Spring MVC常用十大注解

Spring MVC常用十大注解 一,什么要使用注解 使用注解可以简化配置,提高代码的可读性和可维护性。通过注解可以实现依赖注入,减少手动管理对象的代码量。注解还支持面向切面编程,实现切面、切入点和通知等。此外,注解提…...

二、【MyBatis】 MyBatis入门与简单使用

二、【MyBatis】 MyBatis入门与简单使用 二、【MyBatis】 MyBatis入门与简单使用一、什么是ORM二、为什么mybatis是半自动的ORM框架2.1 Hibernate优点2.2 Hibernate缺点2.3 MyBatis与Hibernate区别三、Mybatis快速入门3.1 项目引入Maven相关依赖3.2 创建测试数据库3.3 编写数据…...

基于DF模式的协作通信技术matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、DF概述 4.2、DF基本原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2013b 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd))…...

Angular-01:基本架构

各种学习后的知识点整理归纳,非原创! ① 概述 angular是一个使用HTML、CSS、TypeScript构建的客户端应用的框架,用来构建单页面应用程序。是一个重量级的框架,内部集成了大量开箱即用的功能模块。是为大型应用开发而设计&#xf…...

字符串划分

题目描述 给定一个小写字母组成的字符串s,请找出字符串中两个不同位置的字符作为分割点,使得字符串分成的三个连续子串且子串权重相等,注意子串不包含分割点。 若能找到满足条件的两个分割点,请输出这两个分割点在字符串中的位置…...

ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9‘ not found的解决方法

导致该错误的原因:gcc动态库版本太老了 解决方法: 1、编辑~/.bash_profile vim ~/.bash_profile 2、将anaconda3/lib的路径加入库文件的路径 LD_LIBRARY_PATH/your_path/anaconda3/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH 3、重载~/.bash_pr…...

华为云全新上线Serverless应用中心,支持一键构建文生图应用

近日,华为云全新上线Serverless应用中心,提供了大量应用模板,让用户能够一键部署函数和周边依赖资源,节省部署时间,快速上手将应用部署到华为云函数计算FunctionGraph,并一键开通周边依赖资源。 本次Serve…...

scrapy的安装和使用

一、scrapy是什么:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序 二、scrapy的安装:pip install scrapy -i https://pypi.douban.com/…...

Kotlin中的异常处理

异常是在程序执行过程中出现的错误或意外情况,可以干扰程序的正常流程。在Kotlin中,我们可以通过异常处理机制来捕获和处理异常,以保证程序的稳定性。本篇博客将介绍异常的产生、捕获、定义、受检异常和finally关键字,并提供相应的…...

[Ubuntu 18.04] 搭建文件夹共享之Samba服务器

Samba是一个开源项目,允许Windows用户在Linux和Unix系统上进行文件共享。 Samba服务器是一个可以让Linux或Unix系统在网络上充当Windows NT/2000/XP/2003等网络操作系统的共享资源的软件。它允许用户通过SMB/CIFS协议在Linux或Unix系统与Windows共享资源。 Samba服务器的主要…...

设计模式-装饰器模式

目录 设计模式-装饰器模式什么是装饰器设计模式?java示例 设计模式-装饰器模式 什么是装饰器设计模式? 装饰器设计模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象包装在一个装饰器类中来动态地扩展…...

【Vs code调试C++】

参考文献第一个很重要 主要是配置task.json,其余的可以不用管 参考文献 [1]详解Linux下使用vscode编译运行和调试C/C [2]vscode关于C/C编译运行的一些小配置...

使用 C++创建一个简易的数据库管理系统 (DBMS)

在数据库领域,数据库管理系统 (DBMS) 是一个软件系统,它提供与用户、其他应用程序和数据库之间的接口,用于存储、检索、更新和管理数据。在这篇博客中,我们将学习如何使用 C 创建一个简易的 DBMS,包括事务、并发控制、…...

简单了解一下:NodeJS的WebSocket网络编程

NodeJS的webSocket网络编程。 那什么是WebSocket呢?WebSocket是HTML5提供的一种浏览器和服务器进行通信的网络技术。两者之间,只需要做一个握手动作,就可以在浏览器和服务器之间开启一条通道,就可以进行数据相互传输。 实现WebS…...

目标检测技术概述

什么是目标检测? 在计算机视觉众多的技术领域中,目标检测(Object Detection)也是一项非常基础的任务,图像分割、物体追踪、关键点检测等通常都要依赖于目标检测。在目标检测时,由于每张图像中物体的数量、…...

软件设计原则-开闭原则讲解以及代码示例

开闭原则 一,介绍 1.前言 开闭原则(Open-Closed Principle,OCP)是面向对象设计中的一条重要原则,它由Bertrand Meyer在其著作《面向对象软件构造》中提出,并成为SOLID原则之一。 开闭原则的核心思想是&…...

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制) 目录 分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制)分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现…...

LeetCode--180 连续出现的数字

文章目录 1 题目描述2 结果示例3 解题思路3.1 MySQL 代码 4 知识拓展 1 题目描述 Logs表: ---------------------- | Column Name | Type | ---------------------- | id | int | | num | varchar | ----------------------在 SQL 中,id …...

面试算法34:外星语言是否排序

题目 有一门外星语言,它的字母表刚好包含所有的英文小写字母,只是字母表的顺序不同。给定一组单词和字母表顺序,请判断这些单词是否按照字母表的顺序排序。例如,输入一组单词[“offer”,“is”,“coming”…...

常用docker命令 docker_cmd_sheet

查看所有docker 容器 docker ps 查看 特定docker容器 比如con1 docker ps | grep con1 查看镜像 docker images 拉取镜像 docker pull imageXXX 打标签 docker tag imageXXX:1.4.0 镜像名冒号tag 按照docker-compose.yml 启动容器,在有docker-compose…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...