创建springboot项目自动导入web应用时,会自动导入WebMvcAutoConfiguration(在autoconfigure.jar中找到),其中有个添加静态资源的方法addResourceHandlers,代码如下
如果我们以jar包的形式导入静态资源,所有/webjars/**请求,都去classpath:/META-INF/resources/webjars/下找资源,以jquery为例,导入jquery jar包,导入后可以查看依赖jar包的目录
可以看到目录为META-INF/resources/webjars/jquery,我们启动项目后输入http://localhost:8080/webjars/jquery/3.3.1/jquery.js可以访问到jquery.js文件
下面讲解一下以静态资源文件夹的映射处理,查看添加文件路径方法传入的参数this.resourceProperties.getStaticLocations(),深入探索发现staticLocations是四个路径位置,如下
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
也就是说只要把静态资源放在这几个目录下,这些就是静态资源文件夹,都可以访问到,比如输入localhost:8080/abc === 去静态资源文件夹里面找abc,这里/就是类路径的根目录,就是项目中的resources目录
该类中还有个方法welcomePageHandlerMapping,是映射欢迎页面的,我们查看其中代码
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(getInterceptors());
return welcomePageHandlerMapping;
}
private Optional<Resource> getWelcomePage() {
String[] locations = getResourceLocations(this.resourceProperties.getStaticLocations());
return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();
}
private Resource getIndexHtml(String location) {
return this.resourceLoader.getResource(location + "index.html");
}
通过探索方法getWelcomePage()可以看出,最后返回的是静态资源文件夹下任何一个位置的index.html,所以只要文件名称是这个,就是项目的欢迎页面
该类中还有个映射网址栏图标favicon.ico路径的方法faviconHandlerMapping,代码如下
public SimpleUrlHandlerMapping faviconHandlerMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
mapping.setUrlMap(Collections.singletonMap("**/favicon.ico", faviconRequestHandler()));
return mapping;
}
从代码中可以看出不管是任何请求,都会去找静态资源文件夹下任何一个位置的的favicon.ico,这样网址栏图标就可以切换了