(五)

SpringMVC项目里, 若在JSP文件的相同目录下创建静态文件(HTML, CSS, JS, img等), 在浏览器中直接访问这些资源是不能像JSP文件一样访问到的:

 

 

 这是因为, 原本在tomcat的全局配置文件中, 是有一个默认servlet(全局servlet)可以来处理关于静态资源的请求的, url-pattern是 / :

 所以普通的servlet项目可以通过这个servlet来访问到静态资源, 但在springMVC中, 我们配置了 DispatcherServlet, 其url-pattern也是 /, 就覆盖了原来的 default servlet:

 而 DispatcherServlet 这个servlet在接收到请求后, 只会去找controller, 而不能处理静态资源请求. 这就导致了默认情况下springMVC不能处理静态资源请求.

为解决这个问题, 一般有以下三种解决方案:

一. 修改 DispatcherServlet 的 url-pattern

比如将 / 修改为 *.action 或 *.do 等, 这样就可以使得 tomcat 的全局 servlet 继续工作从而以此处理静态资源的请求:

 但是如此, 原来能正常访问的 servlet 就不能正常访问了:

 这是因为, 我们修改了项目的前端控制器, 只有请求以 .action 结尾才会被处理, 所以需要修改请求方式:

 显然这样比较麻烦, 所以有了其他解决方案.

二. DispatcherServlet 的 url-pattern 依然采用 /, 但追加配置

在 mvc.xml 中追加配置: <mvc:default-servlet-handler/>

 这个配置会额外增加一个handler(controller类中的每一个方法都是一个handler), 且其 requestMapping 为: /**, 可以匹配所有请求, 但是优先级最低(注: /* 匹配任意单级路径, 如/a, /b等, /**匹配任意单, 多级路径, 如/a, /a/b/c..等), 所以如果其他所有的handler都匹配不上, 不会直接返回404, 而是会将请求转向该 /**, 恰好这个 handler 就是处理静态资源的处理方式: tomcat 中的 default servlet.

由此, 我们可以按原来的方式顺利访问 servlet 和静态资源:

 

三. 使用配置  <mvc:resources mapping="/html/**" location="/dir/"/>

其中, mapping是访问路径, location是静态资源存放的路径, 按上例所示, 将会把 /html/** 中 /** 匹配到的内容, 拼接到 /dir/ 后, 即:

http://.../html/a.html  --->  访问 /dir/a.html

http://.../html/page/b.html  --->  访问 /dir/page/b.html

如下例所示:

 配置 mvc:resources:

 访问URL及结果:

 按照这个逻辑, 我们可以把html文件, CSS文件, JS文件等放置到相应的目录下, 并按照相应的规则访问到其静态资源, 从而优化项目的文件结构.

原文地址:https://www.cnblogs.com/Ryan368/p/14119535.html