深入web原理一
1.简单功能分析
1.1静态资源访问
1.静态资源目录:
只要静态资源放在类路径下: called /static (or /public or /resources or /META-INF/resources
就可以通过当前项目根路径/ + 静态资源名,例如在static目录下有一文件hello.jpg,便可以在运行之后,通过localhost:8080/hello.jpg访问到(前提是确保你设置的端口是本地的)。注意:上图中的public,resources目录是自己创建的,当然你也可以不用,用自带的static。另一种情况例如下图,new.png存在于public目录中,通过localhost:8080/new.png访问到的却不是这张图,而是start这个字符串。
以上原理为:静态映射/**。请求进来,先去找Controller看能不能处理,如果不能处理的所有请求,由于静态资源映射到双星,即会拦截所有请求,则又都交给静态资源处理器。如果还是不能处理,则响应404页面。下图的例子就是这样,由于先去找controller可以处理得到start,就不会交给静态资源处理出这张图。
2.静态资源访问前缀:
用application.yml配置文件设置为:
spring:
mvc:
static-path-pattern: /res/**
表示以前通过localhost:8080/文件名访问的方式行不通了,之后访问要用localhost:8080/res/静态资源名。即访问时,在当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找。
3.静态资源访问路径:
用application.yml配置文件设置为:
spring:
mvc:
static-locations: [classpath:/hello/](括号说明这是一个数组,可以同时设置多个路径)
表示类路劲下之前的static等目录都无效了,只认你在类路劲下新创建的这个hello目录。
1.2 欢迎页面支持
默认静态资源路径下的index.html为欢迎页面。
注意点:
- 可以配置静态资源路径;
- 不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问
1.3 自定义favicon
这是给网页添加小图标,只需把favicon.ico 放在静态资源目录下即可,此文件可将.png,.jpg等格式的文件通过在线favicon工具转换再下载。注意:设置静态资源路径前缀可能导致该功能不能实现。
1.4 静态资源配置原理
分析过程:
- SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类);
- SpringMVC功能的 WebMvcAutoConfiguration(自动配置类)生效;
- 分析原理
根据以上流程图,须知在第二步开始,有@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
,说明配置文件的相关属性和xxx进行了绑定。WebMvcProperties=spring.mvc、ResourceProperties=spring.resources(你可以点进这两个类进行查看)。而且可以知道对于配置类来说,如果只有一个有参构造,那这个构造方法的参数值全部来自容器中。
1.资源处理的默认规则:
最关键的第三步,可以从它的方法体看到
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
先是取得整个WebMvcAutoConfigurationAdapter类的属性resourceProperties,这是在利用绑定结果ResourceProperties=spring.resources,再取得这个类中的isAddMappings(),用来设定判断条件。虽然这看没什么,但当你再看这段代码下面,就明白下面才是关键,它们才是在对静态资源进行操作,而以上的判断条件则可以决定是否执行以下代码。回到此时的绑定,使得你只需在application.properties配置文件中修改一下这个绑定信息,便可决定执行程序后能否访问到静态资源。同时你分析上面我说的静态资源操作代码(篇幅问题,请自行源码查看)可以看出,同样是用到了绑定作用,使得我们最终只需在配置文件中修改静态资源相关属性,例如路径,前缀等。演示配置静态资源操作之一代码如下(用的yaml形式):
spring:
resources:
add-mappings: false 禁用所有静态资源规则
2.欢迎页的处理规则:
探究路径:
- welcomePageHandlerMapping方法( WebMvcAutoConfiguration类中);
- 点进1方法中的new即可分析。