Spring MVC常用十大注解

news2025/2/27 4:52:07

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")
    @ResponseBody
    public 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)
    @ResponseBody
    public 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)
    @ResponseBody
    public 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)
    @ResponseBody
    public 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)
    @ResponseBody
    public 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)
    @ResponseBody
    public 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 注解用于定义一个处理异常的方法,可以用在控制器类级别或控制器方法级别。通过添加该注解,可以方便地处理控制器中抛出的异常,并返回错误信息或错误页面。

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

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

相关文章

maven仓库改国内源

今天准备复现漏洞环境,发现太慢,需要配置国内源 file -> settings 搜索maven 修改settings.xml,这里的需要修改两个文件 1.上图的settings.xml文件 2.idea的maven模块 settings.xml文件将原来的注释掉,然后把阿里的添加上&…

【机器学习合集】激活函数合集 ->(个人学习记录笔记)

文章目录 1. S激活函数(sigmoid&Tanh)2. ReLU激活函数3. ReLU激活函数的改进4. 近似ReLU激活函数5. Maxout激活函数6. 自动搜索的激活函数Swish 1. S激活函数(sigmoid&Tanh) Sigmoid函数在机器学习中经常用作激活函数,但它在某些情况下容易出现梯度消失问题…

QWidget快速美化-蓝色边框圆角按钮

将代码复制进QPushButton的样式表 效果: 代码: QPushButton{ color:#52DCFE;border:2px solid #52DCFE;border-radius:5px; }QPushButton::hover{background-color:#52DCFE;color:#ffffff; }QPushButton::pressed,QPushButton::checked{background-color:#52DCFE;color:#ffff…

学习vue3

一、入门 1.引入外部库 ①直接将所有的js都通过script标签引入到html文件中,所有的js资源在web页面中都能通用。 ②使用js引用js(ES6),模块导入与导出 2.模块是只读引用 这段话是在解释 Vue.js 中的概念和用法。在 Vue.js 中&a…

​​​​​​​Python---练习:使用while嵌套循环打印 9 x 9乘法表

案例 使用while嵌套循环打印 9 x 9乘法表 思考 之前做过打印出三角形,那个三角形是5行的,这次打印9行的三角形。可以先使用while嵌套循环打印9行的直角三角形 相关链接Python---练习:打印直角三角形(利用wihle循环嵌套&#xf…

Ubuntu下载、安装QGIS软件的方法

本文介绍在Linux操作系统Ubuntu版本中,通过命令行的方式,配置QGIS软件的方法。 在Ubuntu等Linux系统中,可以对空间信息加以可视化的遥感、GIS软件很少,比如ArcGIS下属的ArcMap就没有对应的Linux版本(虽然有ArcGIS Serv…

Kafka简单入门02——ISR机制

目录 ISR机制 ISR 关键概念 HW和LEO Java使用Kafka通信 Kafka 生产者示例 Kafka 消费者示例 ISR机制 Kafka 中的 ISR(In-Sync Replicas)机制是一种用于确保数据可靠性和一致性的重要机制。ISR 是一组副本,它包括分区的领导者&#xff…

CCF CSP认证历年题目自练Day38

题目 试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感…

进程之操作系统的概念

再小的努力,乘以365都很明显。文章目录 操作系统操作系统的概念设计操作系统的目的 管理 ps:如何理解管理如何进行管理 操作系统管理软硬件资源小总结系统调用和库函数的概念小总结 操作系统 在讲述进程的时候我们先讲述一下操作系统(os),因…

基于Java的小说下载网站管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

支持多用户协作的API测试工具:Apipost

在当今快速发展的数字化时代,API已成为企业与开发者实现数据互通、应用集成的重要桥梁。然而,随着API数量的不断增加,API开发、调试、测试、文档等工作也变得越来越复杂。为了解决这一痛点,一款名为Apipost的API协同研发工具应运而…

Python基础入门例程6-NP6 牛牛的小数输出

目录 描述 输入描述: 输出描述: 示例1 解答: 说明: 描述 牛牛正在学习Python的输出,他想要使用print函数控制小数的位数,你能帮助它把所有读入的数据都保留两位小数输出吗? 输入描述&a…

006:vue使用lottie-web实现web动画

文章目录 1. 简介2. 优点3. 效果4. 安装使用5. lottie-web 常用方法6. Lottie-web 常用的事件 1. 简介 官方介绍:Lottie 是一个库,可以解析使用AE制作的动画(需要用bodymovie导出为json格式),支持web、ios、android、flutter和re…

LeetCode 22. 括号生成【字符串,回溯;动态规划】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

基于Java的线上花店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

OJ题之反转链表

hello ~~~每日一练的分享来了。 今天up主将为大家分享一个 OJ题之反转链表 题目:将链表实现如下的变化 1.思路的讲解:对于原链表我们只需改变指针的指向(箭头)即可 那么问题就来了,我们如何实现此操作?…

Redis设计与实现(2)链表和链表节点

每一个链表节点 typedef struct listNode{//前置节点struct listNode *prev;//后置节点struct listNode *next;//节点值void *value }lisNode; 多个listNode可以通过pre和next指针组成双端链表 虽然只要使用多个listNode结构就可以组成链表,但使用adlist.h/list来…

NLP入门——语言结构/语言建模

一、Linguistics 语言学 wordsmorphology 形态学:词的构成和内部结构研究。如英语的dog、dogs和dog-catcher有相当的关系morpheme 语素:最小的语法单位,是最小的音义结合体lexeme 词位:词的意义的基本抽象单位,是一组…

C语言_字符串和内存函数

文章目录 前言一. strlen二. strcpy三.strcat四. strcmp (字符串比较)五. strncpy六. strncmp七. strstr八. strtok九 . strerror perror十. 字符分类函数十一. memcpy (内存拷贝)十二. memmove(可以重叠拷贝 也可以实现不重叠的内存拷贝) 前…

CentOS7安装部署CDH6.2.1

文章目录 CentOS7安装部署CDH6.2.1一、前言1.简介2.架构3.环境 二、环境准备1.部署服务器2.安装包准备3.修改机器名4.关闭防火墙5.关闭 SELinux6.Hosts文件7.limits文件8.设置swap空间9.关闭透明巨页内存10.免密登录 三、安装CM管理端1.安装第三方依赖包2.安装Oracle的JDK3.安装…