【SSM框架】SpringMVC 中常见的注解和用法

news2024/12/29 10:28:55

SSM框架

  • SpringMVC 中常见的注解和用法
    • 基础注解介绍
      • @RequestMapping 注解介绍
      • @PostMapping 和 @GetMapping 注解介绍
    • 获取参数相关注解的介绍
      • 只通过 @RequestMapping 来获取参数
        • 只传递一个参数
        • 传递对象参数
        • 传递多个参数(非对象)
      • @RequestParam 后端参数重命名
        • required 必传参数的设置
      • @PathVariable 获取URL中的参数
      • @RequestPart 上传文件
      • @CookieValue 简洁的获取 Cookie
      • @RequestHeader 简洁获取 Header
      • @SessionAttribute 简洁获取Session

SpringMVC 中常见的注解和用法

基础注解介绍

@RequestMapping 注解介绍

@RequestMapping 注解是用来注册接口的路由映射。

我们来看一下他的基础使用:

@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
@RequestMapping("/test")
public class TestController {
    //注册接口的路由映射
    @RequestMapping("/hello")
    public String say(){
        return "hello world";
    }
}

此注解可以修饰类和方法。当修饰类的时候访问地址是 类+方法

我的电脑上运行springBoot程序的端口是8080。所以访问地址为:localhost:8080/test/hello

image-20230506215702057

@RequestMapping 直接修饰类:

@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
public class TestController {
    //注册接口的路由映射
    @RequestMapping("/hello")
    public String say(){
        return "hello world";
    }
}

访问地址为:localhost:8080/hello

@RequestMapping 注解是客户端发送Post和Get请求都可以接受(可以用postMan测试一下)。那么我们业务要求只能接收post请求或者只能接收Get请求我们应该如何处理呢?

我们可以显示指定@RequestMapping来接受post:

@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
public class TestController {
    //注册接口的路由映射
    @RequestMapping(value = "/hello",method = RequestMethod.POST)
    public String say(){
        return "hello world";
    }
}

我们要是想让他只能接收Get我们只需要将RequestMethod.POST 改为 RequestMethod.GET就可以了。我们如果需要验证是否只能够接收单一模式的请求我们可以借助postman来发送不同类型的请求。

@PostMapping 和 @GetMapping 注解介绍

前面介绍了RequestMapping 想要接收单一类型的请求用指定显示来完成。当然有专门的注解来完成这个需求

只能接收Get 请求的两种注解写法:

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

@GetMapping("/hello")

只能接收Post 请求的两种注解写法:

@RequestMapping(value = "/hello",method = RequestMethod.POST)

@PostMapping("/hello")

获取参数相关注解的介绍

只通过 @RequestMapping 来获取参数

只传递一个参数

springMVC可以直接用方法中的参数来实现传参:

@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
public class TestController {
    @RequestMapping("/index")
    public String say4(int id){
        return "id = " + id;
    }
}

在网址栏里直接输入:localhost:8080/index?id=123。便可得知已经成功获取参数 。

image-20230506234537095

直接传递基本数据类型的话,如果参数未传或者参数错误直接就会报错:

image-20230506235238089

所以参数最好不要用基本数据类型,传递过来的数据是基本数据类型的话可以用包装类来接收。

@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
public class TestController {
    @RequestMapping("/index")
    public String say(Integer id){
        if (id == null){
            return "参数错误";
        }
        return "id = " + id;
    }
}

用包装类来接收基本数据类型可以在方法内部来处理参数错误的情况:

image-20230506235651190

传递对象参数

SpringMVC可以自动实现参数对象的赋值,比如我创建一个Userinfo对象

import lombok.Data;
@Data
public class UserInfo {
    private int id;
    private String name;
    private String password;
    private int age;
}

传递对象代码实现:

@RequestMapping("/index")
public String method(Integer id){
    if (id == null){
        return "参数错误";
    }
    return "id = " + id;
}

用postman发送请求:

image-20230508195624660

