SpringBoot学习目录
1. SpringBoot中静态资源的映射规则
在之前的普通Web项目中,静态资源一般是存放在web目录下,但是在SpringBoot中并没有web目录,那么那些静态的资源应该放在哪里呢?
所有的与静态资源访问位置相关的都可以到
WebMvcAutoConfiguration
这个类里面去看源码;因为SpringMVC的相关配置都在这里;
//这个方法主要就是用来配置映射资源的路径;
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//isAddMappings方法中addMappings默认是true,所以一般这个方法可能不执行;(ResourceProperties类中)
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");//通过日志输出提示;
return;
}
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
//大致就是资源如果还没有映射到具体工程路径就添加
//addResourceLocations里的路径;这就是webjars映射在哪里找资源;
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
/*这里是将WebMvcProperties类中的staticPathPattern
值"/**"放进来;
*/
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
/*这里判断的是映射路径为"\**"的地址,在WebMvcProperties中有的这个参数默认值是上面那个;
后面继续介绍;第2点
*/
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
- 通过webjars将静态资源打包成jar,然后引入;(这样的话就可以直接访问webjars下的包);
比如:在webjars中通过Maven依赖放入
在maven的依赖目录下就会出现这一个webjars目录;而SpringBoot就可以访问这个目录下面的静态文件;
所以服务器上路径/webjars/**
请求(比如:http://localhost:8080/webjars/jquery/3.5.0/jquery.js),这样就可以取到3.5.0包下的jquery.js文件;
- 除此之外,ResourceProperties类里面还定义了这么几种路径(有些没有的可以自己创建);
上面的这些路径就是"**"所映射的默认资源路径,分别是"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"
,因此这几个目录下也可以存放静态资源。(上面的源码是addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()
这个方法添加的资源路径); - 还有一个静态资源的存放目录是在"",也就是项目的根路径;
- 具体操作后的位置图片;
2. SpringBoot的欢迎界面(index.html)
SpringBoot中一直有一个界面,那个界面在一开始就是存在的;
@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;
}
//映射到的具体路径;
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");
}
看了一下源码map(this::getIndexHtml)
就类似与一个<a>指令,进行跳转,后面还加了个过滤器,存在跳转,不存在就返回空,然后存现错误界面;由此给出结论,只需要将自己写的index.html放在上面的静态资源路径下,那么SpringBoot就会自己去读取;
还有并非一味的看源码,只是说能通过源码将获得的结论记忆的更加深刻罢了;刻意看真的没必要,至少现在是没必要的;
3. 如何修改Spring网页的网站图标
这个图标说法,可能不是很清晰,看图;
所指的图标就是上面那个;
在SpringBoot中2.3.3版本的时候基本上只能通过<link>标签进行载入;
<link rel="icon" href="/static/favicon.ico"/>
这个换图标的问题,在chrome浏览器不行,不能显示;后来尝试了一下ctrl+F5刷新,好家伙,还是可以用的;
4. 如何自定义静态资源路径
了解了系统默认的静态资源的存放路径,这里还是要了解一下:
spring.resources.static-locations=classpath:/hello/
这里面还是有一些注意点的,在这里表明一下,更换静态资源的存放地址,一旦设置,那么
系统默认的就无效
了,这和构造方法的使用有着异曲同工之妙(创建了有参构造,默认的无参构造就无效了,必须要重新创建无参构造);还有就是这是一个数组,由此可以放许多的路径,通过逗号隔开;