1. 静态资源
静态资源目录:
只要静态资源放在类路径下:called/static(or/public or/resources or /META-INF/resources)
访问:当前项目根路径/ + 静态资源名
原理:静态映射/**,处理所有请求。
请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源找不到的话就会报404.
改变默认的静态资源路径:
spring: web: resources: static-locations: [classpath:/haha/]
静态资源访问前缀:
默认无前缀
spring: mvc: static-path-pattern: /res/**
静态资源访问路径:当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找
静态资源配置原理
-
SpringBoot启动默认加载 XXXAutoConfiguration类(自动配置类)
-
SpringMVC功能的自动配置类 WeMvcAutoConfiguration,生效
@AutoConfiguration(after = { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class }) @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
-
容器中配置了
@Configuration(proxyBeanMethods = false) @Import(EnableWebMvcConfiguration.class) @EnableConfigurationProperties({ WebMvcProperties.class, WebProperties.class }) @Order(0) public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {}
-
配置文件的相关属性和xxx进行了绑定。WebMvcProperties == spring.mvc、WebProperties == spring.web.resources
-
配置类只有一个有参构造器
// 有参构造器的所有参数的值都会从容器中确定 // WebProperties webProperties:获取和spring.resources绑定的所有的值的对象 // WebMvcProperties mvcProperties:获取和spring.mvc绑定的所有的值的对象 // ListableBeanFactory beanFactory:spring的beanFactory // HttpMessageConverters:找到所有的HttpMessageConverters // ResourceHandlerRegistrationCustomizer 找到资源处理器的自定义器。==== // DispatcherServletPath:处理的路径 // ServletRegistrationBean 给应用注册Servlet、Filter... public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties, ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider, ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider, ObjectProvider<DispatcherServletPath> dispatcherServletPath, ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) { this.resourceProperties = webProperties.getResources(); this.mvcProperties = mvcProperties; this.beanFactory = beanFactory; this.messageConvertersProvider = messageConvertersProvider; this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable(); this.dispatcherServletPath = dispatcherServletPath; this.servletRegistrations = servletRegistrations; this.mvcProperties.checkConfiguration(); }
资源处理的默认规则
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 如果addMapping的值为false,所有的静态资源配置都失效 if (!this.resourceProperties.isAddMappings()) { logger.debug("Default resource handling disabled"); return; } // 注册静态资源访问路径 addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/"); addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> { registration.addResourceLocations(this.resourceProperties.getStaticLocations()); if (this.servletContext != null) { ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION); registration.addResourceLocations(resource); } }); }
web: resources: static-locations: classpath:// add-mappings: false // 禁用所有静态资源规则public static class Resources { private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" };
处理器映射
HandlerMapping:处理器映射。保存了每一个Handler能处理哪些请求。 // 欢迎页处理器映射 @Bean public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) { return createWelcomePageHandlerMapping(applicationContext, mvcConversionService, mvcResourceUrlProvider, WelcomePageHandlerMapping::new); }