SpringMVC 程序开发
✏️作者:银河罐头
📋系列专栏:JavaEE
🌲“种一棵树最好的时间是十年前,其次是现在”
目录
- 什么是 Spring MVC
- MVC 定义
- 怎么学 Spring MVC
- Spring MVC 创建和连接
- 创建 Spring MVC 项目
- @RequestMapping 注解介绍
- @PostMapping
- 获取参数
- 获取单个参数
- 获取多个参数
- 传递对象
- 后端参数重命名
- @RequestBody 接收JSON对象
- 获取URL中参数@PathVariable
- 上传文件@RequestPart
- 获取Cookie/Session/header
- 返回数据
什么是 Spring MVC
SSM = Spring Boot + Spring Web(Spring MVC) + MyBatis
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc), 但它通常被称为"Spring MVC".
- Spring MVC 是⼀个 Web 框架。
- Spring MVC 是基于 Servlet API 构建的。
MVC 定义
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。

怎么学 Spring MVC
学习 Spring MVC 我们只需要掌握以下 3 个功能:
1.连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的 Spring 程序
2.获取参数的功能:⽤户访问的时候会带⼀些参数,在程序中要想办法获取到参数。
3.输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户。
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。
Spring MVC 创建和连接
创建 Spring MVC 项目
2018年之前,使用 maven 项目添加 Spring MVC 框架的方式来创建,太复杂。
2018年之后 ,使用 Spring Boot 来创建 Spring MVC 项目。
@RestController
public class UserController {@RequestMapping("/say")//可以是 1 级路由,也可以是 n 级路由public String sayHi(){return "hi spring mvc";}
}

实现用户到 spring 程序的连接。
@RequestMapping 注解介绍
它支持 GET 请求

那它是否支持 post 请求?
用 postman 测试:

得出结论:它也支持 POST 请求.

GET, HEAD, POST,PUT, PATCH, DELETE, OPTIONS, TRACE 都支持。
在浏览器地址栏输入地址,默认是 GET 请求。
- 如果我想设置成只支持其中某一种请求类型,如何实现?
@RestController
public class UserController {@RequestMapping(value = "/sayhi",method = RequestMethod.POST)public String sayHi(){return "hi spring mvc";}
}

设置成只支持 POST 请求,再发 GET 请求就失败了。
@PostMapping
除了通过 @RequestMapping 来设置 POST,还可以通过@PostMapping 来设置。
@PostMapping("/sayhello")
public String sayHello(){return "hello spring mvc";
}

小结:
2种实现路由连接的方式 :@RequestMapping 和 @PostMapping
@GetMapping("/hi")
public String hi(){return "spring mvc hi";
}
获取参数
获取单个参数
@RequestMapping("/sayhi")
public String sayHi(String name){return "hi " + name;
}

这里地址栏里 key 必须写"name", 才能成功拿到 value


如果传了错误的 key 或者不传参数 ,结果就是String 的默认值 null
@RequestMapping("/sayhi2")
public String sayHi2(Integer id){return "hi " + id;
}

@RequestMapping("/sayhi3")
public String sayHi3(int id){return "hi " + id;
}

参数传递不要使用基本数据类型(如 int)。
@RequestMapping("/sayhi4")
public String sayHi4(HttpServletRequest request, HttpServletResponse response){return "hi " + request.getParameter("name");
}

@RequestMapping("/sayhi4")
public String sayHi4(HttpServletRequest request, HttpServletResponse response) throws IOException {response.sendRedirect("https://www.sogou.com");
}
还可以实现重定向跳转页面。
获取多个参数
@RequestMapping("/sayhi")
public String sayHi(String name, String password){return "name = " + name + " | password = " + password;
}

参数顺序不重要,保证 key 正确就行。
传递对象
@Data
public class Userinfo {private int id;private String name;private String password;private int age;
}
//获取对象
@RequestMapping("/reg")
public Object reg(Userinfo userinfo){return userinfo;
}

