SpringBoot-Web开发-静态资源管理

目录

一、相关功能

1.1 静态资源访问

1.2 欢迎页

1.3 自定义Favicon

二、静态资源配置原理

一、相关功能

1.1 静态资源访问

        只要静态资源放在类路径下:

         /static or /public or /resources or /META-INF/resources

        我们可以在地址栏直接访问: 当前项目根路径/ + 静态资源名

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

#这是默认的访问路径-/**
spring:
  mvc:
    static-path-pattern: /**

#我们可以自定义访问路径:
spring:
  mvc:
    static-path-pattern: /res/**
#也可以进一步指定静态资源的类路径
  resources:
     static-locations: [classpath:/myRes/, ... ]

1.2 欢迎页

  • 就是静态资源路径下的 index.html
  • 一旦配置了静态资源访问前缀,就会导致index.html不能被默认访问!只能用Controller处理。

1.3 自定义Favicon

  •  就是网页图标,只需把favicon.ico 放在静态资源目录下即可。
  •   同样的,一旦配置了静态资源访问前缀,就会导致Favicon失效!

二、静态资源配置原理

  • SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类)
  • SpringMVC功能的自动配置类 WebMvcAutoConfiguration生效
	@Configuration(proxyBeanMethods = false)
	@Import(EnableWebMvcConfiguration.class)
	@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
	@Order(0)
	public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {}
  • WebMvcAutoConfiguration中配了 WebMvcProperties、 ResourceProperties,分别与spring.mvcspring.resources配置文件属性进行绑定。
  • 这个配置类中只有一个有参构造器,所有参数都会从容器中确定
public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebMvcProperties mvcProperties,
				ListableBeanFactory beanFactory, ObjectProvider messageConvertersProvider,
				ObjectProvider resourceHandlerRegistrationCustomizerProvider,
				ObjectProvider dispatcherServletPath,
				ObjectProvider> servletRegistrations) {
			this.resourceProperties = resourceProperties;
			this.mvcProperties = mvcProperties;
			this.beanFactory = beanFactory;
			this.messageConvertersProvider = messageConvertersProvider;
			this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
			this.dispatcherServletPath = dispatcherServletPath;
			this.servletRegistrations = servletRegistrations;
		}
  • WebMvcAutoConfiguration 中有专门处理静态资源的方法addResourceHandlers
@Override
		public void addResourceHandlers(ResourceHandlerRegistry registry) {
            //是否开启了静态资源的规则(默认开启)
			if (!this.resourceProperties.isAddMappings()) {
				logger.debug("Default resource handling disabled");
				return;
			}
			Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
			CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
			//webjars的规则
            if (!registry.hasMappingForPattern("/webjars/**")) {
				customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
						.addResourceLocations("classpath:/META-INF/resources/webjars/")
						.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
			}
            
            //普通静态资源的访问(配子默认的资源路径)
			String staticPathPattern = this.mvcProperties.getStaticPathPattern();
			if (!registry.hasMappingForPattern(staticPathPattern)) {
				customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
						.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
						.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
			}
		}
  • 欢迎页的处理:
//HandlerMapping:处理器映射。保存了每一个Handler能处理哪些请求。	
	    @Bean
		public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
				FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
			WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
					new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
					this.mvcProperties.getStaticPathPattern());
			welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
			welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
			return welcomePageHandlerMapping;
		}
	WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,
			ApplicationContext applicationContext, Optional welcomePage, String staticPathPattern) {
		if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {

            //1.要用欢迎页功能,必须是/**
			logger.info("Adding welcome page: " + welcomePage.get());
			setRootViewName("forward:index.html");
		}
		else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {

            //2.调用Controller  /index
			logger.info("Adding welcome page template: index");
			setRootViewName("index");
		}
	}

你可能感兴趣的:(SpringBoot,java,spring,spring,boot)