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了。