@RequestMapping("/h1")
public Object getH1(){return "<h1>我是 h1</h1>";
}

后端参数重命名
某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致, 比如前端传递一个 username 给后端,后端用 name 接收,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用@RequestParam 来重命名前后端的参数值。
@RequestMapping("/reg2")
public Object reg(@RequestParam("username") String name, String password){return "name = " + name + " | password = " + password;
}

如果前端传的是 name, 会怎样?


规定 前端必须传 “username”.
@RequestMapping("/reg2")
public Object reg(@RequestParam(value = "username",required = false) String name, String password){return "name = " + name + " | password = " + password;
}
required = false 设置之后

前端:对象/JSON 对象字符串
后端:对象/JSON 对象字符串
@RequestBody 接收JSON对象
用之前接收对象的方式,不能成功接收到 JSON 对象。
@RequestMapping("/reg")
public Object reg(Userinfo userinfo){System.out.println(userinfo);return userinfo;
}
用 postman 发送一个 post 请求。

用 @RequestBody 这个注解就可以成功接收到 JSON 对象了。
@RequestMapping("/reg3")
public Object reg3(@RequestBody Userinfo userinfo){return userinfo;
}

获取URL中参数@PathVariable
/user?uid=12345
/user/12345 优点:搜索引擎抓取关键字权重更高,更简洁
@RequestMapping("/reg4/{name}/{password}")
public Object reg4(@PathVariable String name, @PathVariable String password){return "name = " + name + " | password = " + password;
}

如果把路径里的 password 改成 pwd,会怎样?



这个参数是必须的。所以会报错。
@RequestMapping("/reg4/{name}/{pwd}")
public Object reg4(@PathVariable String name, @PathVariable(required = false) String password){return "name = " + name + " | password = " + password;
}

加 required = false 之后就不会报错,但是 还是得不到 password 的值。
小结:
@PathVariable: 基础 url 里面的参数(? 之前的参数)
@RequestParam: url 参数部分的参数(? 之后的参数)
@RequestMapping("/reg4/{name}/{pwd}")
public Object reg4(@PathVariable String name, @PathVariable(required = false,name = "pwd") String password){return "name = " + name + " | password = " + password;
}

上传文件@RequestPart
@RequestMapping("/myupload")
public Object upload(@RequestPart("myimg")MultipartFile file){File saveFile = new File("D:\\Data\\myimg.png");try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;
}
用 postman 发送 post 请求:


文件上传成功。
默认要求上传单个文件大小不超过 1MB.
Common Application Properties (spring.io)

如果我要上传的文件很大怎么办?

可以设置上传文件大小。
有一个问题,后面上传的文件会把之前的文件覆盖。
MySQL -> InnoDB(5.5) -> B+存储 -> 聚簇索引树
叶子(数据页) 主键(如果有) + 数据
- 如何保证每次上传的文件不会覆盖?也就是最终保存的是不同的文件名。
UUID。

//上传文件
@RequestMapping("/myupload")
public Object upload(@RequestPart("myimg")MultipartFile file){String fileName = UUID.randomUUID() + //文件名file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//后缀名File saveFile = new File("D:\\Data\\" + fileName);try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;
}

成功上传,没有覆盖原有的。
获取Cookie/Session/header
//获取 cookie
@RequestMapping("/getCookie")
public Object getCookie(@CookieValue(value = "java",required = false) String java){return "java = " + java;
}

我们可以手动构造一个 cookie。

- 获取 Header
//获取 header
@RequestMapping("/header")
public Object getHeader(@RequestHeader("user-agent") String userAgent){return "userAgent = " + userAgent;
}

- 获取 Session
private static final String SESSION_KEY = "USERINFO_SESSION_KEY";
//存储 session
@RequestMapping("/setSession")
public void setSession(HttpServletRequest request){HttpSession session = request.getSession();//没有就创建,默认是 truesession.setAttribute(SESSION_KEY,"zhangsan");
}
//获取 session
@RequestMapping("/session")
public Object getSession(@SessionAttribute(SESSION_KEY) String name){return "session = " + name;
}

