SpringBoot2-[SpringBoot核心功能]

简介: SpringBoot2-[SpringBoot核心功能]

在这里插入图片描述

👨🏻‍🎓博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家🌟
🌈擅长领域:Java、大数据、运维、电子
🙏🏻如果本文章各位小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏,相应的有空了我也会回访,互助!!!
🤝另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!!

@[TOC]

SpringBoot核心功能

在这里插入图片描述

  • 配置文件(yaml)

    • 适合用来做以数据为中心的配置文件
    • 基本语法

      • key: value;kv之间有空格
      • 大小写敏感
      • 使用缩进表示层级关系
      • 缩进不允许使用tab,只允许空格
      • 缩进的空格数不重要,只要相同层级的元素左对齐即可
      • '#'表示注释
      • 字符串无需加引号,如果要加,'hello \n hello'表示字符串内容 会被转义,变成"hello \n hello"
    • 数据类型

      • 字面量:单个的、不可再分的值。date、boolean、string、number、null

        k: v
      • 对象:键值对的集合。map、hash、set、object

        行内写法:  k: {k1:v1,k2:v2,k3:v3}
        #或
        k: 
          k1: v1
          k2: v2
          k3: v3
      • 数组:一组按次序排列的值。array、list、queue

        行内写法:  k: [v1,v2,v3]
        #或者
        k:
         - v1
         - v2
         - v3
    • 例子

      • Person.java

        @ToString
        @EqualsAndHashCode
        @Data
        @Accessors(chain = true)
        @AllArgsConstructor
        @NoArgsConstructor
        @Component
        @ConfigurationProperties(prefix = "myself")
        public class Person {
            private String userName;
            private Boolean boss;
            private Date birth;
            private Integer age;
            private Pet pet;
            private String[] interests;
            private List<String> animal;
            private Map<String, Object> score;
            private Set<Double> salarys;
            private Map<String, List<Pet>> allPets;
        }
      • application.yml

        myself:
          username: 宋江
          boss: false
          birth: 1999/07/09
          age: 21
          pet:
            name: 小狗
            color: red
          interests: [篮子,箩筐]
          animal: [cat,dog]
        #  score:
        #    chinses:
        #      first: 90
        #      secode: 88
        #    meth:
        #      first: 99
        #      secode: 57
          score: {chinse: 19,math: 20}
          salarys: [199.00,889.76]
          all-pets:
            marry: [{name: cat,color: red}]
            jack: [{name: dog,color: blue}]
        #  salarys: {17.09,98.22}
        #  allPats:
        #    marray:
        #      - {name:tom}
        #      - {name:dog,color:yellow}

