SpringMVC学习笔记9-静态资源映射

九、 静态资源映射

当在 DispatcherServlet 的中配置拦截 “/” 时,除了*.jsp 不会拦截以外,其 他所有的请求都会经过前端控制器进行匹配,此时静态资源,例如 .css、.js、*.jpg…… 就 会被前端控制器拦截,导致不能访问,出现 404 问题。
SpringMVC学习笔记9-静态资源映射_第1张图片
访问web目录下untitled.png失败。因为使用DispatcherServlet,配置urlParterrn为/只会过滤jsp,那其他的会拦截,然后找Controller去调用请求处理。因为没有写,所以报错404.

1 通过 DefaultServlet 处理静态资源
tomcat软件自己带有一个web.xml,里面有一个DefaultServlet,如果配置了映射.css,.jpg,.png等,那么当请求这些资源的时候会由DefaultServlet处理,直接放行!
tomcat自有的web.xml
SpringMVC学习笔记9-静态资源映射_第2张图片修改项目的web.xml

<servlet-mapping>
    <servlet-name>defaultservlet-name>
    <url-pattern>*.jpgurl-pattern>
servlet-mapping>
<servlet-mapping>
    <servlet-name>defaultservlet-name>
    <url-pattern>*.cssurl-pattern>
servlet-mapping>
<servlet-mapping>
    <servlet-name>defaultservlet-name>
    <url-pattern>*.pngurl-pattern>
servlet-mapping>
<servlet-mapping>
    <servlet-name>defaultservlet-name>
    <url-pattern>*.jsurl-pattern>
servlet-mapping>

重新启动tomcat,访问web目录下的untitled.png图片,访问成功!

这样做可以访问到web直接子节点,这些静态文件。尝试访问web子目录的WEB-INF/下的静态文件,会经过默认的Servlet放行,但是因为WEB-INF目录访问受限,仍会报错404
SpringMVC学习笔记9-静态资源映射_第3张图片

2 通过 SpringMVC 的静态资源映射器处理静态资源

在 spring3.0.4 以后的 SpringMVC 模块提供了静态资源映射器组件。通过 mvc:resources 标签配置静态资源映射器 。请求会先到DispatcherServlet,发现url是静态资源配置了的路径,会直接去位置中找访问的资源。
修改 SpringMVC 配置文件

<mvc:resources mapping="/image/**" location="/WEB-INF/image/"/>

访问结果
可以访问到任意目录下的静态文件。使用的是springmvc不是tomcat的。

3 通过处理静态资源

在 SpringMVC 的配置文件中配置后,会在 Spring MVC 上 下文中定义一个 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler, 它会像一个检查员,对进入 DispatcherServlet 的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理。
修改 SpringMVC 配置文件

<mvc:default-servlet-handler/>

发送3个请求,1,2是走的默认的DefaultServlet,放行静态资源,如果是WEB-INF目录,则访问受限。
3走的是springmvc的Servlet,根据url选择控制器。返回ok页面。

SpringMVC学习笔记9-静态资源映射_第4张图片总结:
对于静态资源的访问有三种方式。第一种换用tomcat的DefaultServlet处理静态资源,直接放行。所有放在web目录下的直接静态资源可被访问。WEB-INF目录下的不能访问,会报404.
第二种配置springmvc的静态资源映射器,mappint是配置请求的url,location是配置映射路径。可以访问任意目录下的静态资源!
第三种配置DefaultServleHtttpRequestHandler,如果是静态资源走DeafultServlet,不是,走DispatcherServlet。那么仍然不能访问WEB-INF目录下静态资源。

所以,使用时我会选择使用在springmvc配置文件中配置静态资源映射器,去访问静态资源。

你可能感兴趣的:(SpringMVC学习笔记)