- 先讲几点有关嵌入式 Tomcat 运行的事项
- request.getSession().getServletContext().getRealPath(“/”),这个不用多说了,总之很重要,先将其简称为 docBase,即 “文档根目录”
- 当项目中不存在 src/main/webapp 目录时,docBase 为C盘临时目录,例如 C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.2872246570823772896.8080\
- 当项目中存在 src/main/webapp 目录时
- 如果该目录存在于 Maven 项目父模块中,则 docBase 为父模块的 src/main/webapp
- 如果 Maven 项目父模块缺少该目录,此时,即使子模块存在 src/main/webapp 目录,也视为不见,docBase 为C盘临时目录
综上,如果我们想要通过 “文档根目录” 来定位到某些资源的话,首先要保证存在 src/main/webapp 目录,否则,建议直接定位到 classpath 下的资源(即 src/main/resource 目录下的资源),具体配置如下
1.不存在 @EnableWebMVC
- Spring Boot 的 @EnableAutoConfiguration 会触发自动配置类 WebMvcAutoConfiguration,该类配置了一些默认的静态资源映射
- 自动映射 localhost:8080/** 为
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- classpath:/META-INF/resources/
- 自动映射 localhost:8080/webjars/** 为
- classpath:/META-INF/resources/webjars/
- 自动映射 localhost:8080/** 为
此时,我们不需要多作些什么,只需要将静态资源放入 src/main/resources 目录下的 resources、static 或 public 文件夹下,可直接通过 url 定位相关资源,例如 localhost:8080/index.html 定位到 src/main/resources/static/index.html
但是,如果使用了以下的自定义配置,则以上默认配置统统无效
@Configuration
public class GoWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//配置静态资源处理
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/resources2/")
.addResourceLocations("classpath:/static2/")
.addResourceLocations("classpath:/public2/")
.addResourceLocations("classpath:/META-INF/resources2/");
}
}
2.如果存在 @EnableWebMVC
如果使用了 @EnableWebMvc,那么自动配置类 WebMvcAutoConfiguration 会失效,因此官方默认的 /static, /public, META-INF/resources, /resources 都不复存在
这种情况下,我们只能手动添加以下配置,切记,如果不添加 classpath 前缀,则定位到 “文档根目录”(一般是 src/main/webapp 目录)下的资源,此时,我们可以将静态资源放入 src/main/webapp 目录下的 resources、static 或 public 文件夹下,然后通过 url 直接定位相关资源,例如 localhost:8080/index.html 定位到 src/main/webapp/static/index.html
@Configuration
public class GoWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//配置静态资源处理
registry.addResourceHandler("/**")
.addResourceLocations("resources/")
.addResourceLocations("static/")
.addResourceLocations("public/")
.addResourceLocations("META-INF/resources/");
}
// @Override
// public void addResourceHandlers(ResourceHandlerRegistry registry) {
// //配置静态资源处理
// registry.addResourceHandler("/**")
// .addResourceLocations("classpath:/resources/")
// .addResourceLocations("classpath:/static/")
// .addResourceLocations("classpath:/public/")
// .addResourceLocations("classpath:/META-INF/resources/");
// }
}