SpringBoot学习03-[Spring Boot与Web开发]

news2024/11/19 10:17:43

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Inner Transitions

Inner Transitions 内部转换是指不退出源状态的转换。当为具有异或分解的超状态定义时&#xff0c;内部转换是强大的。 使用内部转换可以极大地简化Stateflow图表&#xff0c;如以下示例所示&#xff1a; 使用内部转换之前 使用内部转换到连接结点之后 使用内部转换到历史节点…

【线上】如何解决积压消费?

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!​​​​​​​ Hello, 各位亲爱的读者朋友们!我是你们的小米,一个积极活泼的技术分享达人,今天我们要聊聊一个大家在分布式系统中经常遇到的棘手问题…

Maven私服批量上传pom和jar实操

Maven私服上传pom和jar实操-CSDN博客 Maven私服上传jar实操_maven fakepath-CSDN博客 之前写过两篇向maven私服上传jar的操作&#xff0c;看到阅读量还可以&#xff0c;觉得应该有很多人有这个需求&#xff0c;所以这次再放一个大招&#xff0c;通过批量的方式向私服传jar和p…

STM32F4 STD标准库串口接收例程

STM32F4 STD标准库串口接收中断空闲中断例程 &#x1f516;工程基于STM32F446 ✨用惯了STM32CubeMX傻瓜式配置&#xff0c;突然改用标准库写代码&#xff0c;初始化外设内容&#xff0c;总是丢三落四的。 本文将提供3种串口接收和发送模式&#xff1a;串口接收中断空闲中断、串…

PostgreSQL 用户及授权管理 06:启用 SSL 及验证

PostgreSQL 用户及授权管理 06&#xff1a;启用 SSL 及验证 安全在外企中是非常受重视的&#xff0c;一般外企都会要求所有可以使用加密的地方都使用加密。本小节我们启用 PostgreSQL 的 SSL 加密连接并进行抓包验证。 SSL 连接加密 安全套接字层 (SSL) 允许 PostgreSQL 接受…

Vite响应Ajax请求

Vite响应Ajax请求 陈拓 2024/06/20-2024/06/24 1. 概述 http-server、live-server 等常用于本地测试和开发的http服务器不能很好的支持 ES 模块&#xff0c;在测试ES 模块时浏览器控制台经常显示错误&#xff1a; Failed to load module script: Expected a JavaScript modu…

element-ui侧边栏:default-openeds

element-ui侧边栏实现路由跳转后展开对应侧边栏&#xff1a;default-openeds 当菜单是在本地写死时&#xff0c;如果想展开第一块内容、里面就只写1 :default-openeds"[‘1’]" 当菜单是动态获取时&#xff0c;点击跳转之后如何展开对应的菜单&#xff0c;在watch中监…

three.js围绕中心点的旋转动画代码和案例

在 Three.js 中&#xff0c;可以通过设置对象的旋转中心点来实现围绕一个中心点旋转。具体的实现步骤如下&#xff1a; 首先&#xff0c;创建一个场景、相机和渲染器&#xff1a; // 创建一个场景 var scene new THREE.Scene();// 创建一个透视相机 var camera new THREE.P…

Vite打包速度为什么比webpack快,打包的优劣势在哪里?

大家都有被webpack打包速度搞崩溃的时候&#xff0c;修改一处地方&#xff0c;想预览效果&#xff0c;要等上半天。 Vite比Webpack快的原因 ESM&#xff08;ES Module&#xff09;原生支持&#xff1a; Vite基于ESM构建&#xff0c;利用浏览器原生支持的ESM模块加载方式&…

【技术解码】百数SRM:如何助力企业快速优化供应链管理?

SRM应用是企业优化供应链管理的重要工具&#xff0c;它帮助企业全面管理供应商关系&#xff0c;从评估、选择到协同合作和绩效监控&#xff0c;确保供应链的稳定性和效率。 对于企业来说&#xff0c;通过全面管理供应商关系&#xff0c;可以降低采购风险&#xff0c;提升产品质…

Open AI 前 Superalignment部门研究员Leopold Aschenbrenner的关于Superintelligence担忧的真挚长文

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

002_unsigned long数据比较的坑?

【背景】 unsigned long 类似数据的比较问题&#xff0c;先上一段代码&#xff0c;如下图所示&#xff1a; 就是图中框出的部分&#xff0c;眨眼一看&#xff0c;应该没啥问题&#xff0c;而且我也在本地的编译器vs2019上编译了&#xff0c;确实也没有报错&#xff0c;所以就修…

基于java+springboot+vue实现的宠物商城网站(文末源码+Lw)273

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;商品信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

java启动命令与参数配置

1. java启动命令 运行一个java应用程序的语法分两种&#xff0c;分别为&#xff1a; 执行类&#xff1a;java [-options] class [args…] 执行jar文件&#xff1a;java [-options] -jar jarfile [args…] 其中 [-options] 配置 JVM参数&#xff0c;[args…] 配置 Java 运行参…

11.xss之href输出

11.xss之href输出 后台配置文件中的代码 xss之href输出绕过&#xff1a;javascript:alert(1111) 直接代入a标签herf里面一样可以绕过htmlspecialchars 输入攻击代码 javascript:alert(1111)点击蓝色字体直接会弹窗&#xff0c;如图所示&#xff1a;

Javac编译器

Java语言的编译器是一段不确定的操作过程&#xff0c;可能是讲Java文件转变为class文件的过程&#xff0c;也可能是指虚拟机的后端编译&#xff0c;讲字节码转换为机器码的过程&#xff0c;还肯是静态提前编译器直接讲Java文件编译为本地机器代码的过程。 前端编译器&#xff…

HTML5五十六个民族网站模板源码

文章目录 1.设计来源高山族1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 中国民族界面演示1.5 关于高山族界面演示1.6 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目录 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.ne…

压箱底的15套无代码可视化数据大屏

学习视频smardaten致力于大数据、人工智能领域前沿技术研发&#xff0c;充分挖掘生产生活的海量数据&#xff0c;提供覆盖全行业的、超大规模的数据治理与智能分析服务&#xff0c;平台旨在用全方位、前沿化的大数据、人工智能等数据智能技术&#xff0c;突破行业数据管理难题&…

第1章 物联网模式简介---独特要求和体系结构原则

物联网用例的独特要求 物联网用例往往在功耗、带宽、分析等方面具有非常独特的要求。此外&#xff0c;物联网实施的固有复杂性&#xff08;一端的现场设备在计算上受到挑战&#xff0c;另一端的云容量几乎无限&#xff09;迫使架构师做出艰难的架构决策和实施选择。可用实现技…

分享一套基于SSM的美食推荐管理系统(源码+文档+部署)

大家好&#xff0c;今天给大家分享一套基于SSM的美食推荐管理系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMvcMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 博主介绍&#xff1a; 一名Java全栈工程师&#xff0c;专注于Jav…