第三节 静态资源访问
1、静态资源的概念
资源本身已经是可以直接拿到浏览器上使用的程度了,不需要在服务器端做任何运算、处理。典型的静态资源包括:
- 纯HTML文件
- 图片
- CSS文件
- JavaScript文件
- ……
2、SpringMVC 环境下静态资源问题
①情况一:斜杠情况
[1]情景描述
DispatcherServlet 的 url-pattern 标签配置的是“/”。意味着整个 Web 应用范围内所有请求都由 SpringMVC 来处理。
[2]情景重现
在 Web 应用中加入图片资源:
部署目录下不会自动加入,需要我们手动重新构建才行:
重新构建应用参考下面的操作步骤:
[3]访问静态资源
[4]分析原因
- DispatcherServlet 的 url-pattern 配置的是“/”
- url-pattern 配置“/”表示整个 Web 应用范围内所有请求都由 SpringMVC 来处理
- 对 SpringMVC 来说,必须有对应的 @RequestMapping 才能找到处理请求的方法
- 现在 ./images/mi.jpg 请求没有对应的 @RequestMapping 所以返回 404
[5]解决办法
- 在 SpringMVC 配置文件中增加配置:
关键方法:handleRequest()方法
大体机制:SpringMVC 首先查找是否存在和当前请求对应的 @RequestMapping;如果没有,则调用handleRequest()方法转发到目标资源。
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { Assert.state(this.servletContext != null, “No ServletContext set”);
RequestDispatcher rd = this.servletContext.getNamedDispatcher(this.defaultServletName);
if (rd == null) {
throw new IllegalStateException(“A RequestDispatcher could not be located for the default servlet ‘“ +
this.defaultServletName + “‘“);
} // 这里执行请求转发操作
rd.forward(request, response);
} ### ②情况二:扩展名情况 #### [1]修改 url-pattern
<!-- 以扩展名方式匹配 SpringMVC 要处理的请求 --><br /> <!-- 此时要求请求扩展名必须是 html,SpringMVC 才会处理这个请求 --><br /> <url-pattern>*.html</url-pattern><br /></servlet-mapping>
[2]效果
- 图片直接就可以访问了。因为请求扩展名不是 html,不会受到 SpringMVC 影响。
- 其他请求:做下面两个操作才可以正常访问
- 需要在超链接地址后面附加 html 扩展名
- 在 @RequestMapping 注解指定的 URL 地址中也附加 html 扩展名