Web开发

  • 静态资源访问

    只要静态资源放在类路径下: called /static (or /public or /resources or /META-INF/resources

    访问 : 当前项目根路径/ + 静态资源名

    原理: 静态映射/**。

    请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面

    改变默认的静态资源映射路径

    spring:
      mvc:
        static-path-pattern: /res/**
    #改变静态资源的目录
      resources:
        static-locations: [classpath:/haha/]
  • 静态资源反问前缀

    spring:
      mvc:
        static-path-pattern: /res/**

    访问 : 当前项目根路径/ res/+ 静态资源名

  • 欢迎页面支持

    • 静态资源路径下 index.html
    • 可以配置静态资源路径
    • 但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问
    • controller能处理/index
  • 自定义Favicon

    • favicon.ico 放在静态资源目录下即可。
  • 静态资源配置原理(收录)

    • ⚠️ 注意:
    spring:  
        resources:
            add-mappings: false   禁用所有静态资源规则,即所有默认的静态映射规则失效
  • 请求参数处理(已收录)

    1. rest使用与原理

      • 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
      • 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
      • 核心Filter;HiddenHttpMethodFilter
      • 用法: 表单method=post,隐藏域 _method=put
      • SpringBoot中手动开启

        spring:
          mvc:
            hiddenmethod:
              filter:
                enabled: true #开启表单的Rest功能
      • Rest原理(表单提交要使用REST的时候)

        • 表单提交会带上_method=PUT
        • 请求过来被HiddenHttpMethodFilter拦截
        • 请求是否正常,并且是POST
        • 获取到_method的值。
        • 兼容以下请求;PUT.DELETE.PATCH
        • 原生request(post),包装模式requesWrapper重写了getMethod方法,返回的是传入的值。
        • 过滤器链放行的时候用wrapper。以后的方法调用getMethod是调用requesWrapper的。
        • 修改_method为自己所要设置的值

          @Configuration(proxyBeanMethods = false)
          public class WebConfig {
          
              //设置接受参数的方法名
              @Bean
              public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
                  HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
                  hiddenHttpMethodFilter.setMethodParam("_mymethod");
                  return hiddenHttpMethodFilter;
              }
          
          }
      • 例子:

        index.html

        <form action="/user" method="get">
            <input value="发送Get请求!" type="submit">
        </form>
        <form action="/user" method="post">
            <input value="发送Post请求!" type="submit">
        </form>
        <form action="/user" method="post">
            <input name="_mymethod"" value="put" type="hidden">
            <input value="发送Put请求!" type="submit">
        </form>
        <form action="/user" method="post">
            <input name="_mymethod"" value="delete" type="hidden">
            <input value="发送Delete请求!" type="submit">
        </form>

        Controller.java

                @GetMapping("/user")
            public String get(){
                return "客户端发送Get请求!";
            }
        
            @PutMapping("/user")
            public String put(){
                return "客户端发送Put请求!";
            }
        
            @PostMapping("/user")
            public String post(){
                return "客户端发送Post请求!";
            }
        
            @DeleteMapping("/user")
            public String delete(){
                return "客户端发送Delete请求!";
            }
        • ⚠️ 注意:@RequestMapping(value = "/user", method = RequestMethod.DELETE)等于@DeleteMapping("/user")

        WebConfig.java

        //设置接受参数的方法名
            @Bean
            public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
                HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
                hiddenHttpMethodFilter.setMethodParam("_mymethod");
                return hiddenHttpMethodFilter;
            }
  • 请求映射原理(已收录)
  • 普通参数和基本注解

    @PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody、@RequestAttribute

    • 代码实现:

      WebController.java

      @GetMapping("/car/{id}/owner/{username}")
      public Map<String,Object> getCar(
                                       //从上面路径中获取{}中的参数,也就是路径参数
                                       @PathVariable("id") String id,
                                       @PathVariable("username") String username,
                                       //获取全部的参数
                                       @PathVariable Map<String,String> map,
                                       //获取响应头的参数
                                       @RequestHeader("User-Agent") String user_Agent,
                                       @RequestHeader Map<String,String> header,
                                       //从page获取xxx=vaue中的value
                                       @RequestParam("age") String age,
                                       @RequestParam("sex") String sex,
                                       @RequestParam Map<String,String> infomap){
          HashMap<String, Object> infoMap = new HashMap<>();
          infoMap.put("id",id);
          infoMap.put("usernaem",username);
          infoMap.put("allInfo",map);
          infoMap.put("user_agent",user_Agent);
          infoMap.put("header",header);
          infoMap.put("age",age);
          infoMap.put("sex", sex);
          infoMap.put("infomap",infomap);
          return infoMap;
      }
      
      /**
       * 用于表单提交获取参数
       * @param context
       * @return
       */
      @PostMapping("/save")
      public Map infoUser(@RequestBody String context){
          HashMap<String,Object> contextMap = new HashMap<>();
          contextMap.put("context", context);
          return contextMap;
      }

      index.html

      <div>
          <a href="/car/1/owner/gcq?age=12&sex=男">/car/1/owner/gcq?age=12&sex=男</a>
      </div>
    • @RequestAttribute代码实现

      @Controller
      public class RequestController {
      
          /**
           * 接受/goto请求
           * @param request
           * @return
           */
          @GetMapping("/goto")
          public  String gotoPage(HttpServletRequest request){
              request.setAttribute("msg","转发成功!");
              request.setAttribute("code",200);
              return "forward:/success";
          }
      
          /**
           * 接受forward:/success的转请求
           * @param msg
           * @param code
           * @param request
           * @return
           */
          @ResponseBody
          @GetMapping(value = "/success",produces = "application/json;charset=utf-8")
          public Map reviceSuccess(@RequestAttribute("msg") String msg,
                                   @RequestAttribute("code") String code,
                                   HttpServletRequest request){
              //从请求域中获取获取msg
              Object msg1 = request.getAttribute("msg");
              HashMap<String, Object> result = new HashMap<>();
              //通过注获取msg
              result.put("anno_msg",msg);
              result.put("anno_code",code);
              result.put("anno_request",msg1);
              return result;
          }
      }
    • @MatrixVariable和UrlPathHelper()矩阵变量

      • 代码实现

        • config.java

          //    /**
          //     * 定制路径映射规则,使配置类实现WebMvcConfigurer接口
          //     * @param configurer
          //     */
          //    @Override
          //    public void configurePathMatch(PathMatchConfigurer configurer) {
          //        UrlPathHelper urlPathHelper = new UrlPathHelper();
          //        //使不移除;后的内容,矩阵变量功能生效
          //        urlPathHelper.setRemoveSemicolonContent(false);
          //        configurer.setUrlPathHelper(urlPathHelper);
          //    }
          
              /**
               * 使用内部类的方式进行创建
               * @return
               */
              @Bean
              public WebMvcConfigurer webMvcConfigurer(){
                  return new WebMvcConfigurer() {
                      @Override
                      public void configurePathMatch(PathMatchConfigurer configurer) {
                          UrlPathHelper urlPathHelper = new UrlPathHelper();
                          urlPathHelper.setRemoveSemicolonContent(false);
                          configurer.setUrlPathHelper(urlPathHelper);
                      }
                  };
              }
        • controller.java

          @ResponseBody
          @GetMapping(value = "/id/{path}/{path2}",produces = "application/json;charset=utf-8")
              public Map careSell(@MatrixVariable(value = "age",pathVar = "path") Integer age,
                                  @MatrixVariable(value = "age",pathVar = "path2") Integer age2,
                                  @MatrixVariable(value = "sex",pathVar = "path") String sex,
                                  @MatrixVariable(value = "sex",pathVar = "path2") String sex2,
                                  @PathVariable String path){
          
                  Map<String,Object> result = new HashMap<>();
                  result.put("anno_age",age);
                  result.put("anno_age2",age2);
                  result.put("anno_sex",sex);
                  result.put("anno_sex2",sex2);
                  result.put("all_info",path);
                  return  result;
              }
        • index.html

          <div>
              <a href="/id/1;age=99;sex=男/3;age=88;sex=女">/cars/sell;low=34;brand=byd,audi,yd</a>
          </div>
  • 复杂参数

    Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder

    Map<String,Object> map,  Model model, HttpServletRequest request 都是可以给request域中放数据,
    request.getAttribute();
    • 代码实现:

      controller.java

      /**
           * 接受forward:/success的转请求,从请求域中获得参数
           * @param msg
           * @param code
           * @param request
           * @return
           */
          @ResponseBody
          @GetMapping(value = "/success",produces = "application/json;charset=utf-8")
          public Map reviceSuccess(@RequestAttribute(value = "map's",required = false) String msg,
                                   @RequestAttribute(value = "msg",required = false) String code,
                                   @RequestAttribute(value = "msgs",required = false) String msgs,
                                   //请求头中获取cookie
                                   @RequestHeader("cookie") String cookies,
                                   HttpServletRequest request){
              HashMap<String, Object> result = new HashMap<>();
              Object msgs1 = request.getAttribute("msgs");
              //通过注获取msg
              result.put("anno_msg's",msg);
              result.put("anno_msg",code);
              result.put("anno_msgs",msgs);
              result.put("cookies",cookies);
              result.put("getmsgs1",msgs1);
              return result;
          }
      
          /**
           * 接受/param的请求封装到请求域中
           * @param map
           * @param model
           * @param request
           * @param response
           * @return
           */
          @GetMapping("/param")
          public String careParam(Map<String,Object> map,
                               Model model,
                               HttpServletRequest request,
                               HttpServletResponse response){
              map.put("map's","coders");
              model.addAttribute("msg","hello");
              request.setAttribute("msgs","helloreq");
              Cookie cookie = new Cookie("cookie1","value1");
              cookie.setDomain("localhost");
              response.addCookie(cookie);
              return "forward:/success";
          }

      required = false表示该参数不是必须的,默认是必须得

  • 自定义对象参数

    • 可以自动类型转换与格式化,可以级联封装。
    • 代码实现:

      • Controller.java

        /**
             * 表单传递参数封装为对象
             *
             * @param humans
             * @return
             */
            @ResponseBody
            @PostMapping(value = "/saveuser", produces = "application/json;charset=utf-8")
            public Humans biandOp(Humans humans) {
                return humans;
            }

      index.html

      <form action="/saveuser" method="post">
          用户名:<input name="name" value="宋江">
          年龄:<input name="age" value="66">
          性别:<input name="sex" value="男">
          宠物名称:<input name="pet.name" value="coco">
          宠物颜色:<input name="pet.color" value="yellow">
          <input value="提交" type="submit">
      </form>

      Humans.java

      @AllArgsConstructor
      @NoArgsConstructor
      @Data
      @Accessors(chain = true)
      @EqualsAndHashCode
      @ToString
      public class Humans {
          private String name;
          private int age;
          private String sex;
          private Pet pet;
      }
  • POJO封装过程(已收录)

    • ServletModelAttributeMethodProcessor
  • 数据响应与内容协商

    在这里插入图片描述

    1. 响应JSON

      jackson.jar+@ResponseBody

    2. SpringMvc支持的返回值

      ModelAndView
      Model
      View
      ResponseEntity 
      ResponseBodyEmitter
      StreamingResponseBody
      HttpEntity
      HttpHeaders
      Callable
      DeferredResult
      ListenableFuture
      CompletionStage
      WebAsyncTask
      有 @ModelAttribute 且为对象类型的
      @ResponseBody 注解 ---> RequestResponseBodyMethodProcessor;
    3. 内容协商

      根据客户端接收能力不同,返回不同媒体类型的数据。

      • 首先引入xml依赖
      <dependency>
                  <groupId>com.fasterxml.jackson.dataformat</groupId>
                  <artifactId>jackson-dataformat-xml</artifactId>
      </dependency>
      • 开启自动协商,可以使用API测试工具对其进行测试,更改Accept的值为json或是xml
      spring:
        mvc:
          contentnegotiation:
            favor-parameter: true

      发送请求:http://localhost:8080/person?format=json或者http://localhost:8080/person?format=xml

    4. 自定义协商(application/aux-aitu)

      • 实现HttpMessageConverter接口,并重写一系列方法

        @Override
            public boolean canWrite(Class<?> aClass, MediaType mediaType) {
                return aClass.isAssignableFrom(Person.class);
            }
        /**
             * 自定义协商规则遵从aux-aitu
             * @return
             */
            @Override
            public List<MediaType> getSupportedMediaTypes() {
                return MediaType.parseMediaTypes("application/aux-aitu");
            }
        
        /**
             * 自定数据返回的格式
             * @param person
             * @param mediaType
             * @param httpOutputMessage
             * @throws IOException
             * @throws HttpMessageNotWritableException
             */
            @Override
            public void write(Person person, MediaType mediaType, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
                String data = person.getUserName()+";"+person.getAge()+";"+person.getBirth();
        
                OutputStream body = httpOutputMessage.getBody();
                body.write(data.getBytes());
            }
      • 并在WebMvcConfiguration中重写extendMessageConverters,

        public WebMvcConfigurer webMvcConfigurer(){
                return new WebMvcConfigurer() {
                    @Override
                    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                        converters.add(new GuiConverter());
                    }
相关文章
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
328 2
|
7月前
|
XML 前端开发 Java
SpringBoot实现文件上传下载功能
本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。
729 0
|
4月前
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
374 1
|
6月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
|
5月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
876 0
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
222 0
|
7月前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
461 4
|
7月前
|
存储 Java 定位技术
SpringBoot整合高德地图完成天气预报功能
本文介绍了如何在SpringBoot项目中整合高德地图API实现天气预报功能。从创建SpringBoot项目、配置依赖和申请高德地图API开始,详细讲解了实体类设计、服务层实现(调用高德地图API获取实时与预报天气数据)、控制器层接口开发以及定时任务的设置。通过示例代码,展示了如何获取并处理天气数据,最终提供实时天气与未来几天天气预报的接口。文章还提供了测试方法及运行步骤,帮助开发者快速上手并扩展功能。
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
169 3