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

如何使用SpringMVC之常用注解

❣️关注专栏:JavaEE
在这里插入图片描述

Spring MVC

  • ⌛️ 1. Spring MVC 创建和连接
    • ⌛️ 1.1 @RequestMapping
    • ⌛️ 1.2 @GetMapping
    • ⌛️ 1.3 @PostMapping
  • ⌛️ 2. 获取参数
    • ⌛️ 2.1 传递/获取单个参数
    • ⌛️ 2.2 传递/获取多个参数
    • ⌛️ 2.3 传递/获取对象
    • ⌛️ 2.4 参数重命名
      • ⌛️ 2.4.1 设置参数必传
    • ⌛️ 2.5 获取 JSON 对象
    • ⌛️ 2.6 从基础URL中获取参数
    • ⌛️ 2.7 获取上传的文件
    • ⌛️ 2.8 获取Cookie
    • ⌛️ 2.9 存储和获取 session
    • ⌛️ 2.10 获取 Header

SpringMVC有三个功能:

  1. 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是当用户访问⼀个地址能够调⽤到我们的Spring 程序。
  2. 获取参数的功能:⽤户访问的时候会传入⼀些参数,在程序中要想办法可以获取到参数。
  3. 输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户。
    接下来我们来探索这 3 个功能,掌握了之后就相当于掌握了SpringMVC!!!😀

⌛️ 1. Spring MVC 创建和连接

实现连接可以有 3 种注解:@RequestMapping 、@GetMapping 和 PostMapping

⌛️ 1.1 @RequestMapping

首先创建一个控制类,实现⽤户到 Spring 程序的互联互通。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@RestController // 相当于把 @Controller 和 @ResponseBody 结合起来。@Controller 是让 spring 框架启动时,加载。@ResponseBody 是返回⾮⻚⾯数据
@RequestMapping("/user") 
public class UserController {@RequestMapping("/say") // 这里可以是一级路由,也可以是 N 级路由public String sayHi(){return "springmvc sayhi";}
}

完成之后,当访问地址: http://localhost:8080/user/say
时就能在浏览器中打印 “springmvc sayhi” 的信息了。
👏 @RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。也就是当用户访问一个 URL 时,将用户的请求对应到某个类的方法上。
👏 @RequestMapping 可修饰类,也可以修饰⽅法。
当修饰类和⽅法时,访问的地址是:localhost:端口号/类/⽅法。比如: http://localhost:8080/user/say
如果直接修饰的是方法,则访问的地址是:localhost:端口号/⽅法,比如: http://localhost:8080/say

👏 @RequestMapping 支持 post 请求 也支持 get 请求。
我们可以在代码中手动指定为 post 请求:

// 当@RequestMapping() 中只有一个参数,不需要加 value,当有指定方法时要加上。
@RequestMapping(value = "/say", method = RequestMethod.POST)  public String sayHi() {return "springmvc sayhi";}

检测是否支持 post 的请求我们使用 postman,结果如下,可以知道该注解支持 post 请求。
在这里插入图片描述

⌛️ 1.2 @GetMapping

使用如下:

@GetMapping("/hi") // @GetMapping 只支持 get 请求,不支持 post 请求public String hi() {return "springmvc hi";}

⌛️ 1.3 @PostMapping

使用如下:

@PostMapping("/sayhello") // 只支持 post 请求,不支持 get 请求public String sayhello() {return "springmvc hello";}

⌛️ 2. 获取参数

⌛️ 2.1 传递/获取单个参数

在 Spring MVC 中可以直接⽤⽅法中的参数来实现传参,

