1、web开发探究
回忆前面学过的使用SpringBoot的步骤:
1、创建一个SpringBoot应用,选择我们需要的模块,SpringBoot就会默认将我们的需要的模块自动配置好;
2、手动在配置文件中配置部分配置项目就可以运行起来了;
3、专注编写业务代码,不需要考虑以前那样一大堆的配置了。
其中最关键的是:
1、向容器中自动配置组件 :XXXAutoconfiguration
2、自动配置类,封装配置文件的内容:XXXProperties
当要搞什么应用时,就去找对应的XXXAutoconfiguration
和XXXProperties
,就知道怎么配置了。
2、静态资源处理
写请求非常简单,那我们要引入我们前端资源,我们项目中有许多的静态资源,比如css,js等文件,这个SpringBoot怎么处理呢?
如果我们是一个web应用,我们的main下会有一个webapp,我们以前都是将所有的页面导在这里面的,对吧!但是我们现在的pom呢,打包方式是为jar的方式,那么这种方式SpringBoot能不能来给我们写页面呢?当然是可以的,但是SpringBoot对于静态资源放置的位置,是有规定的!
跟着我思路,现在我是要知道如何放置静态资源(html\js\css等),那么我肯定是要开发web应用,这些静态资源属于表现层的东西,那么我要找的就是MVC相关的Autoconfiguration。
打开spring.factories,看里面有没有跟MVC相关的自动配置类,果然有!
进入这个类,可以看到这个方法:
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
if (!registry.hasMappingForPattern("/webjars/**")) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
}
2.1 webjar
上面方法就定义了SpringBoot的静态资源的映射规则,读一下上面的源码,比如第8行意思是如果静态资源是以webjar
的形式,那么静态资源就可以放在classpath:/META-INF/resources/webjars/
。
那什么是webjar
形式的静态资源呢?其实就是把html\js\css等这些静态资源打包成jar包。
举个例子,我们访问https://www.webjars.org,从里面找一个静态资源:
然后我们把这个webjar
放到我们的pom.xml中:
可以看出,这个jar包的静态资源路径和上面那个方法中的classpath:/META-INF/resources/webjars/
是一致的。
启动应用,浏览器来访问一下:
成功访问静态资源。
2.2 默认路径
那要是我们自己的静态资源又该如何导入呢?其实就是方法里面的另一个if了:
因为太长了截图不全,大家可以看源码。这个长长的一行里面调用了this.resourceProperties.getStaticLocations()
方法,点进去看这个getStaticLocations()
:
原来默认的静态资源路径是CLASSPATH_RESOURCE_LOCATIONS
这个字符串数组保存的:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS =
new String[]{"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"};
所以WebMVC相关的配置类ResourceProperties
中可以设置静态资源的有关参数,上面四个类路径指向了SpringBoot会去寻找的资源文件夹。
我们一个个来试试,创建四个静态资源文件分别放在上面的四个类路径:
测试结果:
注意:classpath:/resources/
不是直接放在工程的resources目录下,而是要在这个目录下再创建一级名字叫做resources的目录。
2.3 自定义路径
除了这四个默认路径,我们可以设置自己喜欢的路径。回忆配置文件的原理,我们直接打开application.yaml。然后设置一下我想要的路径:
application.yaml:
spring:
resources:
static-locations: classpath:/MyStaticFiles/
测试访问:
这个时候我们再访问之前的file01.html、file02.html、file03.html和file04.html。除了file01.html,其他的都访问不到了。
一旦自己定义了静态文件夹的路径,原来的自动配置就都会失效了!(classpath:/META-INF/resources/
却除外,可能是其他地方有配置它。)
因此,要么使用默认路径,要么使用自定义路径,千万不要即自定义,然后又放到默认路径下,容易出问题。
3、默认首页
回忆之前学SpringMVC的时候,会有默认的首页。那么在SpringBoot中有没有呢,答案是肯定的!
还是刚才那个WebMVC的自动配置类,里面有一个方法:
分析:
1、首先是有个welcomePageHandlerMapping
方法是设置欢迎页面的;
2、方法里调用了this.getWelcomePage()
方法;
3、this.getWelcomePage()
方法调用了getIndexHtml()
方法;
4、getIndexHtml()
方法返回resourceLoader.getResource(location + "index.html")
可以知道WebMVC应用开启后,会去location
里找index.html
,而这个location
又是谁呢?
继续挖掘这个location
:
居然又见到这个resourceProperties.getStaticLocations()
,继续点它就可以看到熟悉的一幕:
其实就是那四个默认路径。
原来!SpringBoot启动后,会去这四个默认路径找index.html的文件,空的SpringBoot的web工程就是因为没有index.html,所以启动后才会报以下错误:
我们随便在四个默认路径放一个index.html:
然后再重启服务:
一种茅塞顿开的感觉!