返回数据
1)返回静态页面
@Controller
@RequestMapping("/test")
public class TestController {@RequestMapping("/getIndex")public Object getIndex(){return "index.html";}
}


确认 target 下有 index.html.
那是什么原因?

加了"/"之后就能访问成功了。

加了"/“表示是 从根目录去找"index.html”, 不加"/"是在 test 目录下去找 "index.html"就找不到.


2)请求转发或请求重定向
1.请求转发
//请求转发
@RequestMapping("/forward")
public String forward(){return "forward:/index.html";//return "/index.html"; 默认就是请求转发
}

2.请求重定向
//请求重定向
@RequestMapping("/redirect")
public String redirect(){return "redirect:/index.html";
}

@RequestMapping("/redirect2")
public void redirect2(HttpServletResponse response) throws IOException {response.sendRedirect("https://www.baidu.com");
}
forward 和 redirect 具体区别如下:
- 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
- 请求重定向地址发生变化,请求转发地址不发⽣变化。
- 请求重定向,不存在原来的外部资源不能访问;请求转发服务器端转发 有可能造成原外部资源不能访问。
举例:
请求转发:张三找李四借钱,李四自己也没钱,李四又去找王五借,最终张三只借了一次钱,剩下的事都是 李四干的。
请求重定向:张三找李四借钱,李四自己也没钱,李四告诉张三说自己没钱让张三去找王五借钱。然后张三又去找王五借到了钱。
请求转发和请求重定向有什么区别? | Javaᶜⁿ 面试突击 (javacn.site)
相关文章:
SpringMVC 程序开发
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录 什么是 Spring MVCMVC 定义 怎么学 Spring MVCSpring MVC 创建和连接创建 Spring MVC 项目RequestMapping 注解介绍PostMappi…...
使用单片机遇到的几个问题及解决方案1
1.为什么我跟着视频学习的过程中,我没有找到“端口"的选项呢?我甚至没有出现“其他插口”。 想要找到设备管理器最快的方法就是: 首先如果把输入法调为大写形式,然后按下“WINX”,再按“M”就会出现一个设备管理…...
vue项目中el-upload 组件添加token的方法
在使用el-upload的时候,上传文件到服务器,有时候后台要求上传token,怎么处理呢?以下是一个示例。 效果图 template中片段 <el-dialog :modal-append-to-body"false" title"上传文件" :visible.sync"…...
独立按键检测短按、长按,松手后响应操作
背景 有项目使用独立按键检测,短按、长按。根据使用效果,发现松手后,也就是按键弹起后响应操作比较好操作。 记得之前,博主写过一篇关于按键的检测的文章,但是过于复杂了。可能很难懂,这里就简单一点&…...
BurpSuite2023测试越权漏洞
BurpSuite2023测试越权漏洞 BurpSuite安装创建项目 - 打开内置浏览器越权漏洞测试问题处理 BurpSuite安装 官网下载社区版并安装,下载地址:链接: https://portswigger.net/burp 安装成功后图标 创建项目 - 打开内置浏览器 打开BurpSuite,…...
申请国家标准项目管理专业人员能力评级(CSPM)报名条件有哪些?
2021年10月,中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系,开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会(CAS)组织开展的项…...
代码随想录算法训练营第五十二天|300.最长递增子序列|674. 最长连续递增序列|718. 最长重复子数组
LeetCode300.最长递增子序列 动态规划五部曲: 1,dp[i]的定义:本题中,正确定义dp数组的含义十分重要。dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。为什么一定表示 “以nums[i]结尾的最长递增子序” ,…...
完全卸载mysql教程
引言 很多人因为第一次安装mysql导致安装错误,或者安装的数据库版本太高,比如mysql8.0版本,出现了很多问题,导致数据库无法使用,或者一些图形界面无法操作,想要卸载,重装稳定的mysql数据库&…...
4G开发板-安卓手机开发套件-MTK主板开发板定制
开发板是一种用于嵌入式系统开发的电路板,它包含了各种硬件组件,如中央处理器、存储器、输入设备、输出设备、数据通路/总线以及外部资源接口等。为了满足特定的开发需求,嵌入式系统开发者通常会根据项目要求来定制开发板,当然用户…...
人工智能十大新星揭晓,华人学者占90%
人工智能领域著名杂志 IEEE Intelligent Systems发布了 2022 年度“人工智能十大新星”(AIs 10 to Watch)名单 ,其中有九位都是华人研究者。知识人网小编推荐给大家。 近日,人工智能领域著名杂志 IEEE Intelligent Systems公布了 …...
ROS学习——通信机制(话题通信①—发布方实现)
2.1 话题通信 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 040话题通信(C)1_发布方框架_Chapter2-ROS通信机制_哔哩哔哩_bilibili 一、ROS 中的基本通信机制主要有如下三种实现策略 话题通信(发布订阅模式服务通信(请求响应模式)参数服务器(参数共享模式) 二、…...
【运筹优化】最短路算法之SPFA算法 + Java代码实现
文章目录 一、SPFA算法简介二、SPFA算法思想三、Java代码实现四、测试 一、SPFA算法简介 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同…...
linuxOPS基础_linux权限管理
权限概述 什么是权限 在多用户计算机系统的管理中,权限是指某个特定的用户具有特定的系统资源使用权利。 在Linux 中分别有读、写、执行权限 \权限针对文件权限针对目录读r(read)表示可以查看文件内容;cat、less…表示可以(ls)查看目录中存在的文…...
linux安装homeassistant(智能设备远程控制开源框架)
1、安装docker 先切换到root 用户,先安装一些基本环境: yum install -y yum-utils device-mapper-persistent-data lvm2添加阿里云软件源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo然后安装 D…...
TensorRT Triton Inference Server: 版本 error魔术标记不匹配 , NGC使用
魔术标记不匹配错误Serialization assertion magicTagRead kMAGIC_TAG failed.Magic tag does not match 原因: 转换和推理使用的镜像的标签是相同的,但是转换的镜像中pip list得到trt版本为8.6.0,但是推理环境中 rootf2c810ba3976:/# /usr/…...
Elasticsearch 文本分析器(下)
字符过滤器 注意:字符过滤器用于在将字符流传递给分词器之前对其进行预处理 html_strip HTML元素替换过滤器 此过滤器会替换掉HTML标签,且会转换HTML实体 如:& 会被替换为 &。 {"tokenizer": "keyword","…...
Git操作方法
目录 Git是什么 Git特点 Git作用 Git原理 集中式 分布式 Git安装 修改语言 Git操作 1.初始化Git仓库 2.提交工作区的内容到版本库 3.查看版本记录 4.版本回退 5.版本前进 Git 命令 通用操作 工作状态 版本回退 版本前进 远程仓 1.GitHub 2.GitLab 3.码云…...
CorelDRAW矢量绘图2023中文版下载
市面上的矢量绘图工具虽然很多,但权威又专业的却不多,选到不好用的工具,会极大的影响自己创作,CorelDRAW简称cdr,是一款功能强大的矢量图制作软件,一说到矢量图制作,大家都会不由自主地想到cdr。…...
Java-API简析_java.lang.Float类(基于 Latest JDK)(浅析源码)
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131129886 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…...
pycharm的基本使用
废话文学 本人记录笔记始终遵循“能动手绝不动脑,能动脑绝不动手”的基本原则。不会的操作,跟着笔记干就完事了,还动啥脑袋?留着脑细胞刷抖音擦边小姐姐他不香吗? 什么是IDE IDE即【集成开发环境】,Inte…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
