SpringBoot学习03-[Spring Boot与Web开发]
Spring Boot与Web开发
- RestTemplate
- MockMvc
- 在SPringBoot中使用
- SpringBoot整合swagger2
- SpringBoot的springmvc自动配置底层原理
- 包含ContentNegotiatingViewResolver和BeanNameViewResolver
- ContentNegotiatingViewResolver
- BeanNameViewResolver
- 支持提供静态资源,包括对WebJars的支持
- 支持HttpMessageConverters
- 静态index.html支持
RestTemplate
rest风格的映射请求注解常用的有:
- @RequestMapping
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
通过restTemplate调用来测试
MockMvc
MockMvc是由spring-test包提供,实现对Http请求的模拟,能够直接使用网络的形式,
转换到controller的调用,使得测试速度快、不依赖网络环境
在SPringBoot中使用
- 建立测试类
@SpringBootTest(classes = MyApplication.class)
@AutoConfigureMockMvc //专门用于做mockmvc的,由spring-test提供,依赖junit-5,如果没有该注解需要手动注入mockmvc
public class MockMvcTest {@AutowiredMockMvc mockMvc;/*** 查询* @throws Exception*/@Testvoid testMockMvc() throws Exception {//发起一个模拟请求,不依赖网络,不依赖web服务,不需要启动web应用RequestBuilder builder = MockMvcRequestBuilders.get("/person/{id}", 14) //发送请求.accept(MediaType.APPLICATION_JSON);//设置响应类型mockMvc.perform(builder).andExpect(MockMvcResultMatchers.status().isOk()) //断言状态码为200.andDo(MockMvcResultHandlers.print());}/*** 新增* @throws Exception*/@Testvoid testInsertMVC() throws Exception {String userJson = "{\n" +" \"name\":\"诸葛亮\",\n" +" \"age\": 25,\n" +" \"address\": \"成都\"\n" +"}";RequestBuilder builder = MockMvcRequestBuilders.post("/person/add").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON) //设置请求的文本类型.content(userJson);mockMvc.perform(builder).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print());}/*** 删除*/@Testvoid deleteMockMvc() throws Exception {RequestBuilder builder = MockMvcRequestBuilders.delete("/person/{id}", 16).accept(MediaType.APPLICATION_JSON);mockMvc.perform(builder).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print());}}
SpringBoot整合swagger2
- 添加依赖
swagger是一系列对rest接口的描述和UI展示的规范(json),springfox整合springmvc和swagger,将代码中的注解转换为符合Swagger的规范的json文件
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.6</version></parent><!--整合swagger2依赖--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency>
- 配置文件配置
mvc:pathmatch:matching-strategy: ant_path_matcher
- 配置swagger配置类
@Configuration
@EnableSwagger2
public class SwaggerConfig {//用来告诉springfox,怎么去生成swagger所需要的规范数据@Beanpublic Docket createRestApi(){return new Docket(DocumentationType.SWAGGER_2).pathMapping("/")//设置哪些接口会映射到swagger文档中.select() //接口选择器.apis(RequestHandlerSelectors.basePackage("com.springboot.controller")) //告诉springfox哪些接口要生成swagger文档.paths(PathSelectors.any()) //设置哪些接口生成在swagger文档上.build().apiInfo(new ApiInfoBuilder() //描述文档的主体信息.title("SpringBoot整合Swagger").description("SpringBoot整合Swagger,详细信息.......").version("1.0").contact(new Contact("诸葛亮","","123@qq.com")).build());}
}
添加完配置后,直接启动项目就可以了
固定访问地址:http://localhost:8080/swagger-ui.html#/
- 测试controller
@Api("用户相关操作")
@RestController
@RequestMapping("/person")
public class PersonController {@Autowiredprivate PersonService personService;/*** 查询* @param id* @return*/@GetMapping("/{id}")@ApiOperation("根据id获取用户")public Result<Person> getPerson(@PathVariable("id") Integer id){Person person = personService.getPersoById(id);return new Result<>("200","查询成功",person);}/*** 新增* @return*/@PostMapping("/add")@ApiOperation("添加用户")public Result<Void> addPerson(@RequestBody Person person){personService.insertPerson(person);return new Result<>("200","新增成功");}/*** 修改*/@PutMapping("/{id}")@ApiOperation("修改用户")public Result<Void> updatePerson(@RequestBody Person person){personService.updatePerson(person);return new Result<>("200","修改成功");}/*** 删除* @param id* @return*/@DeleteMapping("/{id}")@ApiOperation("根据id删除用户")public Result<Void> deletePerson(@PathVariable("id") Integer id){personService.deletePerson(id);return new Result<>("200","删除成功");}
}
SpringBoot的springmvc自动配置底层原理
SpringBoot为Spring MVC提供了自动配置,可与大多数应用程序完美配合。
自动配置在Spring的默认值之上添加了以下功能:
- 包含ContentNegotiatingViewResolver和BeanNameViewResolver
- 支持提供静态资源,包括对WebJars的支持
- 自动注册Converter,Genericveter和Fomatter Bean类
- 支持HttpMessageConverters
- 支持注册MessageCodesResolver
- 静态index.html支持
- 自动使用ConfigurationWebBindingInitializer bean
包含ContentNegotiatingViewResolver和BeanNameViewResolver
都是springmvc内置的视图解析器
ContentNegotiatingViewResolver
这个视图解析器并不会解析视图,而是委派给其他视图进行解析
所有的视图解析器,都会根据返回的视图名称进行解析,resolveViewName
@Nullablepublic View resolveViewName(String viewName, Locale locale) throws Exception {RequestAttributes attrs = RequestContextHolder.getRequestAttributes();Assert.state(attrs instanceof ServletRequestAttributes, "No current ServletRequestAttributes");List<MediaType> requestedMediaTypes = this.getMediaTypes(((ServletRequestAttributes)attrs).getRequest());if (requestedMediaTypes != null) {//获得所有匹配的视图List<View> candidateViews = this.getCandidateViews(viewName, locale, requestedMediaTypes);//获取最终的视图View bestView = this.getBestView(candidateViews, requestedMediaTypes, attrs);if (bestView != null) {return bestView;}}}
委派给其他视图解析器进行解析
protected void initServletContext(ServletContext servletContext) {//从spring容器中获取所有viewResolver类型的beanCollection<ViewResolver> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(this.obtainApplicationContext(), ViewResolver.class).values();ViewResolver viewResolver;if (this.viewResolvers == null) {this.viewResolvers = new ArrayList(matchingBeans.size());Iterator var3 = matchingBeans.iterator();while(var3.hasNext()) {viewResolver = (ViewResolver)var3.next();if (this != viewResolver) {this.viewResolvers.add(viewResolver);}}
由以上代码可以得出结论,它是从Spring IOC容器中获得ViewResolver类型的bean,那么我们可以自己定制一个ViewResolver,ContentNegotiatingViewResolver也会帮我们委派解析
springboot应用中目前接口都是返回json串,只有报错或者返回视图的时候才会走视图解析器。
BeanNameViewResolver
会根据handler方法返回的视图名称(test),去ioc容器中找名字叫test的一个bean,并且这个bean是view类型的 对应到具体视图并解析:
- 实例
- handler方法
@Controller
@RequestMapping("/viewtest")
public class ViewTestController {@RequestMapping("/test")public String test(){return "test";}
}
- view视图
@Component
public class Test implements View {@Overridepublic String getContentType() {return "text/html";}@Overridepublic void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {response.getWriter().println("测试BeanNameViewResolver");}
}
支持提供静态资源,包括对WebJars的支持
以前要访问jpg\css、js等 这些静态资源文件,需要再web.xml中配置,在springboot中不需要配置,只需要放在约定的文件夹中(约定大于配置)
- 原理
webJars:就是将静态资源放在jar包中进行访问
比如下面对jquery的:当访问路径含有webjars(约定大于配置),就去/META-INF/resources/webjars/文件夹下(约定大于配置)去找静态资源
- 在static文件中访问的静态资源:又是什么原理呢?
会去这个字符串数组对应的文件夹去找
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
支持HttpMessageConverters
HttpMessageConverters:负责我们的http请求和响应的报文处理
静态index.html支持
在springboot中可以直接返回html视图,因为在自动配置类WebMvcAutoConfiguration配置了InternalResourceViewResolver
@Bean@ConditionalOnMissingBeanpublic InternalResourceViewResolver defaultViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix(this.mvcProperties.getView().getPrefix());resolver.setSuffix(this.mvcProperties.getView().getSuffix());return resolver;}
因为InternalResourceViewResolver 被配置了,所以就可以在全局配置文件中配置:
spring:mvc:view:prefix: /pages/suffix: .html
相关文章:

SpringBoot学习03-[Spring Boot与Web开发]
Spring Boot与Web开发 RestTemplateMockMvc在SPringBoot中使用 SpringBoot整合swagger2SpringBoot的springmvc自动配置底层原理包含ContentNegotiatingViewResolver和BeanNameViewResolverContentNegotiatingViewResolverBeanNameViewResolver 支持提供静态资源,包括…...

数据恢复篇:如何恢复丢失的Android短信?
许多用户发现自己处于重要短信意外从Android手机中删除的情况。幸运的是,有一些行之有效的方法可以在没有root的情况下恢复已删除的短信Android,这可以成为救命稻草。这些技术不需要深厚的技术知识,也不需要损害设备的安全性。为了帮助您摆脱…...

数据结构历年考研真题对应知识点(栈)
目录 3.1栈 3.1.1栈的基本概念 【栈的特点(2017)】 【入栈序列和出栈序列之间的关系(2022)】 【特定条件下的出栈序列分析(2010、2011、2013、2018、2020)】 3.1.2栈的顺序存储结构 【出/入栈操作的模拟(2009)】 3.1栈 3.1.1栈的基本概念 【栈…...

BarTender版软件下载及安装教程
根据行业数据显示强大的配套应用软件甚至能够管理系统安全性、网络打印功能、文档发布、打印作业记录等,为满足不同的需要和预算,BarTender 提供四个版本,每个都拥有卓越的功能和特性。根据软件大数据显示多国语言支持:轻松设计…...
Python 中从字典中提取所有值到列表
目录: 使用 keys() 方法使用 values() 方法使用 items() 方法使用 * 解包使用列表推导式使用 lambda 函数有时候,在使用 Python 字典时,只关心获取字典的值而不关心字典的键。可以使用多种方法从字典中获取所有的值。 使用 keys() 方法 Python 字典(Dictionary) keys() 方…...

Netty中Reactor线程的运行逻辑
Netty中的Reactor线程主要干三件事情: 轮询注册在Reactor上的所有Channel感兴趣的IO就绪事件。 处理Channel上的IO就绪事件。 执行Netty中的异步任务。 正是这三个部分组成了Reactor的运行框架,那么我们现在来看下这个运行框架具体是怎么运转的~~ 这…...
liunx 搭建 zookeeper
创建下载路径 #创建文件夹 mkdir -p /mydata/zookeeper #进入文件夹 cd /mydata/zookeeper下载zookeeper文件 #下载 wget https://mirrors.aliyun.com/apache/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz #解压文件 tar -zxvf apache-zookeeper-3.5.9-bin.…...
selenium 3中等待方式
Selenium 3中的等待方式主要有三种:强制等待、隐式等待和显式等待(智能等待的一种)。 1. 强制等待:使用time.sleep(X)方法,强制让浏览器等待X秒,无论当前操作是否完成,都…...
pytorch笔记:named_parameters
named_parameters 是 PyTorch 中一个非常有用的函数,用于访问模型中所有定义的参数及其对应的名称。它是 torch.nn.Module 类的方法之一,返回一个生成器,生成 (name, parameter) 对,name 是参数的名称,parameter 是对应…...
uniapp——H5添加支付宝授权登录,报错:系统异常,请联系商家。REDIRECT_URI_ILLEAGAL
解决方法 https://opensupport.alipay.com/support/FAQ/41bb980b-d18e-4141-8063-9d172cb7e655 这其中最常见的是授权的回调地址配置的不正确 应该为域名后面加上你H5打包后的名字,例如 https://www.xxx.com/agent要正确配置支付宝授权登录的回调地址,…...

群辉NAS使用Kodi影视墙
目录 一、KODI安装 二、修改UI语言 1、修改显示字体 2、修改语言为中文 四、添加媒体库 五、观看电影 五、高级设置 1、视图类型 2、修改点击播动作 五、补充 1、文件组织结构及命名 2、电影信息的刮削 (1)添加影片 (2)演员管理 (3)影片管理 (4)说明 K…...

如何实现HPC数据传输的高效流转,降本增效?
高性能计算(HPC)在多个行业中都有应用,涉及到HPC数据传输的行业包括但不限于: 1.科学研究:在物理学、化学、生物学、地球科学等领域进行模拟和建模。 2.工程和产品设计:进行复杂系统的设计和分析…...
redis 定时任务锁 分布式锁
基于 redisTemplate 在分布式集群环境中的最佳实践,其实无论是单机还是集群,保证原子性都是第一位的,如果能同时保证性能和高可用,那么就是一个可靠的分布式锁解决方案。 主要思路是:设置锁时,使用 redis…...
了解支付行业基本专业语
1、商户简称做什么? 商户简称是消费者支付时显示的名称。 2、客服电话哪里显示? 客服电话是如果用户对订单有疑问,可通过客服电话联系到您这边。会在支付成功后,微信(支付宝)支付的订单里面显示。 3、什么叫T1/T0、D1/D0 T1为第二个工作日到账&am…...

408数据结构-图的应用1-最小生成树 自学知识点整理
前置知识:图的遍历 图的应用是408初试历年考查的重点。不过一般而言,这部分内容直接以算法设计题形式考查的可能性极小,更多的是结合图的实例来考查算法的具体操作过程,要求掌握的是手推模拟给定图的各个算法执行过程。此外&#…...
Ubuntu18.04操作系统使用pip3安装open cv
在Ubuntu18.04操作系统环境下使用pip3安装opencv。安装方法如下: #pip3安装 sudo apt-get install python3-pip # 依赖包安装 sudo apt-get install libsm6 libxrender1 libxext6 #opencv安装;版本号自行填写 pip3 install opencv-python4.1.1.26 具体步骤 1、确认…...
为什么变量不可以在 switch 语句中声明定义?
目录 1.引言 2.switch语句的基本用法 3.为何不能在switch语句中声明变量 3.1.作用域问题 3.2.跳转语句的限制 4.解决方案 4.1.在switch语句之前声明变量 4.2.使用花括号创建新的作用域 5.总结 1.引言 在C/C等编程语言中,switch语句是一种常见的控制流结构&…...

手机定位技术全解析:原理、发展与应用
1. 引言 背景介绍 最近,神仙姐姐刘亦菲主演的电视剧《玫瑰的故事》中的一段情节引发了广泛讨论。剧中,方协文(丈夫)对玫瑰(妻子)的控制欲变本加厉,竟然偷偷在她的手机上安装监控软件ÿ…...
深入探索Kylin的Cube构建:数据魔方的构建之旅
深入探索Kylin的Cube构建:数据魔方的构建之旅 引言 Apache Kylin是一个开源的分布式分析引擎,提供Hadoop和Spark之上的高性能数据立方体(Cube)技术。Kylin的Cube构建过程是其核心功能之一,它允许用户定义和构建多维数…...

web渗透-CSRF漏洞
一、简介 cross-site request forgery 简称为"csrf",在csrf的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以csrf攻击也为"o…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...