【Spring Boot】SpringMVC入门
1.什么是springMVC
MVC就是把一个项目分成了三部分:

MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变:

当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页面的开发,所以也就没有view层。所以view又有了一层解释:之前返回的是视图,现在返回的是视图所需要的数据。SpringWebMVC是⼀个Web框架
2. springMVC请求
2.1@RequestMapping 路由映射
可以修饰类也可以修饰方法,访问路径是:类路径+方法路径
@RestController
@RequestMapping("/say/springboot")
public class HelloController {@RequestMapping("/hi")public String sayHi(){return "springboot,hi";}
}
RequestMapping 支持get,post等请求,访问路径可以写多层,注意:/可以省略,建议企业开发的时候统一加上,前加后不加。
也可以指定请求传参:
@RequestMapping(value = "/hello",method = RequestMethod.POST)//只支持POST请求
public String sayHello(){return "springboot,hello";
}
@RequestMapping(value = "/hello",method = RequestMethod.GET)//只支持GET请求
public String sayHello(){return "springboot,hello";
}
2.2 传递单个参数
@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m1")public String m1(Integer num){return "接收到的参数num: " + num;}
}
开发中,建议加上类路径
- 避免重复
- 方便查找代码
发送的请求:http://localhost:8080/param/m1?num=10
发送请求的参数需要名称一样。底层逻辑:从请求的参数中,获取参数名为num的值,并给num赋值
需要注意的是,建议不要使用基本数据类型,要使用包装类,如果使用基本数据类型参数不传递就会报错:
@RequestMapping("/m2")
public String m2(int num){return "接收到的参数num: " + num;
}
使用包装类就是获取的数值为null,不会报错。开开发的时候建议使用包装类
2.3 传递多个参数
@RequestMapping("/m3")
public String m3(String username,String password){return "接收到的参数username: " + username + " password: " + password;
}
发送的请求:http://localhost:8080/param/m3?username=“张三”&password=“123456”
参数的顺序可以调换。
2.4 后端参数重命名
使用@RequestMapping注解来进行重命名。如果进行了重命名,就必须要使用@RequestParam注解里的名字
@RequestMapping("/m4")
public String m4(@RequestParam("name") String username, String password){return "接收到的参数username: " + username + " password: " + password;
}
发送的请求:http://localhost:8080/param/m4?name=“张三”&password=“123456”
使用@RequestMapping注解后默认是比传参数,可以改为非必传参数:
@RequestMapping("/m4")
public String m4(@RequestParam(value = "name",required = false) String username, String password){return "接收到的参数username: " + username + " password: " + password;
}
2.5 传递对象
创建一个User对象:
@Data
public class User {Integer id;String username;String password;
}
参数设置为对象:
@RequestMapping("/m5")
public String m5(User user){return "接收到的user参数:" + user.toString();
}
开发中,接口的参数通常定义为对象。需要注意的是,基本数据类型比如int,不传递参数的时候,不会报错会赋初始值,int类型则为0。
2.6 传递数组
@RequestMapping("/m6")
public String m6(String[] paramArray){return "接收到的paramArray参数:" + Arrays.toString(paramArray);
}
参数传递数组的方式:
http://localhost:8080/param/m6?paramArray=zhangsan,lisi,wangwu,zhaoliu
http://localhost:8080/param/m6?paramArray=zhangsan¶mArray=lisi¶mArray=wangwu¶mArray=zhaoliu
2.7 传递集合
传递集合需要使用@RequestParam注解,说明以集合的方式来接收。这个注解也可以进行参数重命名
@RequestMapping("/m7")
public String m7(@RequestParam List<String> paramList){return "接收到的paramList参数:" + paramList;
}
参数传递的方式和数组一样:
http://localhost:8080/param/m7?paramList=zhangsan,lisi,wangwu,zhaoliu
2.8 传递JSON
springmvc中使用@RequestBody注解,来使Json转化为对象,就算Json数据中只有一个键值对,也是转化成对象,后面添加进行修改的时候,可以对后端的对象进行添加字段,符合了开闭原则。
可以使用postman来进行发送数据

