SpringBoot⽆法访问static下静态资源的解决⽬录
SpringBoot⽆法访问/static下静态资源
SpringBoot 访问静态资源的规则
在该类下有对资源处理的⽅法
SpringBoot容器⾥读到了我们配置的@EnableWebMvc 注解
⼩结⼀下
SpringBoot2.*.*⽆法访问静态资源的坑
遇到的问题
解决的⽅法
粗略的原因
SpringBoot⽆法访问/static下静态资源
SpringBoot 访问静态资源的规则
都在WebMvcAutoConfiguration⾃动配置类中
在该类下有对资源处理的⽅法
默认按照该加载顺序,加载静态资源⽂件,⽽我尝试了N次,浏览器⽆法访问资源;查看官⽹后,我⼜修改了默认的加载位置。如下:
但是还是没有能如期访问! ⽽回过头再回过头看Web的⾃动配置类,我发现了⼀个被忽略的配置
springmvc选择题在WebMvcConfigurationSupport.class这个类没有的情况下,才会⾛SpringBoot的Web⾃动配置,⽽在==@EnableWebMvc==中,⼜惊奇的发现了它
SpringBoot容器⾥读到了我们配置的@EnableWebMvc 注解
它通过 @Import 导⼊了 WebMvcConfigurationSupport 类,从⽽导致了 WebMvcAutoConfiguration 类没有⽣效,此时我的问题到了! 最后我⼜在Spring的官⽹到了对应的解释,可供参考
⼩结⼀下
如果项⽬有没有⾮常多的功能,可以使⽤ @EnableWebMvc 注解,全⾯接管SpringBoot对SpringMVC的⾃动注⼊,⾃⼰来写SpringMVC 运⾏所需的⼀些配置,这样会减少⾃动注⼊带来的⼀些⽆意义性能消耗;
⽽⼀般功能⽐较多的项⽬,还是使⽤SpringBoot推荐的对SpringMVC拓展⽅法 —— 继承 WebMvcConfigurer 类,这样不仅可以⾃⼰实现想要添加的WEB组件,也保留了SpringBoot底层的⾃动注⼊
SpringBoot2.*.*⽆法访问静态资源的坑
遇到的问题
在导⼊静态资源(css、js包等)和html页⾯模板时,发⽣⽆法读取静态资源的情况,总结是以下两种情况:
1、输⼊访问静态资源的url,出现⽩页错误,⽆法访问静态资源;
2、输⼊访问html页⾯的url,可以访问成功,但是html页⾯布局乱了,⽆法读取样式;
由于样式是放在静态资源⽂件夹的,既然⽆法访问静态资源,那么html页⾯⾃然就⽆法读取样式了。所以问题归结于“⽆法访问静态资源”。
注:模板引擎采⽤的是springboot推荐的thymeleaf来渲染html页⾯
解决的⽅法
在配置类中添加以下⽅法
主:详细参考以下个⼈写的配置类
@Configuration
public class SigninConfig extends WebMvcConfigurationSupport {
//增加访问路径
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
/
/请求与页⾯映射
@Override
protected void addViewControllers(ViewControllerRegistry registry) {
//urlPath:请求
//setViewName:html页⾯
registry.addViewController("/").setViewName("signin");
}
}
粗略的原因
springboot关于springmvc⾃动配置的机制主要有以下两种(⽬前了解的),其中第⼀种就是涉及到“为什么⽆法访问静态资源”的问题:
(1)springboot不允许⽤户个⼈添加的组件与⾃动配置⼀起作⽤,那么⽤户添加的组件会覆盖掉⾃动配置。
我的配置类继承WebMvcConfigurationSupport,这是springmvc⾃动配置类,我猜想这个类涉及到静态资源路径的默认配置(没有详细看源码不确定),@Configuration⼜把我的配置类添加到容器中,相当于我的配置类和⾃动配置类都在容器中,那么根据(1),⾃动配置的静态资源路径⾃然就失效,所以如果我们不指定,⾃然就⽆法访问静态资源,所以需要我们重新指定静态资源路径(这也是为什么要重写addResourceHandlers⽅法)。
(2)springboot允许⽤户个⼈添加的组件(如view,也就是上述addViewControllers⽅法)与⾃动配置⼀起作⽤,那么⽤户添加的组件会和⾃动配置⼀起存在;
那么重点来了,以前springboot1.版本的时候还没有对(1)情况作出修改,也就是说即使你添加了相关的组件,默认的静态资源路径仍然是⽣效的,不需要再重写路径。
⽽到了springboot2.时,如果你添加了相关的组件,默认的静态资源路径就会失效,如果你不重新指明静态资源路径,那么你就⽆法访问静态资源,所以要多⼀步重新设置静态资源路径的步骤,完毕。
————————后续————————
原本是看着官⽹⽂档,打算按照官⽅说的做⼀遍,然后好奇就把原配置路径的代码删掉,结果居然能访问没有报⽩页错误@Configuration
public class SigninConfig extends WebMvcConfigurationSupport {
// @Override
// protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
// }
@Override
protected void addViewControllers(ViewControllerRegistry registry) {
//urlPath:请求
//setViewName:html页⾯
registry.addViewController("/").setViewName("signin");
}
}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论