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

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...