传递JSON使用对象来接收:
@RequestMapping("/m8")
public String m8(@RequestBody User user){return "传递的Json数据:" + user;
}
传递JSON使用Map来接收:
@RequestMapping("/m8")
public String m8(@RequestBody Map<String,String> map){return "传递的Json数据:" + map;
}
2.9 获取URL中的参数
如果URL是:http://localhost:8080/param/m9/10。我们用之前的方法就没有办法获取参数10 。
要想解决上面的问题,我们得用@PathVariable注解:
@RequestMapping("/m9/{userId}")
public String m9(@PathVariable String userId){return "URL参数:userid:" + userId;
}
可以传递多个参数,但是注意顺序和个数必须和后端是对应的。请求格式必须和后端定义的URL格式匹配。
http://localhost:8080/param/m9/10/zhangsan
@RequestMapping("/m9/{userId}/{username}")
public String m9(@PathVariable String userId, @PathVariable String username){return "URL参数:userid:" + userId + " username:" + username;
}
还可以对参数重命名:
@RequestMapping("/m9/{userId}/{name}")
public String m9(@PathVariable String userId, @PathVariable("name") String username){return "URL参数:userid:" + userId + " username:" + username;
}
2.10 上传文件
用postman发送文件

上传文件后端使用的是@RequestPart注解
@RequestMapping("/m10")
public String m10(@RequestPart MultipartFile file){System.out.println(file.getOriginalFilename());return "success";
}
2.11 获取cookie/session
网页模拟发送cookie