// 这里列举了 3 种参数类型
@RequestMapping("/sayhi1")
public String sayHi(String name) { // 不传递 name 参数,那么此变量使用的是 String 的默认值 nullreturn "hi " + name;}@RequestMapping("/sayhi2")
public String sayhi2(Integer id) { // 不传递参数,使用 Integer(包装类) 的默认值 nullif(id == null) return "参数有误";return "hi " + id;}@RequestMapping("/sayhi3")
public String sayhi3(int id) { // 不传递参数,报错 --> 所以参数传递不要使用基础数据类型,使用包装类return "hi " + id;}

访问第一个地址时,我传入参数 name=zhangsan,结果如下:在这里插入图片描述

⌛️ 2.2 传递/获取多个参数

@RequestMapping("/sayhi11")public String sayHi11(String name, String password) {return "name:" + name + " | password:" + password;}

比如我们传递参数 name=zhangsan,password=123,结果如下:
在这里插入图片描述
那么有人可能会把参数的顺序传错了,那会影响我们的结果吗?答案是不会的,因为当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果。结果如下:
在这里插入图片描述

⌛️ 2.3 传递/获取对象

首先我们新建一个类 Userinfo:

package com.example.demo.entity;
import lombok.Data;
@Data
public class Userinfo {  // 类下面有以下属性private int id;private String name;private String password;private int age;
}

接下来我们来获取对象:

@RequestMapping("/reg")public Object reg(Userinfo userinfo) { // 框架会实现自动的参数映射System.out.println(userinfo); // 拿到的对象只是普通格式的对象return userinfo;}

Spring MVC 可以⾃动实现参数对象的赋值,也就是框架会实现自动的参数映射。运行结果如下:
在这里插入图片描述

⌛️ 2.4 参数重命名

我们可以对后端的参数重命名,也叫作后端参数映射。因为工作中有时候前端和后端的参数命名要求不同,比如前端规定他们的命名为 username,而后端要求的为 name,那么此时我们就需要使用 @RequestParam 来重命名参数。
如果参数不重名的话,结果如下:
在这里插入图片描述
参数重命名就给前面加上注解:

@RequestMapping("/reg2")// 使⽤ @RequestParam 来重命名前后端的参数值。eg:前端传入 username,后端命名为 namepublic Object reg(@RequestParam(value = "username") String name, String password) {return name + ":" + password;}

结果如下:在这里插入图片描述

⌛️ 2.4.1 设置参数必传

如果在上述例子中,我们不给 username 传入参数,那么访问时就会出错,所以当我们的实际业务中前端的参数是⼀个⾮必传的参数,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,具体实现如下:

@RequestMapping("/reg2")public Object reg(String name,@RequestParam(value = "username", required = false)String password) {return name + ":" + password;}

⌛️ 2.5 获取 JSON 对象

 @RequestMapping("/reg3")// @RequestBody --> 接收 JSON 对象,要想拿到 json 格式的,必须加上 @RequestBody 注解public Object reg3(@RequestBody Userinfo userinfo) {System.out.println(userinfo); // 拿到的对象只是普通格式的对象return userinfo;}

⌛️ 2.6 从基础URL中获取参数

从基础的 URL中获取参数(?之前的参数,比如:http://localhost:8080/reg4/sy/123,获取的参数就是 sy 和123), 而不是从 URL的参数部分获取参数(是?之后的,比如http://localhost:8080/reg4?name=sy&password=123)。

 @RequestMapping("/reg4/{name}/{password}")public Object reg4(@PathVariable String name, @PathVariable("password") String password) {return "name=" + name + " | password=" + password;}@RequestMapping("/reg44/{name}/{pwd}")  // 参数名不同public Object reg44(@PathVariable String name,@PathVariable(required = false, name = "pwd") String password) {return "name=" + name + " | password=" + password;}

结果为:
在这里插入图片描述
一般当参数比较少的情况下使用这种传参。

⌛️ 2.7 获取上传的文件

后端代码:

@RequestMapping("/myupload")public Object upload(@RequestPart("dog")MultipartFile file) {String fileName = UUID.randomUUID() +  // 文件名file.getOriginalFilename().substring( // substring 处理的是文件后缀file.getOriginalFilename().lastIndexOf(".")); // . 之前的为文件名File saveFile = new File("D:\\Y\\106\\rrich\\java-ee\\JavaEE_further\\" + fileName); // 这里D:\\Y\\106\\rrich\\java-ee\\JavaEE_further\\是我的文件的保存路径try{file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;}

前端:
在这里插入图片描述
在我的文件中查看,已经有了该图片:在这里插入图片描述

⌛️ 2.8 获取Cookie

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

在这里插入图片描述

⌛️ 2.9 存储和获取 session

存储 session 代码:

  @RequestMapping("/setsess")public void doPostConstruct(HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute(SESSION_KEY,"zhangsan");}

只需要访问 http://localhost:8080/setsess 地址就可以成功存储 session。
获取 session 代码:

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

获取的结果如下:
在这里插入图片描述

⌛️ 2.10 获取 Header

@RequestMapping("/gethd")// @RequestHeader() 里边的 header 是可以改变的public Object getHeader(@RequestHeader("User-Agent")String ua) {return "header -> " + ua;}

结果为:
在这里插入图片描述

相关文章:

如何使用SpringMVC之常用注解

❣️关注专栏:JavaEE Spring MVC ⌛️ 1. Spring MVC 创建和连接⌛️ 1.1 RequestMapping⌛️ 1.2 GetMapping⌛️ 1.3 PostMapping ⌛️ 2. 获取参数⌛️ 2.1 传递/获取单个参数⌛️ 2.2 传递/获取多个参数⌛️ 2.3 传递/获取对象⌛️ 2.4 参数重命名⌛️ 2.4.1 …...

Vue3的axios请求封装,请求拦截,相应拦截

对于三者放在Service.js中封装,方便使用 axios.create 的作用是创建一个新的 axios 实例,该实例可以具有自定义配置。通过使用 axios.create,您可以为任何 API 生成一个客户端,并在使用同一客户端的任何调用中重复使用相同的配置…...

ZC706P试验PL_DDR3内存条的步骤方法

ZC706P 板卡完全兼容XILINX官方的ZC706,当然也支持PL外挂的1G的DDR3内存条,这个片BLOG我提供从官方下载的一个文档和一个项目,演示一下验证DDR3的步骤。 步骤1:准备好板子,安装好软件。 链接:https://pan.baidu.com/s…...

通达信W底形态选股公式,也称双底形态

W底形态,也称双底形态,是一种经典的技术分析形态,代表了跌势的逆转。看起来像字母 "W",描述了一波下跌,反弹,再次下跌到与上一波下跌相同或相近的位置,最后是另一波反弹。W底形态两次…...

java语言与算法、数据结构的用法

Java语言是一种广泛使用的计算机编程语言,也是开发各种软件和操作系统的重要工具之一。除了具有高效性和可移植性之外,Java语言还具有丰富的算法和数据结构支持,可以帮助程序员轻松地解决各种问题。 算法和数据结构是计算机科学中的两个基本…...

中国社科院与美国杜兰大学金融管理硕士项目,引领你走在金融行业前沿

作为金融领域从业人员时刻都在关注行业最新资讯,只有掌握一手的前沿讯息,才能在职场上无往不胜。针对在职的你,如何利用业余时间让自己更增值呢,中国社科院与美国杜兰大学金融管理硕士项目引领你走在金融行业前沿。 金融管理硕士…...

第三十五章 Unity人形动画(下)

本章内容主要就是动画数据的独立文件使用方式。有了独立的动画文件,我们就可以将其应用到其他模型上面了。最简单的方式就是,我们可以给其他模型编辑动画控制器的时候,使用这些动画文件。Unity则给我们提供了更加高级的共享方式,就…...

vue导入导出excel、设置单元格背景色、文字居中、合并单元格、设置列宽(使用xlsx库和xlsx-style库)

xlsx xlsx是由SheetJS开发的一个处理excel文件的npm库 适用于前端开发者实现导入导出excel文件的经典需求 为了区别于xlsx文件,突出其应用语言,该库通常又被称为js-xlsx 导出js数据为Excel文件 需要以下步骤: 安装 xlsx 库 你可以使用 …...

java 线程池

线程池 是 一个 容器,其中管理着多个线程(预先创建并维护一定数量的线程),当有一个任务a需要一个线程去完成时,从容器(线程池)中获取一个线程A去执行任务a,当线程A完成任务a后,线程A…...

音频焦点使用及原理

音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念? 在Android音频领域中,应用层所有的App播放音频,最终都是走到音频回播线程PlaybackThread中,如果多个App都走到同一个PlaybackThread中去&#xff0…...

PyQt5桌面应用开发(8):从QInputDialog转进到函数参数传递

本文目录 PyQt5桌面应用系列How old are you, Dialog?QInputDialog minimalistwhy not lambdaand how partial worksSummary PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件…...

2.0 Vue框架设计的核心要素

本章主要讲解,一个好的框架在构建的时候,需要考虑到的要素,包含报错信息反馈、警告信息反馈、减少打包体积、良好的输出、特性开关(兼容)等 1、提升用户开发体验 提升用户开发体验主要体现在用户使用框架进行开发时&…...

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志,为国民经济提供重要的终端产品支持,相比较大化工产品,精细化工产品需要高度专业技能和工艺,其生产过程需要复杂的化学反应,以及严格的控制条件,产出的…...

用DG备库做的rman备份恢复一个数据库

环境描述: 1.因为主库存储空间不足,于是将备份放在dg备库上做。 2.主库因为磁盘空间问题,数据文件有两个目录。 3.dg备库因为主库两个数据文件目录里面有两个同名数据文件,所有dg备库也有两个数据文件目录。 4.主库与备库与测…...

JAVA中的IO操作有哪些?

在Java编程语言中,输入/输出(IO)操作是很重要的部分,它允许程序从外部系统读取数据,或将数据输出到外部系统。Java提供了一组强大的IO类库,可以让开发人员方便地进行各种IO操作。 Java中的IO操作可以分为两…...

10:00面试,10:04就出来了 ,问的实在是太...

从外包出来,没想到竟然死在了另一家厂子 自从加入这家公司,每天都在加班,钱倒是给的不少,所以我也就忍了。没想到12月一纸通知,所有人都不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个…...

wangzherongyao PMO

感谢【五一节】大家的相遇,总结下。 2023年05月02日,【第一组】组队开黑 我总结了下这天为什么打的那么好,首先赛季初段位在王者附近,大家心态重视程度也高,不轻敌,也不盲目,运营好兵线一步一步…...

Dart语法上

一、Dart介绍及环境 1.1 Dart介绍: Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。 要学…...

SignOff Criteria——POCV(Parametric OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. P O C V A n a l y s i s POCV\ Analysis POCV Analysis3. P O C V F l o w POCV\ Flow POCV Flow4. P O C V R e p o r t POCV\ Report POCV Report 1. O v e r v i e w Overview Overview P r o c e s s v a r i a t i…...

Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )

1.jvm 堆内存(dalvik 堆内存) 不同手机中app进程的 jvm 堆内存是不同的,因厂商在出厂设备时会自定义设置其峰值。比如,在Android Studio 创建模拟器时,会设置jvm heap 默认384m , 如下图所示: 当app 进程中java 层 new 对象(加起来总和)占用…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...