【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…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...

华为OD机考- 简单的自动曝光/平均像素
import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…...

设计模式-3 行为型模式
一、观察者模式 1、定义 定义对象之间的一对多的依赖关系,这样当一个对象改变状态时,它的所有依赖项都会自动得到通知和更新。 描述复杂的流程控制 描述多个类或者对象之间怎样互相协作共同完成单个对象都无法单独度完成的任务 它涉及算法与对象间职责…...

短视频时长预估算法调研
weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp(1−p)oddsTp(Tpodds…...