springMVC获取cookie,我们有传统的servlet方式,这种方式可以获取全部cookie。
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest req){Cookie[] cookies = req.getCookies();if (cookies != null){Arrays.stream(cookies).forEach(cookie -> {System.out.println(cookie.getName() + " : " + cookie.getValue());});}return "获取cookies成功";
}
使用注解的方式获取,只能获取指定的cookie.
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue(value = "name",required = false) String name){return "name : " + name;
}
springMVC获取session也有传统放入获取方式和注解的获取方式。但是在获取session之前先存储session
@RequestMapping("/setSession")
public String setSession(HttpServletRequest req){HttpSession session = req.getSession();session.setAttribute("username","zhangsan");return "成功存储session" ;
}
用传统的方式去获取session:
@RequestMapping("/getSession")
public String getSession(HttpServletRequest req){HttpSession session = req.getSession(false);if (session != null){String username = (String) session.getAttribute("username");return "登录用户的名称:" + username;}return "未获取session" ;
}
使用注解获取session
@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute String username){return "username: " + username ;
}
参数直接设施为:HttpSession。
@RequestMapping("/getSession3")
public String getSession3(HttpSession session){//等价于:HttpSession session = req.getSession(true);return "username: " + session.getAttribute("username");
}
2.12 获取Header
我们以获取Header中的User-Agent字段为例:
使用传统方式:
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){return "User-Agent: " + request.getHeader("User-Agent");
}
使用注解:
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){return "User-Agent: " + userAgent;
}
3. spring MVC 响应
3.1 返回静态页面
编写一个index.html页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>Spring MVC 返回的静态页面</h1>
</body>
</html>
用@Controller注解而不是用@RestController注解,是因为@Controller返回的就是试图,随着前后端分离,后端不处理页面,就返回页面所需要的数据使用@ResponseBody。@RestController注解 = @ResponseBody + @Controller
@Controller
public class ReturnController {@RequestMapping("/returnIndex")public String returnIndex(){return "/index.html";}
}
3.2 返回数据
返回数据使用的注解是:@ResponseBody。
可以修饰类,也可以修饰方法
- 修饰类的时候,表示这个类下的所有方法,返回的均为数据
- 修饰方法时,表示该方法返回的是数据
- 如果一个类中的所以方法返回的都是数据,我们就把这个注解加在类上
@ResponseBody
@RequestMapping("/returnData")
public String returnData(){return "返回视图所需要的数据";
}
3.3 返回HTML代码片段
返回HTML片段使用@ResponseBody注解就行了,会自动解析成HTML片段,如果想要返回正常的字符串,就需要给字符串中关于HTML标签部分加转义字符。
@ResponseBody
@RequestMapping("/returnHtml")
public String returnHtml(){return "<h1>返回的html片段</h1>";
}
3.4 返回JSON
使用@ResponseBody注解,返回的时候直接返回对象或者Map数据类型返回的就是Json数据格式。
@ResponseBody
@RequestMapping("/returnJson")
public User returnJson(){User user = new User();user.setId(1);user.setUsername("zhangsan");user.setPassword("123456");return user;
}
使用Map数据类型:
@ResponseBody
@RequestMapping("/returnMap")
public Map<String,String> returnMap(){Map<String,String> map = new HashMap<>();map.put("id","1");map.put("name","lisi");map.put("gender","男");return map;
}
3.5 设置状态码
设置状态码,不影响数据展示。
@ResponseBody
@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response){response.setStatus(401);return "设置状态码成功";
}
3.6 设置Header(了解)
使用注解中的produces设置Content-Type字段。
produces:设置返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
@ResponseBody
//使用注解中的produces设置Content-Type字段
@RequestMapping(value = "/setHeader",produces = "application/json;charset=utf-8")
public String setHeader(HttpServletResponse response){response.setHeader("test111","test111");//设施header其他字段return "{'ok':1}";
}
相关文章:
【Spring Boot】SpringMVC入门
1.什么是springMVC MVC就是把一个项目分成了三部分: MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变: 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页…...
itextpdf 之 html 转 pdf 问题处理
1. Font Provider contains zero fonts. At least one font shall be present 此问题出现的原因是 字体设置不成功,解决方法就是排查设置字体的代码。 需要特别注意的是项目打包后项目中所有文件层次会出现变动,使用何种方式获取字体文件会直接影响到字…...
关于tex中的表格设置
文章目录 控制表格列宽和行高控制表格列宽的同时实现居中tex中多表格排列单元格的合并与分割对单个单元格进行操作 控制表格列宽和行高 将下面的代码放在table环境内,放在tabular环境外 调整表格宽度和高度: \resizebox{\textwidth}{2cm}{%第一个{}是表…...
huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件
文章目录 一、找到需要下载的huggingface文件二、准备工作(一)安装git-lfs(二) 配置git ssh 三、检查ssh连接huggingface是否成功 一、找到需要下载的huggingface文件 huggingface官网链接:https://huggingface.co/ 以…...
使用C++读取SQL Server数据库中的数据并转换为UNICODE类型
要使用C读取SQL Server数据库中的数据并转换为UNICODE类型,可以使用ODBC库和UNICODE编码函数。 首先,确保已安装SQL Server的ODBC驱动程序,并在项目中包含ODBC头文件<sql.h>和<sqlext.h>。 接下来,可以按照以下步骤进…...
WPF应用程序生存期以及相关事件
WPF 应用程序的生存期会通过 Application 引发的几个事件来加以标记,相关事件对应着应用程序何时启动、激活、停用和关闭。 应用程序生存期事件 • 独立应用程序(传统风格的 Windows 应用程序,这些应用程序作为要安装到客户端计算机并从客户端计算机运…...
【Git】任何位置查看git日志
需求 现需要查看指定项目中的某个文件的 Git 日志。如有 项目代码 jflowable ,需要查看其下文件 D:\z_workspace\jflowable\src\main\java\com\xzbd\jflowable\controller\TestController.java 的日志。 分析 一般的思路是,进入 jflowable 项目&#…...
Socket通讯使用的坑-消息合并发送-解决方法
关联文章 Socket通讯使用的坑-消息合并发送-CSDN博客 解决方法 /// <summary> /// 公共方法 /// </summary> public static class CommonMethods {/// <summary>/// 多个JSON对象字符串转成JSON字符串列表/// </summary>/// <param name"j…...
【Linux】基本指令
Hello everbody!这次咱们紧接着上一篇文章,继续介绍Linux操作系统的一些基本指令。这些指令是入门级别的,比较基础的。相当于windows中文件的复制,重命名,创建文件,创建目录之类的,还有如何在Linux中写c语言…...
JS中数组的相关方法介绍
push() 将一个或多个元素添加到数组的末尾,并返回新的长度。 let arr [1, 2, 3]; arr.push(4); // arr 现在是 [1, 2, 3, 4] pop() 删除并返回数组的最后一个元素 let arr [1, 2, 3, 4]; let last arr.pop(); // last 现在是 4,arr 现在是 [1, …...
mybtis动态SQL注解 脚本动态SQL\方法中构建SQL\SQL语句构造器
mybtis动态SQL注解 动态SQL注解脚本动态SQL方法中构建SQLSQL语句构造器 动态SQL注解 分类: 脚本动态SQL:XML配置方式的动态SQL,是用<script>的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置方法中构建SQL&…...
TikTok电商加快闭环,独享IP为运营带来哪些好处?
近日有消息称TikTok电商在加快闭环,以后商家可能无法继续在TikTok上为其他电商平台或独立站引流了。如今“TikTok Shop Shopping Center”平台正在构建,将各种购物渠道整合为一体,这可能是一种趋势,意味着TikTok逐渐从社交应用转型…...
LaTeX系列4——列表
无序列表 \documentclass[UTF-8]{ctexart}\begin{document} \begin{itemize}\item{列表项1}\item{列表项2}\item{列表项3} \end{itemize} \end{document} 有序列表 \documentclass[UTF-8]{ctexart}\begin{document} \begin{enumerate}\item{列表项1}\item{列表项2}\item{列表…...
JNI笔记
JNI笔记 背景Demo代码JNI.javaMainActivity.javaAndroid.mkApplication.mkcom_stone_javacallc_JNI.hjavacallc.cbuild.gradle 背景 Demo代码 代码结构 JNI.java package com.stone.javacallc;/*** Created by stoneWang* Created on 2024/1/16* java调用C*/ public class …...
使用nginx的proxy_cache实现静态资源的缓存
nginx的版本 ./nginx -v nginx version: nginx/1.9.15需求 要求nginx缓存静态资源,如js、css、图片等,避免对静态资源的访问直接穿透到后端的j2ee应用侧,提高后端j2ee应用的运行效率。 配置方法 针对js、css、图片文件 分别增加缓存路径的…...
【Golang】Perl 正则表达式语法的支持示例
背景 在 Golang 中,标准库的正则表达式包 regexp 是基于 RE2 语法的,并不直接支持 Perl 正则表达式的全部功能。虽然 Golang 的标准库并不直接提供对 Perl 正则表达式的支持,但是您可以使用第三方库来实现与 Perl 兼容的正则表达式功能。 一…...
手写一个std::function
前言 在《std::function从实践到原理》中我们分析了std::function的实现原理,但这只是纸上谈兵。要想理解为什么这么实现,最好的办法还是想想要是自己手写一个要怎么实现。本文不想直接呈现最终版本,因为那样读者看不到某段代码是为了什么才…...
04--MySQL函数的使用
1、SQL函数的使用 当我们学习编程语言的时候,经常会遇到函数。函数的好处是,它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了编写代码的效率,又提高了可维护性。在SQL中函数主要要对数据进行处理&…...
imgaug库指南(28):从入门到精通的【图像增强】之旅(万字长文)
引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…...
精确掌控并发:漏桶算法在分布式环境下并发流量控制的设计与实现
这是《百图解码支付系统设计与实现》专栏系列文章中的第(16)篇,也是流量控制系列的第(3)篇。点击上方关注,深入了解支付系统的方方面面。 本篇重点讲清楚漏桶原理,在支付系统的应用场景&#x…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
