当前位置: 首页 > news >正文

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 支持提供静态资源&#xff0c;包括…...

数据恢复篇:如何恢复丢失的Android短信?

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

数据结构历年考研真题对应知识点(栈)

目录 3.1栈 3.1.1栈的基本概念 【栈的特点&#xff08;2017&#xff09;】 【入栈序列和出栈序列之间的关系(2022)】 【特定条件下的出栈序列分析(2010、2011、2013、2018、2020)】 3.1.2栈的顺序存储结构 【出/入栈操作的模拟(2009)】 3.1栈 3.1.1栈的基本概念 【栈…...

BarTender版软件下载及安装教程

​根据行业数据显示强大的配套应用软件甚至能够管理系统安全性、网络打印功能、文档发布、打印作业记录等&#xff0c;为满足不同的需要和预算&#xff0c;BarTender 提供四个版本&#xff0c;每个都拥有卓越的功能和特性。根据软件大数据显示多国语言支持&#xff1a;轻松设计…...

Python 中从字典中提取所有值到列表

目录: 使用 keys() 方法使用 values() 方法使用 items() 方法使用 * 解包使用列表推导式使用 lambda 函数有时候,在使用 Python 字典时,只关心获取字典的值而不关心字典的键。可以使用多种方法从字典中获取所有的值。 使用 keys() 方法 Python 字典(Dictionary) keys() 方…...

Netty中Reactor线程的运行逻辑

Netty中的Reactor线程主要干三件事情&#xff1a; 轮询注册在Reactor上的所有Channel感兴趣的IO就绪事件。 处理Channel上的IO就绪事件。 执行Netty中的异步任务。 正是这三个部分组成了Reactor的运行框架&#xff0c;那么我们现在来看下这个运行框架具体是怎么运转的~~ 这…...

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中的等待方式主要有三种&#xff1a;强制等待、隐式等待和显式等待&#xff08;智能等待的一种&#xff09;。 1. 强制等待&#xff1a;使用time.sleep&#xff08;X&#xff09;方法&#xff0c;强制让浏览器等待X秒&#xff0c;无论当前操作是否完成&#xff0c;都…...

pytorch笔记:named_parameters

named_parameters 是 PyTorch 中一个非常有用的函数&#xff0c;用于访问模型中所有定义的参数及其对应的名称。它是 torch.nn.Module 类的方法之一&#xff0c;返回一个生成器&#xff0c;生成 (name, parameter) 对&#xff0c;name 是参数的名称&#xff0c;parameter 是对应…...

uniapp——H5添加支付宝授权登录,报错:系统异常,请联系商家。REDIRECT_URI_ILLEAGAL

解决方法 https://opensupport.alipay.com/support/FAQ/41bb980b-d18e-4141-8063-9d172cb7e655 这其中最常见的是授权的回调地址配置的不正确 应该为域名后面加上你H5打包后的名字&#xff0c;例如 https://www.xxx.com/agent要正确配置支付宝授权登录的回调地址&#xff0c;…...

群辉NAS使用Kodi影视墙

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

如何实现HPC数据传输的高效流转,降本增效?

高性能计算&#xff08;HPC&#xff09;在多个行业中都有应用&#xff0c;涉及到HPC数据传输的行业包括但不限于&#xff1a; 1.科学研究&#xff1a;在物理学、化学、生物学、地球科学等领域进行模拟和建模。 2.工程和产品设计&#xff1a;进行复杂系统的设计和分析&#xf…...

redis 定时任务锁 分布式锁

基于 redisTemplate 在分布式集群环境中的最佳实践&#xff0c;其实无论是单机还是集群&#xff0c;保证原子性都是第一位的&#xff0c;如果能同时保证性能和高可用&#xff0c;那么就是一个可靠的分布式锁解决方案。 主要思路是&#xff1a;设置锁时&#xff0c;使用 redis…...

了解支付行业基本专业语

1、商户简称做什么? 商户简称是消费者支付时显示的名称。 2、客服电话哪里显示? 客服电话是如果用户对订单有疑问&#xff0c;可通过客服电话联系到您这边。会在支付成功后&#xff0c;微信(支付宝)支付的订单里面显示。 3、什么叫T1/T0、D1/D0 T1为第二个工作日到账&am…...

408数据结构-图的应用1-最小生成树 自学知识点整理

前置知识&#xff1a;图的遍历 图的应用是408初试历年考查的重点。不过一般而言&#xff0c;这部分内容直接以算法设计题形式考查的可能性极小&#xff0c;更多的是结合图的实例来考查算法的具体操作过程&#xff0c;要求掌握的是手推模拟给定图的各个算法执行过程。此外&#…...

Ubuntu18.04操作系统使用pip3安装open cv

在Ubuntu18.04操作系统环境下使用pip3安装opencv。安装方法如下&#xff1a; #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等编程语言中&#xff0c;switch语句是一种常见的控制流结构&…...

手机定位技术全解析:原理、发展与应用

1. 引言 背景介绍 最近&#xff0c;神仙姐姐刘亦菲主演的电视剧《玫瑰的故事》中的一段情节引发了广泛讨论。剧中&#xff0c;方协文&#xff08;丈夫&#xff09;对玫瑰&#xff08;妻子&#xff09;的控制欲变本加厉&#xff0c;竟然偷偷在她的手机上安装监控软件&#xff…...

深入探索Kylin的Cube构建:数据魔方的构建之旅

深入探索Kylin的Cube构建&#xff1a;数据魔方的构建之旅 引言 Apache Kylin是一个开源的分布式分析引擎&#xff0c;提供Hadoop和Spark之上的高性能数据立方体&#xff08;Cube&#xff09;技术。Kylin的Cube构建过程是其核心功能之一&#xff0c;它允许用户定义和构建多维数…...

web渗透-CSRF漏洞

一、简介 cross-site request forgery 简称为"csrf",在csrf的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09;,然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击就完成了。所以csrf攻击也为"o…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...