文章目录
通过看 WebMvcAutoConfiguration
这个类
直观看到 SpringBoot 怎么映射 静态资源的
# 总览
扫一眼 WebMvcAutoConfiguration 里面 跟 Resource 相关的方法、属性有:
static String[] getResourceLocations(String[] staticLocations) {
- 内部类
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
下的
private final ResourceProperties resourceProperties;
<mark>资源配置类</mark>final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
public InternalResourceViewResolver defaultViewResolver() {
<mark>惊不惊喜?⇒ springmvc最常用的视图解析器 ⇒ 处理前缀/后缀</mark>public void addResourceHandlers(ResourceHandlerRegistry registry) {
private void customizeResourceHandlerRegistration(ResourceHandlerRegistration registration) {
- 内部类
public static class FaviconConfiguration implements ResourceLoaderAware {
下的 (套娃啊。。)
<mark>这个很明显是 处理 “图标” 静态资源的</mark>【2.2.2以后,这里去掉了】
private final ResourceProperties resourceProperties;
private ResourceLoader resourceLoader;
- 内部类
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {
private final ResourceProperties resourceProperties;
private final WebMvcProperties mvcProperties;
private ResourceLoader resourceLoader;
...
这个类 后面 debugger 详细看,结构跟上面差不多,- 内部类
static class ResourceChainCustomizerConfiguration {
<mark>Customizer 做自定义的</mark>- 内部接口
interface ResourceHandlerRegistrationCustomizer {
- 内部类、上面接口
static class ResourceChainResourceHandlerRegistrationCustomizer implements ResourceHandlerRegistrationCustomizer {
private ResourceResolver getVersionResourceResolver(ResourceProperties.Strategy properties) {
# css、js、xml 等资源
看 getResourceLocations
这个方法
static String[] getResourceLocations(String[] staticLocations) {
String[] locations = new String[staticLocations.length + SERVLET_LOCATIONS.length];
System.arraycopy(staticLocations, 0, locations, 0, staticLocations.length);
System.arraycopy(SERVLET_LOCATIONS, 0, locations, staticLocations.length, SERVLET_LOCATIONS.length);
return locations;
}
<mark>显然,我们把资源放在上面那些路径 再拼接 url 肯定是能找到资源的</mark>
配置类在哪里?
ResourceProperties
通过下面的配置 可以自定义 js、css 这些资源的 位置
<mark>但自定义之后,原先默认的路径会失效</mark>
… 未完待续…
# 视图资源 html 、 jsp
看 public InternalResourceViewResolver defaultViewResolver() {
这个方法
@Bean
@ConditionalOnMissingBean
public InternalResourceViewResolver defaultViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix(this.mvcProperties.getView().getPrefix());
resolver.setSuffix(this.mvcProperties.getView().getSuffix());
return resolver;
}
debugger 到 getPrefix()
方法里面
<mark>默认 前缀 、 后缀 均 是 null</mark>
(上面 没有配置 application.yaml 之类文件)
怎么让 Controller 返回的视图映射成功?
随便写个 controller 、视图映射为 root 、
让 template 作为静态资源目录(不理解 看上面js、css那里)
并且 设置 视图 映射前后缀
下面,映射成功
<mark>具体怎么映射的,看一个类的一个方法</mark>:
DispatcherServlet.doDispatch()
, 完完全全debuger 跟一次,就明白了
- debuger过程记录 - http://暂时没有
后面 通过 filter 或者 shiro 框架,就能控制 访问 页面 或者 js、css等 的权限了。
如果,不设置的话,页面其实也就被视为静态资源,能直接访问
当然,让视图映射到 templates 目录的方法还有:使用 thymeleaf、freemarker 等模板。
不过,为了前后端分离,有前端技术的话,最好还是别用模板了。(坑多,速度慢【听说】、用户体验不好)
# 错误页面 404.html 500.html
在 DefaultErrorViewResolver 里面 resolverResource() 打断点
因此,在静态资源路劲下创建 /error
目录,和 错误状态码 页面 如 404.html
500.html
(后缀 必须 html )
即可指定 错误视图页面