深入理解springboot构建web项目

写在前面

本文是基于Spring boot 1.5.21版本 ;

问题是来源于一个简单的spring boot 项目。参照spring boot 文档部署的web 项目,本身在访问静态资源按照默认配置访问即可,是不会有什么问题的。但我没有注意到的是 这个spring boot 项目集成了 swagger ,这就导致它重写了 spring 的默认配置。

问题的解决方法 ,非常简单,可对于spring boot 部署web项目的真正处理逻辑,还是不明觉厉啊。所以特查找了资料写下此文,防止以后再入坑。

如果你只是想寻找答案,此文可能不适合你额 …


spring boot 部署 web 应用程序 之 静态内容

默认情况下,spring boot 提供的静态内容来自于类路径下的 /static ( or /public or /resources or /META-INF/resources ) 目录,或者来自于 ServletContext 的根目录。

  1. 如果你想使用自己的目录来提供静态内容,可以使用 来自 Spring MVC 的 ResourceHttpRequestHandler , 通过添加你自己的WebMvcConfigurerAdapter 并 重载 addResourceHandlers 方法。

​ swagger 的配置便是如此:

@Configuration
@EnableSwagger2
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("swagger-ui.html**")
               .addResourceLocations("classpath:/META-INF/resources/");
       registry.addResourceHandler("/webjars/**")
               .addResourceLocations("classpath:/META-INF/resources/webjars/");
       // 这里是我解决“写在前面“所遇见的问题
       registry.addResourceHandler("/**")
               .addResourceLocations("classpath:/static/");
   }

   @Bean
   public Docket buildDocket() {
       return new Docket(DocumentationType.SWAGGER_2)
               .apiInfo(buildApiInf())
               .select()
               //controller路径
               .apis(RequestHandlerSelectors.basePackage("com"))
               .paths(PathSelectors.any())
               .build();
   }

   private ApiInfo buildApiInf() {
       return new ApiInfoBuilder()
               .title("接口列表")
               .termsOfServiceUrl("http://127.0.0.1:8080/swagger-ui.html")
               .description("springmvc swagger 接口测试")
               .version("1.0.0")
               .build();
   }
}

 灵魂疑问:ResourceHttpRequestHandlerWebMvcConfigurerAdapter` 的关系是什么?


  1. 在独立的web 程序中, 默认的 容器里的默认的 servlet 已经被启用,充当预备计划。也就是说当 Spring 不能够处理时,将提供来自 ServletContext 根目录下的内容。这种情况不会经常发生,除非你修改了默认的 MVC 配置。Spring MVC 总是能够通过 DispatcherServlet 处理请求。

    注:默认 Servlet 是配置在 $catalina/conf/web.xml 里的。当未匹配到任何的 servlet 时, 就会由默认的 servlet 处理; ServletContext 根目录对应WebRoot ()


  1. 默认情况下, 资源映射在 /** 上,但是可以通过 spring.mvc.static-path-pattern对其进行调优,例如,将所有资源重新定位到 /resources/** 下:

spring.mvc.static-path-pattern=/resources/**

也可以自定义资源路径,通过使用 spring.resources.static-locations (这将替代默认的路径)。这和1中所提的重载 addResourceHandlers 所起的作用是一样的(当重载 addResourceHandlers,当前的这种配置不生效 )。


除了上面的“标准”静态资源位置之外,webjar内容还有一个特殊的情况。如果以webjar格式打包,那么/webjars/**中有路径的任何资源都将从jar文件中提供。(参考 swagger 配置)

注:如果您的应用程序将打包为jar,那么不要使用src/main/webapp目录。虽然这个目录是一个通用的标准,但是它只适用于war打包,如果您生成一个jar,那么大多数构建工具都会忽略它。


更多高级功能,参考推荐博文中的官方文档。


挖的深度还是浅了点,后续再补充


推荐博文


https://docs.spring.io/spring-boot/docs/1.5.21.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-static-content spring 官方文档


参考博文


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值