通过看 WebMvcAutoConfiguration 这个类

直观看到 SpringBoot 怎么映射 静态资源的

# 总览

扫一眼 WebMvcAutoConfiguration 里面 跟 Resource 相关的方法、属性有:

  1. static String[] getResourceLocations(String[] staticLocations) {
  2. 内部类 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;
  3. 内部类 public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {
    • private final ResourceProperties resourceProperties;
    • private final WebMvcProperties mvcProperties;
    • private ResourceLoader resourceLoader;
    • ... 这个类 后面 debugger 详细看,结构跟上面差不多,
  4. 内部类 static class ResourceChainCustomizerConfiguration { <mark>Customizer 做自定义的</mark>
  5. 内部接口 interface ResourceHandlerRegistrationCustomizer {
  6. 内部类、上面接口 static class ResourceChainResourceHandlerRegistrationCustomizer implements ResourceHandlerRegistrationCustomizer {
    1. 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 跟一次,就明白了

后面 通过 filter 或者 shiro 框架,就能控制 访问 页面 或者 js、css等 的权限了。
如果,不设置的话,页面其实也就被视为静态资源,能直接访问

当然,让视图映射到 templates 目录的方法还有:使用 thymeleaf、freemarker 等模板。
不过,为了前后端分离,有前端技术的话,最好还是别用模板了。(坑多,速度慢【听说】、用户体验不好)

# 错误页面 404.html 500.html

在 DefaultErrorViewResolver 里面 resolverResource() 打断点

因此,在静态资源路劲下创建 /error 目录,和 错误状态码 页面 如 404.html 500.html (后缀 必须 html )
即可指定 错误视图页面