3-静态资源访问问题
在之前配置DispatherServlet时,标签/
。*
那么所有请求都默认会给DispatherServlet来进行处理。
如果访问静态资源,DispatherServlet调用处理器映射器来查找相应处理器。当然是找不到的。因为DispatherServlet只能找到哪些使用@RequestMapper注解指定的处理器方法,所以这种情况下,所有的静态资源获取请求都会显示找不到,404错误。
在Tomcat中,有一个专门处理静态资源访问请求的Servlet,叫DefaultServlet。这个Servlet注册在Tomcat的web.xml中,可以在/conf/web.xml文件中找到。
所以当在项目的web.xml文件中使用了/
,就会替代tomcat的default。导致所有静态资源都给DispatherServlet处理。默认情况DispatherServlet是没有处理静态资源的能力的。
解决方案
使用<mvn:defalut-servlet-handler />
在SpringMvc配置文件中声明<mvn:defalut-servlet-handler />标签后,springmvc框架会在容器中创建DefaultServletHttpRequestHandler处理器对象。它会对进入DisPatherServlet的URL进行检查,如果发现是静态资源的请求,就会把该请求转入Web应用服务器默认的Servlet处理。
使用<mvn:resources />
在Spring3.0版本后,Spring定义了专门用于处理静态资源访问请求的处理器ResourceHttpRequestHandler。并且添加了<mvn:resources />标签,来解决静态资源无法访问的情况。
在springmvc配置文件中加上该标签,就会创建ResourceHttpRequestHandler对象。
格式为:
<mvc:resources location=“” mapping = “” />
其中:
- location:表示静态资源所在目录,不要使用/WEB-INF目录及其子目录。例如"/images/",两个斜杠不能缺,第一个代表根目录,第二个代表images目录下。
- mapper:表示对该资源的请求,一般使用通配符
**
。例如"/images/** **",代表images目录下的所有文件,包括子目录下的。斜杠同样不能少。
例如:
注意:如果加上该标签,但是没有注解驱动标签mvc:annotation-driven/,那么动态资源和静态资源会发生冲突,导致动态资源无法访问。所以一定要加上注解驱动标签。
为了更方便一些,不用每类资源写一个标签,可以把所有静态资源放在同一个目录(例如static)中,然后只用一个标签就可以配置所有静态资源。
路径问题
区分一下相对路径前加斜杠/
和不加的区别。
在JSP、html、Js文件中使用的地址,都是在前端页面中的地址,是相对地址。
地址有两种:
- 相对地址:没有协议开头的,例如user.some.do,/user/some.do
- 绝对地址:带有协议开头的,例如http://localhost
相对地址不能独立使用,必须要有参考地址,参考地址 + 相对地址 组成完整地址。
举一个例子:
不加斜杠/
:
访问资源http://localhost:80/myweb/request.html
路径:http://localhost:80/myweb/
资源:request.html
那么当在request.html中发起user/some.do请求时(就是前端代码 链接是user/some.do),访问地址会变成http://localhost:80/myweb/user/some.do
。所以当在前端点击链接时,访问地址是当前页面的路径加上链接地址。
加上斜杠/
:
访问资源http://localhost:80/myweb/request.html
路径:http://localhost:80/myweb/
资源:request.html
而如果前端代码写的链接是/user/some.do,那么点击链接,这时访问地址会变成http://localhost:80/user/some.do
那么是不是前端代码全都不加斜杠呢,其实也会出问题。
举一个例子:
后端响应一个页面就是当前页面,例如http://localhost:80/myweb/request.html
中点击链接user/some.do,而这个请求响应的也是这个页面request.html,但是这时候地址栏路径就会变为http://localhost:80/myweb/user/some.do
,那么响应的页面同样有链接/user/some.do,再次点击,路径就会变为http://localhost:80/myweb/user/user/some.do
,这时候就会出现404错误。
处理器方法:
1 |
|
html代码:
1 |
|
那么运行结果:
所以为了解决这种情况,可以在html页面中
标签中,加入/
的地址,都会加上base标签指定的路径。支持、、