通过返回的结果可知,发送的键值对中键的名称是和对象中的属性名称是一样的,不传递的参数是设置其为默认值。

传递多个参数(非对象)

传递多个参数的代码:

@RequestMapping("/index2")
public Object method(String name,Integer id){
    return "name: " + name + " id:" + id;
}

通过postman来发送请求进行访问:

image-20230508201406187

前后端进⾏参数匹配时,是以参数的名称进⾏匹配的 ,参数的位置不影响后端获取参数的结果

@RequestParam 后端参数重命名

前后端进⾏参数匹配时,是以参数的名称进⾏匹配的。我们在进行前后端交互的时候可能后端人员写完代码了,在某一处参数的名称为name,但是前端人员要求发送的名称是username,后端人员直接修改名字的话就变化太多了,我们可以用@RequestParam注解来实现重命名。

重命名的代码:

@RequestMapping("/index3")
public Object method2(@RequestParam("username") String name,Integer id){
    return "name: " + name + " id:" + id;
}

通过postman来发送请求进行访问:

image-20230508202719314

但是此代码还会有一个问题,不用@RequestParam进行重命名的时候,参数少传递是没有问题的,没有接收到参数的直接赋值为默认值。但是重命名之后参数少传我们会直接报错。

image-20230508203300208

required 必传参数的设置

@RequestParam的必传参数的设置默认为true,我们要想该参数非必传的话就需要修改required

image-20230508205348077

修改required:

    @RequestMapping("/index3")
    public Object method2(@RequestParam(value = "username",required = false) String name,Integer id){
        return "name: " + name + " id:" + id;
    }

修改完成之后参数就可以非必传了。

### @RequestBody 接收JSON对象

后端代码:

@RequestMapping("/index5")
public Object method4(@RequestBody UserInfo userInfo){
    return userInfo;
}

用postman发送请求:

image-20230508215515701

如果没有@RequestBody注解 userInfo中的属性就不会接收到参数

@PathVariable 获取URL中的参数

后端实现代码:

@RequestMapping("/index4/{name}/{password}")
public Object method3(@PathVariable String name,@PathVariable String password){
    return "name:  "+name + "  |password:  " + password;
}

用postman发送请求访问后端:

image-20230508211143745

但是需要注意的就是URL中的顺序变了,后端接收的参数是按着顺序来的.

还要注意的一点就是@PathVariable 的必传参数的设置默认为true,要是想要设置为非必传的话修改为required = false也是没有效果的

@RequestMapping中{}中的单词和参数的名称是对应的,如果{}中的名称password变成了pwd,没必要方法的形参也改名只需要value = “pwd” 重命名就可以了

@RequestMapping("/index4/{name}/{pwd}")
public Object method3(@PathVariable String name,@PathVariable(value = "pwd",required = false) String password){
    return "name:  "+name + "  |password:  " + password;
}

image-20230508214347132

但是如果URL改为http://localhost:8080/index4/zhangsan/123456 如果 {}中写password 参数写pwd不会报错,但是输出结果为null.

image-20230508213731623

如果参数URL少写肯定会报错

@RequestPart 上传文件

后端代码:

