springboot怎么访问静态资源


springboot工程,是没有webapp文件夹的,静态文件放在src/main/resources/static文件夹下即可,模板文件放在src/main/resources/templates下。

 

1. 通常有的文件夹

在resources文件夹下建立三个文件夹:
1、public
2、static
3、templates
实验结果一:
在public文件夹下的html文件可以通过浏览器中输入文件+后缀名的方式直接访问的。static和templates中不能直接访问。
实验结果二:
在配置了相应的视图解析器以后,templates中的文件可以通过控制器进行访问的。并且不同的视图解析器只能访问对应的视图。比如:thymeleaf视图解析器,只能访问.html的页面。velocity的解析器只能访问.vm的页面。
实验结论推测:
一、public文件夹,就相当于在eclipse的web项目中的web-inf文件夹外的文件,是不需要通过服务器内部进行访问的。
二、templates文件夹,是放置模板文件的,因此需要视图解析器来解析它。所以必须通过服务器内部进行访问,也就是要走控制器--服务--视图解析器这个流程才行。
三、static文件夹,既不能直接访问,也不能通过服务器访问到。因此,这个文件夹,可能是放一些css、图片这样的文件供服务器内部引用。

 

2. 通常的访问方式

通常来说,不可以通过文件名.后缀的方式来直接访问web静态资源,至少目前我还没发现怎么这样来直接访问。
因此,我们通常是通过控制器的跳转来实现页面的访问。
通常页面会被放在templates、static、public这样的静态目录下。
我们跳转页面的时候,需要用到@Controlller注释,在方法中返回一个页面名称的字符串。
通常,要跳转html页面的话,我们在pom.xml加入thymeleaf的dependency。
SpringBoot就会为我们配置thymeleaf的ViewResolver来解析html后缀结尾的页面。
而如果,我们加入velocity这样的dependency,那么SpringBoot就会为我们自动配置velocity模板的ViewResover。
就可以解析以vm结尾的视图。
当然,这几种视图解析器是不能混用的比如velocity的视图解析器并不能解析html的页面。同样thymeleaf的视图
解析器也并不能解析html页面。

 

3. 总结

  第一,我在项目里吧html文件放到了  springboot 的 resource 文件夹下的 templates 文件夹下,这是因为我想在 此文件夹下的 html 代码当中引用 th等标签,

所以如果我们放在这里了,记得要在pom.xml 当中引入  thymeleaf  的依赖 : 否则界面的标签解析不了,会报错

  

  

  第二,我在项目当中 也吧 css,js 放在 static 文件夹下,然后我运行项目发现 访问不了 html 跟 html 当中的css,这个时候我很清除我的文件夹没放错位子,那么就

可能是系统的自身指定策略了,首先,我们访问页面可能被拦截器拦住了,所以第一去掉拦截器,第二看 application.properties 当中是否写了一些奇怪的设置,第三,

是不是我们在代码的MVC的配置上又指定了策略,下面我就贴图给大家看看,若是为了测试需要,到底要注意哪些东西 : 

  1. 是否被拦截器 拦截了 : 

  

  如上图我就被拦截到了没有传入 header 对应的信息,所以不能继续了。

  2. 是否是 application.properties 指定错了 : 

  

  3. 是否是 我们写了关于 nvc 的 configuration类,从而改变了策略,在这里提一下可以有2种方式来改变: 

  第一种可以继承WebMvcConfigurerAdapter,当然如果是1.8+WebMvcConfigurerAdapter这个类以及过时了,可以直接实现WebMvcConfigurer接口,然后重写addInterceptors来添加拦截器:

   

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInterceptor()).addPathPatterns("/user/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
 
}

  或者还是继承WebMvcConfigurationSupport,然后重写addResourceHandlers方法:

  

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {
 
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInterceptor()).addPathPatterns("/user/**");
        super.addInterceptors(registry);
    }
     
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }
     
}

  看看我这里,其实被人家改了,看我这里代码:

  

  

主要是我这里为了app打包,就改了这里的策略,而我现在做实验,改static的就OK了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM