• 尚硅谷SpringBoot3笔记 (二) Web开发


    Spring Boot Web开发:24.Web开发-自动配置原理_哔哩哔哩_bilibili

    1. Web场景 

    1.1 自动配置

    整合web场景: 

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-webartifactId>
    4. dependency>

    包含配置项:

    • 1、SpringMVC的所有配置 spring.mvc
    • 2、Web场景通用配置 spring.web
    • 3、文件上传配置 spring.servlet.multipart
    • 4、服务器的配置 server: 比如:编码方式

    2. 默认效果 

    默认配置:

    1. 包含了 ContentNegotiatingViewResolverBeanNameViewResolver 组件,方便视图解析
    2. 默认的静态资源处理机制: 静态资源放在 static 文件夹下即可直接访问
    3. 自动注册 Converter,GenericConverter,Formatter 组件,适配常见数据类型转换格式化需求
    4. 支持 HttpMessageConverters,可以方便返回json等数据类型
    5. 注册 MessageCodesResolver,方便国际化及错误消息处理
    6. 支持 静态 index.html
    7. 自动使用ConfigurableWebBindingInitializer,实现消息处理、数据绑定、类型转化、数据校验等功能

    spring boot Web开发场景的三种使用方式:

    3. 静态资源规则(WebMvcAutoConfiguration)

    所有的 静态资源配置类:

    静态资源映射规则(固定的访问路径)在 WebMvcAutoConfiguration 中进行了定义:

    1. /webjars/** 的所有路径 资源都在 classpath:/META-INF/resources/webjars/
    2. /** 的所有路径 资源都在 classpath:/META-INF/resources/、classpath:/resources/、classpath:/static/、classpath:/public/
    3. 欢迎页规则在 WebMvcAutoConfiguration 中进行了定义:在静态资源目录下找 index.html,没有就在 templates下找index模板页

    4. 自定义静态资源规则

    • 1)第一种:修改配置文件
    1. #1、spring.web:
    2. # 1.配置国际化的区域信息
    3. # 2.静态资源策略(开启、处理链、缓存)
    4. #开启静态资源映射规则
    5. spring.web.resources.add-mappings=true
    6. #设置缓存
    7. spring.web.resources.cache.period=3600
    8. ##缓存详细合并项控制,覆盖period配置:
    9. ## 浏览器第一次请求服务器,服务器告诉浏览器此资源缓存7200秒,7200秒以内的所有此资源访问不用发给服务器请求,7200秒以后发请求给服务器
    10. spring.web.resources.cache.cachecontrol.max-age=7200
    11. ## 共享缓存
    12. spring.web.resources.cache.cachecontrol.cache-public=true
    13. #使用资源 last-modified 时间,来对比服务器和浏览器的资源是否相同没有变化。相同返回 304
    14. spring.web.resources.cache.use-last-modified=true
    15. #自定义静态资源文件夹位置
    16. spring.web.resources.static-locations=classpath:/a/,classpath:/b/,classpath:/static/
    17. #2、 spring.mvc
    18. ## 2.1. 自定义webjars路径前缀
    19. spring.mvc.webjars-path-pattern=/wj/**
    20. ## 2.2. 静态资源访问路径前缀
    21. spring.mvc.static-path-pattern=/static/**
    • 2)第二种:代码方式
    • 容器中只要有一个 WebMvcConfigurer 组件。配置的底层行为都会生效
    • @EnableWebMvc,禁用boot的默认配置
    1. package org.example.boot.config;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.http.CacheControl;
    4. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    6. import java.util.concurrent.TimeUnit;
    7. @Configuration //这是一个配置类
    8. public class MyConfig implements WebMvcConfigurer {
    9. @Override
    10. public void addResourceHandlers(ResourceHandlerRegistry registry) {
    11. //保留以前规则
    12. //自己写新的规则。
    13. registry.addResourceHandler("/static/**") // 设置url路径
    14. .addResourceLocations("classpath:/a/","classpath:/b/") // 设置静态路径
    15. .setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS)); // 设置缓存控制策略
    16. }
    17. }

     使用@Bean加入重写的WebMvcConfigurer组件:

    1. @Configuration //这是一个配置类,给容器中放一个 WebMvcConfigurer 组件,就能自定义底层
    2. public class MyConfig /*implements WebMvcConfigurer*/ {
    3. @Bean
    4. public WebMvcConfigurer webMvcConfigurer(){
    5. return new WebMvcConfigurer() {
    6. @Override
    7. public void addResourceHandlers(ResourceHandlerRegistry registry) {
    8. registry.addResourceHandler("/static/**")
    9. .addResourceLocations("classpath:/a/", "classpath:/b/")
    10. .setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS));
    11. }
    12. };
    13. }
    14. }

    5. 路径匹配

    5.1 Ant风格路径用法

    Ant 风格的路径模式语法具有以下规则:

    • *:表示任意数量的字符。
    • ?:表示任意一个字符
    • **:表示任意数量的目录
    • {}:表示一个命名的模式占位符
    • []:表示字符集合,例如[a-z]表示小写字母。

    例如:

    • *.html 匹配任意名称,扩展名为.html的文件。
    • /folder1/*/*.java 匹配在folder1目录下的任意两级目录下的.java文件。
    • /folder2/**/*.jsp 匹配在folder2目录下任意目录深度的.jsp文件。
    • /{type}/{id}.html 匹配任意文件名为{id}.html,在任意命名的{type}目录下的文件。

    注意:Ant 风格的路径模式语法中的特殊字符需要转义,如:

    • 要匹配文件路径中的星号,则需要转义为\\*。
    • 要匹配文件路径中的问号,则需要转义为\\?。

    5.2 模式切换

    • 如果路径中间需要有 **,替换成ant风格路径 
    • @PathVariable 用于将 URI 模板中的变量部分绑定到方法的参数上。
    • @Slf4j 通过使用 @Slf4j 注解,开发者可以直接在类中使用 log 对象进行日志记录,而无需手动创建和初始化日志对象。

    使用ant_path_matcher路径风格:

    1. package org.example.boot.controller;
    2. import jakarta.servlet.http.HttpServletRequest;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.springframework.web.bind.annotation.GetMapping;
    5. import org.springframework.web.bind.annotation.PathVariable;
    6. import org.springframework.web.bind.annotation.RestController;
    7. @Slf4j
    8. @RestController
    9. public class MyController {
    10. @GetMapping("/a*/b?/{p1:[a-f]+}") // p1是一个占位符
    11. public String hello(HttpServletRequest req, @PathVariable String path){
    12. log.info("路径变量p1:{}", path);
    13. String url = req.getRequestURI();
    14. return url;
    15. }
    16. }

    更改配置文件: 

    1. # 改变路径匹配策略:
    2. # ant_path_matcher 老版策略;
    3. # path_pattern_parser 新版策略;
    4. spring.mvc.pathmatch.matching-strategy=ant_path_matcher

    补充:

     Servlet,SpringMVC视频推荐:53_尚硅谷_servlet3.0-简介&测试_哔哩哔哩_bilibili

    • HttpServlet 是Java Servlet API 的一个抽象类,用于处理来自客户端的HTTP请求并生成HTTP响应。开发人员可以通过继承HttpServlet类并重写其中的doGet()、doPost()等方法来处理特定的HTTP请求。
    • @WebServlet 是Java Servlet规范中的注解,用于标识一个Servlet类,并指定该Servlet处理的URL模式等配置信息。
    • @ServletComponentScan 是Spring Boot提供的注解,用于扫描并注册使用@WebServlet、@WebFilter和@WebListener注解标记的Servlet、Filter和Listener类。
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <a href="hello">helloa>
    9. body>
    10. html>
    1. package org.example.springmvc.servlet;
    2. import jakarta.servlet.ServletException;
    3. import jakarta.servlet.annotation.WebServlet;
    4. import jakarta.servlet.http.HttpServlet;
    5. import jakarta.servlet.http.HttpServletRequest;
    6. import jakarta.servlet.http.HttpServletResponse;
    7. import org.springframework.stereotype.Component;
    8. import java.io.IOException;
    9. @WebServlet("/hello")
    10. public class HelloServlet extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. resp.getWriter().write("hello....");
    14. }
    15. }

  • 相关阅读:
    java94-cpu随机调用线程测试
    【数据结构与算法】二叉树(下)
    第八章 防火墙技术与原理运用
    中职网络空间安全技能大赛
    DTSE Tech Talk | 第9期:EiPaaS驱动企业数字化转型
    编程语言理解3-目前主流的编程语言有哪些,分别的应用场景是什么
    [SQL]视图和权限
    前端框架海洋:如何破浪前行,寻找你的“黄金舟”
    ClickHouse进阶(十二):Clickhouse数据字典-2-字典类型
    Nginx几种负载均衡方式介绍
  • 原文地址:https://blog.csdn.net/qq_45981086/article/details/136697687