@RequestMapping("/myupload")
public Object upload(@RequestPart("myimg") MultipartFile file){
    //文件名称  UUID
    String fileName = UUID.randomUUID()//文件名 用UUID而不是直接命名是为了防止文件覆盖只能保存一个文件
            + file.getOriginalFilename().substring(
            file.getOriginalFilename().indexOf("."));//文件后缀
    //文件保存地址
    File saveFile = new File("D:\\data\\"+fileName);
    try {
        //保存文件
        file.transferTo(saveFile);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

用postman发送请求访问后端:

image-20230508233728430

在目的地址看到了传送的文件:

image-20230508233824805

倘若文件大于springMVC的默认要求大小,我们可以修改 application.properties 配置文件 让其能传送的数据更大:

spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB

@CookieValue 简洁的获取 Cookie

后端代码:

@RequestMapping("/getck")
public Object getCk(@CookieValue(value = "java",required = false) String java){
    return java;
}

如果直接访问localhost:8080/getck页面不会有任何结果,因为当前页面没有Cookie 。我们只需要在页面中按Fn + F12 就加一个Cookie 然后刷新就可以看到cookie的返回值。

image-20230509104559905

@RequestHeader 简洁获取 Header

后端代码:

@RequestMapping("/gethd")
public Object getHeader(@RequestHeader("User-Agent") String ua){
    return "User-Agent : " + ua;
}

前端发送的:

image-20230509121329229

@SessionAttribute 简洁获取Session

我们获取Session之前我们应该先存储相对应的Session:

private static final String SESSION_KEY = "USERINFO_SESSION_KEY";
@RequestMapping("setsess")
public Object doPostConstruct(HttpServletRequest request){
    HttpSession session = request.getSession();
    session.setAttribute(SESSION_KEY,"张三");
    return "存储Session成功";
}

简洁获取Session 的代码:

@RequestMapping("/getsess")
public Object getSession(@SessionAttribute(SESSION_KEY) String name){
    return "session" + name;
}

我们先访问localhost:8080/setsess再访问localhost:8080/getsess就可以查看获取到的session了

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

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

相关文章

SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)

场景 SpringBoot搭建的项目需要对开放的接口进行防刷限制,不同接口指定多少秒内可以请求指定次数。 比如下方限制接口一秒内最多请求一次。 注: 博客:霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主 实现 1、实现思路 首…

flink学习37:DataStream/DataSet与Table的互相转换

DataStream/DataSet转换成视图 DataStream/DataSet转换成表 表转换成DataStream/DataSet 表转换为DataStream/DataSet时,需要指定字段数据类型,最方便的就是把数据类型定为row,即行数据。 两种模式: 把表转为dataStream 把表转为d…

100ASK-V853-PRO编译烧写

100ASK_V853-PRO 环境配置及编译烧写 0.前言 本章主要介绍关于100ASK_V853-PRO开发板的Tina SDK包的下载和编译打包生成镜像,并将镜像烧录到100ASK_V853-PRO开发板上。在进行100ASK_V853-PRO开发板的环境配置前需要获取配置虚拟机系统,可以参考&#x…

【C语言督学训练营 第十二天】三篇文章吃透数据结构中的线性表(三)----- 线性表考研真题

文章目录 前言题目描述题目分析代码实战 前言 本篇博客从头到尾都在解析一道2019年考研真题中的一道关于链表的大题,虽然题目没有竞赛算法题那么复杂,那么难想,但是我们依旧可以从中收获到好多知识,本题的突破点就是快慢指针与链…

AP5153 线性降压恒流驱动芯片 2.5A

AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路, 调节该外接电阻就可以调节 输出电流,输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…

echarts x轴与y轴 刻度 数据设置

xAxis: {nameTextStyle: {fontWeight: "bold",fontSize: "20",align: "left",},splitLine: {show: false,},axisLine: {show: true,symbol: ["none", "arrow"], //加箭头处symbolOffset: 0,lineStyle: {color: "rgb(12…

aardio的优缺点,强烈推荐大家试用一下,可以用它在windows下面写一些小工具

概述 官网 aardio是一种用于Windows平台的脚本编程语言,以及一个功能丰富的集成开发环境(IDE)。它结合了强大的原生Windows API访问能力和简单易学的语法。以下是aardio的一些优缺点。 优点: 简单易学:aardio的语法简…

Linux | 本地Yum源 | 网络Yum源(阿里云Yum源)

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 本地Yum源配置 创建挂载点目录 [rootlocalhost ~]# mkdir /mnt/cdrom [rootlocalhost ~]# df /mnt/cdrom/ 文件系统 1K-块 已用 可用 已用%…

慎入坑:腾讯云轻量2核2G3M服务器30元不建议选择

腾讯云轻量应用服务器2核2G3M带宽30元3个月不建议买,自带3M带宽,下载速度可达384KB/秒,100%CPU性能,系统盘为40GB SSD盘,200GB月流量,折合每天6.6G流量,地域节点可选上海/广州/北京,…

React Router 6 函数式组件withRouter 路由属性配置

withRouter为解决开发过程中函数组件路由参数获取问题,之前版本的withRouter是直接可以导入使用的,现在的需要手写 这里使用了hooks,获取路由、参数等相关信息 需要在函数式组件内使用props,用法: 1.需要先使用高阶组…

K8s常见面试题20问

K8s常见面试题19问 收集了一些K8s常见问题和同学们面试常被问到的问题. 如果有新的面试题私聊或者留言给我 1. Docker和虚拟机有那些不同 虚拟化环境下每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。 容器之间可以共…

MySQL数据库备份并还原

使用Navicat和命令行备份并恢复数据库 第三方工具备份并恢复步骤1步骤2步骤3步骤4:步骤5 命令行方式备份并恢复:步骤1步骤2步骤3步骤4 第三方工具备份并恢复 步骤1 步骤2 在弹出的窗口上选择要备份的路径,单击保存,下图为备份完…

MySQL与Hadoop数据同步方案:Sqoop与Flume的应用探究【上进小菜猪大数据系列】

📬📬我是上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货,欢迎关注。 MySQL与Hadoop数据同步 随着大数据技术的发展,越来越多的企业开始采用分布式系统和云计算技术来处理和存储海量数…

物理机CentOS7.9 安装后无网卡避坑(一) 找不到网卡

1、查看物理网卡 lspci | grep -i ethernet 2、下载网卡驱动 网卡驱动链接 Index of /elrepo/elrepo/el7/x86_64/RPMS (usf.edu) 选择对应版本的驱动 3、使用U盘将下载好的网卡驱动放到新装的机器,任意目录。 4、检查软件安装情况: rpm -qa | gre…

【rust】| 03——语法基础 | 数据类型

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础_变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 文章目录 前言数据类型1.…

浅析S32K324的时钟树

S32K3XX系列的时钟树梳理 如下图为S32K3XX系列的时钟树图: 一、时钟源 时钟源说明FIRC快速内部RC时钟源SIRC慢速内部RC时钟源FXOSC快速外部晶振时钟源SXOSC慢速外部晶振时钟源 S32K3系列的mcu有4个时钟源如上表。 二、FIRC(快速内部RC时钟源&#…

excel中英文互译

在excel运行宏时弹出下面的提示: 无法运行“XXXXX”宏。可能是因为该宏在此工作薄中不可用,或者所有的宏都被禁用的错误提示 解决办法: 1、点击“文件”选项卡; 2、在选项卡界面窗口中选择“选项”按钮; 3、在“选项…

[效率工具] [VS Code] 一文玩转VSCode下的Markdown笔记

简介 Markdown 常用工具 : 各种云笔记优点:云备份,多设备同步,缺点是敏感字,图床不可外链等等。 本地常用IDE又sublime,Typora等等。这样造成本地会安装很多ide。像Typora后期也收费等等。所见所得等等问题&#xff0…

Nacos配置管理、配置热更新、配置共享和搭建nacos集群

目录 1.Nacos配置管理 1.1.统一配置管理 1.1.1.在nacos中添加配置文件 1.1.2.从微服务拉取配置 1.2.配置热更新 1.2.1.方式一 1.2.2.方式二 1.3.配置共享 1)添加一个环境共享配置 2)在user-service中读取共享配置 3)运行两个UserAp…

面向对象【类的实例化与对象内存解析】

文章目录 类的概念对象的概念面向对象的三步骤对象的内存解析JVM 内存结构划分对象内存分析 类的概念 具有相同特征的事物的抽象描述,是抽象的、概念上的定义。 对象的概念 实际存在的该类事物的每个个体,是具体的,因而也称为实例。 面向…