】 依靠web容器来处理静态资源

将静态资源的处理经由Spring MVC框架交回Web应用服务器处理
更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。

这种方式的弊端:

  • 只能放在webapp下,
  • 不能放在WEB-INF中。
  • resources中也不行

    注册SimpleUrlHandlerMapping

    DefaultServletHandlerBeanDefinitionParser 解析

  • 注入了DefaultServletHttpRequestHandler

  • 同时注入一个SimpleUrlHandlerMapping / -> DefaultServletHttpRequestHandler**),order=2,比RequestMappingHandlerMapping优先?。

Spring 学习笔记— 默认加载simpleurlhandlermapping - 执子之手 - CSDN博客

DefaultServletHttpRequestHandler处理【forward到DefaultServlet】

DefaultServletHttpRequestHandler 会forward到Tomcat DefaultServlet。
image.png
Tomcat就是 defaultServlet
image.png

DefaultServlet【访问静态资源用】

Tomcat中默认配置的Servlet

  1. <servlet>
  2. <servlet-name>default</servlet-name>
  3. <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  4. </servlet>
  5. <servlet>
  6. <servlet-name>jsp</servlet-name>
  7. <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>default</servlet-name>
  11. <url-pattern>/</url-pattern>
  12. </servlet-mapping>
  13. <servlet-mapping>
  14. <servlet-name>jsp</servlet-name>
  15. <url-pattern>*.jsp</url-pattern>
  16. <url-pattern>*.jspx</url-pattern>
  17. </servlet-mapping>

.jpg,.html,.js这类的静态文件。这就是DefaultServlet的作用了

】 SpringMVC自己处理静态资源

ResourcesBeanDefinitionParser 解析

  • 注册SimpleUrlHandlerMapping(自定义路径 -> ResourceHttpRequestHandler

    ResourceHttpRequestHandler

    ResourceHttpRequestHandler 根据路径获取resource,写出到response。

    ResourceResolver

    image.png

    DefaultServletHttpRequestHandler & ResourceHttpRequestHandler

  • DefaultServletHttpRequestHandler:forward到defaultServlet

    image.png
    从名字也能看出,一个是请求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

  1. 默认路径:<br />classpath:/META-INF/resources/ <br />classpath:/resources/<br />classpath:/static/ <br />classpath:/public/<br />上面SpringBoot配置等效于如下配置:
  2. ```xml
  3. <mvc:resources mapping="/resources/**" location="/public-resources/">
  4. <mvc:cache-control max-age="3600" cache-public="true"/>
  5. </mvc:resources>

所以,SpringBoot也是通过ResourceHttpRequestHandler来处理静态资源的
解决@ControllerAdvice不能捕获404的问题