SpringBoot静态资源处理

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);
        }
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 狂神Spring Boot是一个基于Spring框架的开源web应用程序开发框架,它可以帮助开发者快速地构建可靠的、高效的web应用程序,同时提高开发效率和代码可维护性。其中,静态资源是指web应用中不经常变更的文件,如样式表、JavaScript、图像等文件。Spring Boot提供了方便的方式来处理静态资源,开发者只需要在项目的资源文件夹下创建一个名为“static”的文件夹,Spring Boot就会自动地将该文件夹下的所有静态资源映射到根路径上。 在使用狂神Spring Boot处理静态资源时,需要注意以下几点: 1. 静态资源应该放置在项目资源文件夹下的static文件夹下,Spring Boot会根据该文件夹的路径将静态资源映射到根路径上。 2. 静态资源的名称、路径和URL路径应该是小写的,中间用短横线(-)分隔,这样可以避免在不同操作系统上的兼容性问题。 3. 如果需要在静态资源的URL中包含版本号,可以使用Spring Boot提供的方式自动生成版本号,具体可以参考官方文档。 4. Spring Boot还提供了对缓存控制的支持,开发者可以通过配置文件来设置静态资源的缓存时间,以达到更好的性能和用户体验。 总之,狂神Spring Boot提供了便捷的方式来处理静态资源,开发者只需要了解一些基本的规则和注意事项,就可以轻松地实现web应用中的静态资源的管理和控制。 ### 回答2: Spring Boot是一种 Java 框架,可让您快速构建基于 Java 的应用程序。它支持多种特性和功能,其中之一就是处理静态资源Spring Boot静态资源包括图像、CSS、JavaScript、HTML文件等。这些资源可以通过 HTTP 服务向客户端提供。在Spring Boot应用程序中,您可以使用@Controller和@RestController注解来暴露这些静态资源。 要配置Spring Boot应用程序来处理静态资源,您需要添加以下配置文件: - application.properties或application.yml文件 在这个配置文件中,您需要定义静态资源的位置和路径。例如,您可以使用如下代码片段定义一个资源路径: spring.resources.static-locations=classpath:/static/ 这将指向位于Classpath /static/目录中的静态资源。 另外,您可以使用以下注解来配置控制器来处理静态资源: - @Controller - @RestController 如果您想以 JSON 格式返回静态数据,可以使用@RestController注解。实际上,@RestController注解是@Controller注解和@ResponseBody注解的组合。 总之,Spring Boot框架为开发人员提供了全面的静态资源处理功能,您可以轻松地定义静态资源并用于您的应用程序或网站中。 ### 回答3: 狂神SpringBoot静态资源是指在SpringBoot框架下,可以通过配置一些静态资源来搭建网站的功能。这些静态资源可以是网站的图片、CSS样式、JavaScript代码等,通过SpringBoot的自动配置功能可以轻松地将这些资源添加到项目中,并对其进行管理和维护。 在SpringBoot中,我们可以将静态资源放置在/src/main/resources/static/目录下。这样,当我们启动应用时,SpringBoot会自动扫描该目录下的文件,并将其配置成静态资源。此外,我们还可以通过自定义资源处理器来添加自己的静态资源,并对其进行定制。 SpringBoot还提供了一些方便的注解来管理静态资源。例如,@RestController注解可以将一个类标记为RESTful服务,@RequestMapping注解则可以将URL映射到对应的控制器方法上。此外,@PostMapping、@GetMapping等注解也可以直接映射到对应的请求方法上。 总之,狂神SpringBoot静态资源为开发者提供了一种方便、快捷、灵活的方式来管理和配置网站的静态资源。无论是开发小型网站还是大型网站,都可以通过这种方式轻松地搭建出适合自己的网站。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值