springboot处理Web静态资源
以前的JavaWeb/maven(war形式)项目都是把静态资源放在webapps/WebContent目录下,然后把JavaWeb项目打包成war包,那现在的springboot都是jar包形式,那么静态资源放在哪里?
springboot通过WebMvcAutoConfiguration类可以知道默认的静态资源路径 以及 指定静态资源的存放路径,接下来进入WebMvcAutoConfiguration类,去了解静态资源默认的存放路径和手动配置静态资源路径的两种方式。
静态资源默认路径
静态资源默认路径分为两种,第一种是以webjars目录结构类似的默认路径,第二种是springboot默认指定的静态资源存放路径。
第一种webjars目录结构是通过WebMvcAutoConfiguration类中的addResourceHandlers()方法指定: /webjars/**,如下图:
webjars是一个静态资源打包成jar包的形式(比如:jquery/boostrap这些框架,封装成了jar包),也就是依赖,可以去webjars官网看看。
然后进行测试webjars,是否能够符合springboot的 第一种默认资源路径,而且可以访问到,如下图:
可以发现添加了jquery依赖后,会自动下载jar包,而且jar包的目录结构,符合springboot通过WebMvcAutoConfiguration类中的addResourceHandlers()方法指定的 :"classpath:/META-INF/resources/webjars/" 路径,所以可以直接通过/webjars/**路径去访问该静态资源,第一种webjars目录结构是可以访问成功的,如下图:
但是我们自己写的静态资源,目录结构肯定不是webjars这样的结构,那么这些静态资源该怎么访问到呢,而且应该放哪里,接下来就 继续深入WebMvcAutoConfiguration类,去寻找 第二种springboot默认指定的静态资源路径。
第二种springboot默认指定的静态资源路径,还是在WebMvcAutoConfiguration类中,可以找到声明的默认静态资源路径,如下图:
还是在addResourceHandlers()方法中可以发现,resourceProperties类调用了getStaticLocations()方法,看这个方法的名称就知道是获取静态资源路径了,可知道resourceProperties类存储着springboot默认指定的静态资源路径,再次进入到resourceProperties类中,查看源码,如下图:
可以发现springboot默认指定的静态资源路径一共有4个路径,分别是:
classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"
classpath:就是类路径,程序能识别的路径,一般文件夹有这种图标
(这是idea版的图标)就是classpath路径。
而且springboot默认创建项目就有了static文件夹,如下图:
这里的resources有了类路径的图标(代表 resource 就是 classpath路径),所以底下的static路径就是springboot默认的静态资源路径,或者自己在resource目录下创建一个public文件夹,在里面也是可以存放静态资源的,创建的文件夹位置和名字必须符合springboot声明的静态资源路径一致。
注意: 在springboot默认指定的静态资源路径 存放资源文件后,访问时 不需要加默认的静态资源路径前缀,直接访问即可,如下图:
额外:我们访问springboot项目时,如果直接访问localhost,会显示如下图:
很明显springboot默认是没有欢迎页面的,但是我们可以自定义欢迎页面,欢迎页面的设置也是在WebMvcAutoConfiguration类中可以找到,如下图:
可以发现welcomePageHandlerMapping()方法调用了 getWelcomePage()方法,从该方法名就可以知道,该方法是获取欢迎页面的,接下来进入getWelcomePage()方法内继续查看,如下图:
可以发现getWelcomePage()还继续调用了getIndexHtml()方法,从上图可以看到该方法体内,拼接了 location 和 index.html,一般主页都是采用index.html来命名,而可以推测出location应该是存放主页的位置,而当前的location是一个变量,所以得看回getWelcomePage()方法,因为是这个方法传递的location变量,上图有getWelcomePage()方法,上图的435行代码就可以猜到getIndexHtml()方法的location就是springboot默认的静态资源路径,因为getResourceLocations()方法就是返回springboot默认的静态资源路径。
String[] locations = getResourceLocations(this.resourceProperties.getStaticLocations());
所以可以知道,只要在默认的静态资源路径存放一个名为:index.html的文件,访问localhost时,就会默认访问index.html这个主页,接下来,我测试一下,如下图:
可以发现测试成功,访问localhost时,会自动访问index.html页面。
自定义默认静态资源路径
除了可以把文件放在默认的静态资源路径之外,还可以自定义默认的静态资源路径,配置自定义静态资源目录,当然得在全局配置文件中配置(properties/yml)。
spring.resources.static-locations=classpath:/res/,classpath:/test/
可以配置多个路径,注意:只要配置spring.resources.static-locations属性,那么以前默认的静态资源路径就失效了,测试一下,如下图:
配置过默认的静态资源路径后,默认的static静态资源路径就失效了。
上面配置了res路径为静态资源路径,再测试一下,配置是否生效了,如下图:
可以发现,默认的静态资源路径配置已经生效了。
The end.