【】 依靠web容器来处理静态资源
而
这种方式的弊端:
- 只能放在webapp下,
- 不能放在WEB-INF中。
-
注册SimpleUrlHandlerMapping
DefaultServletHandlerBeanDefinitionParser 解析
注入了DefaultServletHttpRequestHandler
- 同时注入一个SimpleUrlHandlerMapping( / -> DefaultServletHttpRequestHandler**),order=2,比RequestMappingHandlerMapping优先?。
Spring 学习笔记— 默认加载simpleurlhandlermapping - 执子之手 - CSDN博客
DefaultServletHttpRequestHandler处理【forward到DefaultServlet】
DefaultServletHttpRequestHandler 会forward到Tomcat DefaultServlet。
Tomcat就是 defaultServlet
DefaultServlet【访问静态资源用】
Tomcat中默认配置的Servlet
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
.jpg,.html,.js这类的静态文件。这就是DefaultServlet的作用了
【】 SpringMVC自己处理静态资源
ResourcesBeanDefinitionParser 解析
注册SimpleUrlHandlerMapping(自定义路径 -> ResourceHttpRequestHandler )
ResourceHttpRequestHandler
ResourceHttpRequestHandler 根据路径获取resource,写出到response。
ResourceResolver
DefaultServletHttpRequestHandler & ResourceHttpRequestHandler
DefaultServletHttpRequestHandler:forward到defaultServlet
从名字也能看出,一个是请求DefaultServlet(交给Servlet了),一个请求Resource。SpringBoot的静态资源
最佳实践: ```yaml
启动ResourceHttpRequestHandler,默认true
spring.resources.add-mappings=true
设置ResourceHttpRequestHandler的作用范围(请求路径匹配)
spring.mvc.static-path-pattern=/resources/**
设置资源存放路径
spring.resources.static-locations=file:/opt/x/y/z/static/
如果没有找到Handler就报错(除去ResourceHttpRequestHandler的作用范围)
spring.mvc.throw-exception-if-no-handler-found: true
默认路径:<br />classpath:/META-INF/resources/ <br />classpath:/resources/<br />classpath:/static/ <br />classpath:/public/<br />上面SpringBoot配置等效于如下配置:
```xml
<mvc:resources mapping="/resources/**" location="/public-resources/">
<mvc:cache-control max-age="3600" cache-public="true"/>
</mvc:resources>
所以,SpringBoot也是通过ResourceHttpRequestHandler来处理静态资源的
解决@ControllerAdvice不能捕获404的问题