SpringBoot学习---web开发springMvc分析

Web 开发的核心内容主要包括嵌入的 Servlet 容器和 SpringMVC。
开发文档:

Web开发支持

Spring Boot Web 开发提供了 spring-boot-starter-web 启动器作为基本支持,为我们提供了嵌入的 Tomcat
以及 Spring MVC 的依赖支持。(参考: pom.xml
这是spring-boot-starter-web依赖中的。
SpringBoot提供了很多不同场景的自动配置类,让我们只需要在配置文件中指定少量的配置即可启动项目。自动配置
类存储在 spring-boot-autoconfifigure.jar org.springframework.boot.autoconfifigure 包下。
自动配置类举例:
 
1 xxxxAutoConfifiguration :向容器中添加自动配置组件。
2 xxxxProperties :使用自动配置类 来封装 配置文件的内容。
 
SpringMVC 配置 WebMvcAutoConfifiguration WebMvcProperties
内嵌 Servlet 容器 ServletWebServerFactoryAutoConfifiguration ServerProperties
 

静态资源的映射规则

项目中的静态资源映射规则,可通过分析 WebMvcAutoConfifiguration 自动配置类得到。

webjars 资源映射

WebMvcAuotConfifiguration.addResourceHandlers() 分析webjars 资源映射 。

  • 可以看到如果请求是/webjars/**,就classpath:/META-INF/resources/webjars/ 目录找对应资源文件。
  • 你可以以jar包的方式引入静态资源,webjars官网https://www.webjars.org/。
  • 在官网打开资源文件的依赖配置信息,然后粘贴到 pom.xml 中。
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>
 

其他静态资源映射

 点进去可以发现:

 
 
 
于是我们发现,/**的静态映射会找以上四个文件夹。
 
总结 :
当接受到 /** 请求访问资源时 , 会被映射到下面 4 个 类路径下的静态资源目录中查找。
例如:
访问 localhost:8080/style.css 会在上面四个静态资源路径 中查找文件。

欢迎页映射

WebMvcAuotConfifiguration.welcomePageHandlerMapping() 分析 欢迎页映射

 
在此我们发现,查找的路径是,那四个静态资源路径加 “/”路径。
分析后 , 会从 4 个静态资源目录 + 根路径 / 中 查找 index.html 页面
  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/
  • /: 当前项目根路径下

会在 静态资源目录下 与 根路径查找 (按该顺序) index.html页面; 收到 "/**" 请求映射。

访问 localhost:8080/ 会在上面 5 个目录中查找 index.html 页面 ( 因为 / 也属于 /** )。

图标映射

Spring Boot 会在静态资源目录下 与 根路径 ( 按该顺序 ) 查找 faicon.ico 页面;
如果存在这样的文件, Spring Boot 会自动将其设置为应用图标。同上。
  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/
  • /: 当前项目根路径下

springboot热部署

  • Spring Boot 开发环境下禁用模板缓存
#开发环境下关闭thymeleaf模板缓存,thymeleaf默认是开启状态
spring.thymeleaf.cache=false
  • 添加 Spring Boot Devtools 热部署依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
  • Intellij IEDAEclipse不同,Intellij IDEA必须做一些小调整: Eclipse 中,修改文件后要手动进行保存,它就会自动编译,就触发热部署现象。 Intellij IEDA 中,修改文件后都是自动保存,默认不会自动编译文件, 需要手动编译按 Ctrl + F9 推荐使用Build -> Build Project ;

分析 SpringMVC 自动配置

Spring Boot Spring MVC 提供了适用于多数应用的自动配置功能( WebMvcAutoConfifiguration )。
Spring 默认基础上,自动配置添加了以下特性:
 
引入ContentNegotiatingViewResolver 和 BeanNameViewResolver    beans.
自动配置了视图解析器 ViewResolver (根据方法返回值获取视图对象 View ,视图对象决定如何渲染?重定向Or 转发)
ContentNegotiatingViewResolver : 组合所有的视图解析器的(通过源码可分析出)
 
 

 

自定义视图解析器:可以 @Bean 向容器中添加一个我们自定义的视图解析器,即可被容器管理使用
public class MyViewResolver implements ViewResolver {
    @Override
    public View resolveViewName(String viewName, Locale locale) throws Exception {
        return null;
    }
}
@Configuration
public class MyConfiguration {

    @Bean
    public ViewResolver myViewSolver() {
        System.out.println("自定义视图解析器!");
        return new MyViewResolver();
    }

}

也可从容器获取视图解析器代码处打断点看的更准确。

其他比如:

  • Converter:转换器; 如: 文本类型转换目标类型, true boolean类。
  • GenericConverter:转换器,Spring内部在注册时,会将Converter先转换为GenericConverter之后再统一对GenericConverter注册。
  • Formatter:格式化器;如: 2017/12/17 格式化 Date类型。
  • HttpMessageConverters 的支持。SpringMVC 用它来转换Http请求和响应的;User _json User _xml可以通过@Bean向容器中添加一个我们自定义 HttpMessageConverters ,即可被容器管理使用。
  • 自动注册 MessageCodesResolver 。 定义错误代码生成规则。
  • 自动注册 ConfifigurableWebBindingInitializer 。初始化所有 Web数据绑定器 对象, 比如 请求数据 ——JavaBean
  • 对静态资源的支持,包括对 Webjars 的支持。
  • 对静态首页 index.html 的支持。
  • 对 自定义 Favicon 图标的支持。

详细内容可以参考官方文档:

https://docs.spring.io/spring-boot/docs/2.1.14.RELEASE/reference/htmlsingle/#boot-features-spring-mvc-message-converters

扩展 SpringMVC 功能

如果想保留 Spring Boot MVC 的特性,而且还想扩展新的功能(拦截器 , 格式化器 , 视图控制器等),你可以在你自
定义的 WebMvcConfifigurer 类上增加 @Confifiguration 注解。
首先我们看一看扩展功能:
@Configuration
public class MySpringMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 发送/login来到login.html页面
        registry.addViewController("/login").setViewName("login");
    }
}

分析:

点进去

点进去

全面控制 SpringMVC

如果你想全面控制 SpringMVC (也就是不使用默认配置功能) , 你在自定义的 Web 配置类上添加 @Confifiguration
@EnableWebMvc 注解。
 
为什么添加了@EnableWebMvc 就能完全接管?
分析:
 

 这个注解意思是容器里面没有WebMvcConfigurationSupport组件的时候,WebMvcAutoConfiguration类才生效。

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

那么逻辑就清晰了,我们自己写的配置类,如果加入@EnableWebMvc注解,就意味着我们自己写的就是WebMvcConfigurationSupport组件,springboot检查到我们写了WebMvcConfigurationSupport组件,就不在有WebMvcAutoConfiguration的自动配置了。

总结 SpringMVC 配置

  • Spring Boot中自已配置组件的时候,先看容器中有没有公司自已配置的(@Bean@Component,如果有就用公司自已配置的; 如果没有,才自动配置。
  • Spring Boot中会有非常多的xxxConfifigurer帮助我们进行扩展配置。
  • Spring Boot中会有很多的xxxCustomizer帮助我们进行定制配置。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值