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 {

    @Autowired
    MockMvc mockMvc;

    /**
     * 查询
     * @throws Exception
     */
    @Test
    void 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
     */
    @Test
    void 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());
    }

    /**
     * 删除
     */
    @Test
    void 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所需要的规范数据
    @Bean
    public 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 {

    @Autowired
    private 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

  @Nullable
    public 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类型的bean
        Collection<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 {

    @Override
    public String getContentType() {
        return "text/html";
    }

    @Override
    public 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
        @ConditionalOnMissingBean
        public 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/745127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面试干货】Java中==和equals()的区别

【面试干货】Java中和equals&#xff08;&#xff09;的区别 1、操作符2、equals()方法3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;和equals()是两个常用的比较操作符和方法&#xff0c;但它们之间的用法和…

聚星文社官网

推文工具可以帮助你将小说内容简洁明了地转化为推文形式&#xff0c;以便更好地在社交媒体上进行宣传和推广。以下是一些建议的小说推文工具&#xff1a; 聚星文社 字数统计工具&#xff1a;使用字数统计工具&#xff0c;如Microsoft Word或在线字数统计器&#xff0c;来确保你…

PCM、WAV,立体声,单声道,正弦波等音频素材

1&#xff09;PCM、WAV音频素材&#xff0c;分享给将要学习或者正在学习audio开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 常用的Audio PCM WAV不同采样率&#xff0c;不同采样深度&#…

【结构体】详解

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

web前端大作业--美团外卖1

文章目录 概述代码截图代码链接 概述 web美团 登录和注册功能、页面展示。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href&quo…

大模型技术的应用场景

大模型技术&#xff08;Large Language Model&#xff0c;LLM&#xff09;是指具有大量参数和训练数据的神经网络模型&#xff0c;它能够学习语言的统计规律&#xff0c;并生成与人类书写的文本相似的文本。大模型技术在近年来取得了重大进展&#xff0c;并开始在各种领域得到应…

中国杀出全球首个烹饪大模型

什么&#xff1f;烹饪也有大模型&#xff1f;&#xff01; 没有听错&#xff0c;这就是国产厨电龙头老板电器最新发布——“食神”大模型。 数十亿级行业数据&#xff0c;数千万级知识图谱加持&#xff0c;据称还是全球首个。 它能为每个人提供个性化量身定制的解决方案&…

从入口文件搭建php项目

入口文件index.php <?phprequire CallBack.php; // 处理回调请求逻辑 $bot new CallBack();// 请求方式 if (isset($_GET[method])) {$method $_GET[method];if (method_exists($bot, $method)) {return $bot->$method();} else {echo "没有该功能";die();…

系统思考—啤酒游戏经营决策沙盘

在日常的教学中&#xff0c;我们通过系统思考仿真演练深入探索决策背后的动因。例如&#xff0c;我经常教授的麻省理工学院研发的“啤酒游戏”和“人民航空策略模拟”&#xff0c;这些都是麻省理工MBA学生的必修课。此外&#xff0c;还有更简洁的“红黑游戏”“收获季节”等模拟…

Typora 更换皮肤

typora 下载激活 上面的链接已经讲了如何下载激活typora工具,本篇说一下如何给typora换肤 typora 中文官网 进入官网,在整体界面布局的上方找到主题 下面以其中一个主题为例,跟换主题皮肤 下载该主题 找到旁边的release 下拉窗体,在Assets里面找这种压缩包,通过名字很容易区…

无限制数字(仅仅int类型)的大小的自然排序算法

直接上代码&#xff1a; #include <iostream> #include <vector> #include <string> #include <algorithm> #include <cctype>// Function to compare two strings in a natural way bool naturalCompare(const std::string& a, const std:…

数据结构与算法—空间复杂度详解与示例(C#,C++)

文章目录 1. 数据结构概述2. 空间复杂度的定义及影响因素3. 空间复杂度的区分常数空间复杂度&#xff08;O(1)&#xff09;线性空间复杂度&#xff08;O(n)&#xff09;其他空间复杂度 4. 几种典型数据结构的优缺点分析数组&#xff08;Array&#xff09;链表&#xff08;Linke…

墨迹天气与AI数据湖的集成案例(集易连平台)

客户介绍 客户方为国内某皮具生产企业&#xff0c;年设计版型数千款&#xff0c;全国销售门店数一千多家&#xff0c;年销售额达20亿。该AI项目目的是将订单数据、用户行为分析、天气数据、门店位置、客流量等等一系列数据作为AI大模型的输入&#xff0c;经过大模型的训练和…

压力测试

1.什么是压力测试 压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统在线上的处理能力和稳定性维持在一个标准范围内&#xff0c;做到心中有数 使用压力测试&#xff0c;我们有希望找到很多种用其他测试方法更难发现的错误&#…

【浦语开源】深入探索:大模型全链路开源组件 InternLM Lagent,打造灵笔Demo实战指南

一、准备工作&#xff1a; 1、环境配置&#xff1a; pip、conda换源&#xff1a; pip临时换源&#xff1a; pip install -i https://mirrors.cernet.edu.cn/pypi/web/simple some-package# 这里的“https://mirrors.cernet.edu.cn/pypi/web/simple”是所换的源&#xff0c;…

Qt实战项目——贪吃蛇

一、项目介绍 本项目是一个使用Qt框架开发的经典贪吃蛇游戏&#xff0c;旨在通过简单易懂的游戏机制和精美的用户界面&#xff0c;为玩家提供娱乐和编程学习的机会。 二、主要功能 2.1 游戏界面 游戏主要是由三个界面构成&#xff0c;分别是游戏大厅、难度选择和游戏内界面&a…

Studio One 6 Professional for Mac v6.6.1 音乐创作编辑软件 激活版

PreSonus Studio One 6 Professional 是一款功能强大的音乐制作软件&#xff0c;它为音乐创作者、制作人、录音师以及音乐爱好者提供了一个全面且易于使用的创作环境。从基本的音频录制到复杂的混音和母带处理&#xff0c;这款软件都能轻松应对&#xff0c;让音乐创作过程变得既…

『亚马逊云科技产品测评』程序员最值得拥有的第一台专属服务器 “亚马逊EC2实例“

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 引言 自2006年8月9日&#xff0c;在搜索引擎大会&#xff08;SES San Jo…

基于jeecgboot-vue3的Flowable流程-自定义业务表单处理(二)-挂接自定义业务表单

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、增加一个根据服务名称动态寻找对应自定义表单组件的hooks import { ref, reactive, computed, markRaw, onMounted, defineAsyncComponent } from vue; import { listCustomForm } fro…

四川音盛佳云电子商务有限公司抖音电商的先行者

在当今数字时代&#xff0c;电商行业风起云涌&#xff0c;各大平台竞相争夺市场份额。而在这其中&#xff0c;四川音盛佳云电子商务有限公司以其独特的抖音电商服务模式&#xff0c;悄然崛起&#xff0c;成为了行业中的一股不可忽视的力量。今天&#xff0c;就让我们一起走进音…