1.静态资源访问
1.静态资源目录
只要静态资源放在类路径下的/static或者/public或者/resources或者META-INF/resources目录下,就可以通过项目根路径/+静态资源名访问。
原理:静态映射/** (项目路径下的所有)
请求进来先找Controller看能不能处理,不能处理的所有请求就交给静态资源处理器,静态资源也找不到就返回404.
2.静态资源访问前缀:默认无前缀/**
可以使用配置文件配置,application.yaml
spring: mvc: static-path-pattern: /res/** //表示访问项目根路径/res+静态资源名
3.改变静态默认静态资源目录:
spring: mvc: static-path-pattern: /res/** resources: static-locations: classpath:/haha //表示使用类路径下的haha文件夹作为静态资源目录
其他:webjars(了解) https://www.webjars.org/
把静态资源作为jar包导入,访问项目路径+对应jar包的目录。
2.欢迎页
静态资源路径下的index.html
- 可以配置静态资源路径
- 但是不可以配置静态资源访问前缀,否则index.html不能被默认访问
3.favicon.icon小图标
静态资源路径下的favicon.icon会自动被作为小图标
- 但是不可以配置静态资源访问前缀,否则index.html不能被默认访问
静态资源配置原理(未完善)
- springboot启动默认加载xxxautoconfihuration配置类(自动配置)
- springMvc功能的自动配置类WebMvcAutoConfiguration,
@Configuration(proxyBeanMethods = false) @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) //定制化配置相关 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration {
- 给容器中配了什么
@Configuration(proxyBeanMethods = false) @Import(EnableWebMvcConfiguration.class) @EnableConfigurationProperties({ WebMvcProperties.class, org.springframework.boot.autoconfigure.web.ResourceProperties.class, WebProperties.class }) @Order(0) public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
- 配置文件和相关属性进行了配置绑定WebMvcProperties.class=spring.mvc ,ResourceProperties.class=spring.resources,WebProperties.class=spring.web
配置类只有一个有参构造器,那么有参构造器中的值都会去容器中找
public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties, ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider, ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider, ObjectProvider<DispatcherServletPath> dispatcherServletPath, ObjectProvider<ServletRegistrationBean<?>> servletRegistrations)