Question 1
-
springboot 存在静态资源以及映射的路径mapping,那么访问该路径优先加载哪个呢?
answer: springboot先匹配
mapping
路径,如果mapping
不存在该映射路径,那么再查找该路径的静态资源,如果不存在,那么返回404
页面。由于该方法加了@ResponseBody注解,如下返回了 “hello字符串”,而并没有返回 静态资源 “java.txt”的内容。 -
springboot 默认扫描如下路径的静态资源
classpath:/static
classpath:/public
classpath:/resources
classpath:/META-INF/resources
也可以通过 在properties文件下自己指定
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/
这个的classpath是什么意思呢?就是classes文件夹的根目录。
一般我们在创建Myeclipse工程的时候,原则上是可以创建起任意名的文件夹,如图
只要你在java Build Path
选项下包含你创建的文件夹即可,它就会被编译器编译到classes
目录。不过为了规范起见,大家创建资源文件夹的名还是要规范一点的。
上述工程目录编译过程详解:
首先呢,所有自己创建的文件夹(包括resources)下的所有文件都会被放在classes
根目录,如果你创建的文件夹下,还有子文件夹,那么他会把子文件夹一起复制到classes
根目录,例如; 我创建了public
目录,那么我的classes
目录下会有resources
文件夹以及public
目录下的structs2.txt
文件。
-
如果创建的两个文件夹 都有个同名的子文件夹,那么编译后会怎样?
answer:那么资源都会汇总在
classes/子文件夹/
下 -
如果两个相同子文件夹下有两个相同名的静态文件,那么编译后会怎么样?
answer:这种情况,编译器会把最新的文件放置该文件夹下,也就是说哪个文件是最新修改的那么就把哪个文件放入那个编译后的子文件夹里。当然,为了保险起见,最好不要这么做,起两个名字也不是什么难事吧~。
结语:
还要说明的是,本次测试发现一点神奇的地方,就是public
文件夹
下的静态资源,即使不在public/resources/
下的文件,在public文件夹放任意静态资源或者创建子文件夹以及在子文件夹下的静态资源,都可以随意访问,而对于其他的文件夹下的静态资源却不能直接访问(如下图的static文件夹的dd.txt,由于没有放在resources下所以访问不到),需要配置把那些静态资源放在他的子文件夹 resources
下就可以访问了。同时我看出了public
文件夹的特殊性。我想这应该就涉及到springboot底层的设计思想了。有时间研究springboot源码。