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…...
为什么要使用微软的 Application Framework?
我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下我们为什么要使用微软的 Application Framework? 虽然Application Framework 并不是新观念,它们却在最近数年才成为 PC 平台上软件开发的主流工具。面向对象语言是具体实…...
Python爬虫基础知识点
Python爬虫是使用Python编写的程序,可以自动抓取互联网上的数据。常用的Python爬虫框架包括Scrapy、BeautifulSoup、Requests等。Python爬虫可以应用于众多场合,如大数据分析、信息监测、数据挖掘和机器学习等领域。那么新手应该如何学习python爬虫呢&am…...
K8s运维备忘
1.服务器集群搭建: VagrantFile中加入以下代码,创建3个虚拟机: Vagrant.configure("2") do |config| (1..3).each do |i| config.vm.define "k8s-node#{i}" do |node| # 设置虚拟机的Box …...
激光雷达+rtk+rgb联合使用(4)
因为一直在忙一些乱七八糟的事情,就没顾得上继续写,想着快速收尾算了。 前面写到,我在点云的匹配上花了大量的时间,不断的调参数,换方法,一共几百个点云,想着先每50个匹配一次,得到几…...
【K8S系列】快速初始化⼀个最⼩集群
序言 走得最慢的人,只要不丧失目标,也比漫无目的地徘徊的人走得快。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级重要蓝色:用来标记二级重要 希望这篇文章能让你不仅有…...
Exploit/CVE-2010-0738
打开JBoss的潘多拉魔盒:JBoss高危漏洞分析 *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。 前言 JBoss是一个基于J2EE的开放源代码应用服务器࿰…...
Go单元测试及框架使用
Go自带测试框架 单元测试 建议Go 语言推荐测试文件和源代码文件放在一块,测试文件以 _test.go 结尾。函数名必须以 Test 开头,后面一般跟待测试的函数名参数为 t *testing.T 简单测试用例定义如下: func TestXXXX(t *testing.T) {// ...}…...
TreeMap类型实体类数据进行排序
实体类Student类代码如下所示: package com.test.Test11;public class Student implements Comparable<Student>{private int age;private String name;private Double height;public int getAge() {return age;}public void setAge(int age) {this.age age…...
HOOPS助力AVEVA数字化转型:支持多种3D模型格式转换!
行业: 电力和公用事业、化工、造船、能源、采矿业 挑战: 创建大规模复杂资产的客户需要汇集多种类型的数据,以支持初始设计和创建强大的数字双胞胎;现有版本的产品只支持半打CAD格式;有限的内部开发资源限制了增加对新…...
(转载)基于遗传模拟退火的聚类算法(matlab实现)
1 理论基础 1.1 模糊聚类分析 模糊聚类是目前知识发现以及模式识别等诸多领域中的重要研究分支之一。随着研究范围的拓展,不管是科学研究还是实际应用,都对聚类的结果从多方面提出了更高的要求。模糊C-均值聚类(FCM)是目前比较流行的一种聚类方法。该…...
java网站开发用哪种/联赛积分榜排名
RDBMS 12.2.0.1 - - 创建物化视图 CREATE MATERIALIZED VIEW mv_d1 BUILD IMMEDIATE REFRESH FAST WITH rowid ON DEMAND ENABLE QUERY REWRITE AS SELECT * FROM d1 ; --创建刷新日志(为配合增量刷新,ORACLE要求要在主表上建立物化视…...
北京大学两学一做网站/今日时事新闻
CSS 中的 transform,transition 和 animation 是分开的三部分内容,其中 transfrom 主要是控制元素变形,并没有一个时间控制的概念,而 transition 和 animation 才是动画的部分,它们可以控制在一个时间段里,…...
长春企业做网站/怎么下载需要会员的网站视频
常用功能命令1.导出整个数据库 1mysqldump -u 用户名 -p –default-character-setlatin1 数据库名 > 导出的文件名(数据库默认编码是latin1) 23mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导出一个表 1mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名…...
做网站必须有框架是吗/seo外包公司兴田德润
录🦌🕐什么是字符串🕑基础知识🕔拼接字符串🕖字符串索引🕘字符串切片(重)🕚printf风格的字符串格式化🕛字符串常见的方法🕐什么是字符串 字符串是由 Unicode 码位构成的…...
怎么使网站降权/免费顶级域名申请网站
使用管道命令执行带密码执行sudo命令,在java中老是不成功今天找到方法解决了顺便整理了一下java Runtime.getRuntime().exec 调用脚本命令的注意事项。 使用管道命令执行带密码执行sudo命令 String cmds“echo password | sudo -S /usr/bin/pdf2htmlEX -h ”&…...
哪个网站可以自己做行程/百度推广费用多少钱
简介 有时候我们可能会需要限定路由访问次数这样的需求。 在laravel中又一个内置中间件可以帮我们实现这个需求 # throttle:3,1 第一个参数,3>1分钟内只能访问三次,第二个参数,1>设定为1分钟 Route::get(test,TestControllerindex)…...