3-静态资源访问问题

在之前配置DispatherServlet时,标签设置的是.do。当时也写了,可以使用/*

那么所有请求都默认会给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目录下的所有文件,包括子目录下的。斜杠同样不能少。

例如:

image-20201217150523209

注意:如果加上该标签,但是没有注解驱动标签mvc:annotation-driven/,那么动态资源和静态资源会发生冲突,导致动态资源无法访问。所以一定要加上注解驱动标签。

为了更方便一些,不用每类资源写一个标签,可以把所有静态资源放在同一个目录(例如static)中,然后只用一个标签就可以配置所有静态资源。

路径问题

区分一下相对路径前加斜杠/和不加的区别。

在JSP、html、Js文件中使用的地址,都是在前端页面中的地址,是相对地址。

地址有两种:

相对地址不能独立使用,必须要有参考地址,参考地址 + 相对地址 组成完整地址。

举一个例子:

不加斜杠/

访问资源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
2
3
4
@RequestMapping(value = "/user/some.do")
public String doStringData() {
return "/request.html";
}

html代码:

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>请求页面</title>
</head>
<body>
<center>
<a href="user/some.do" >链接</a>
</center>
</body>
</html>

那么运行结果:
yBRFVxREPx

所以为了解决这种情况,可以在html页面中

标签中,加入,页面中所有不带/的地址,都会加上base标签指定的路径。支持
等标签中的URL。

例如刚才的例子加上base标签:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>请求页面</title>
<base href="http://localhost/myweb/">
</head>
<body>
<center>
<a href="user/some.do" >链接</a>
</center>
</body>
</html>

运行结果:
ID2LcSj9vw

路径使用方法

所以总的来说:
前端代码,使用base标签来指定所有不带/的路径,然后链接不带/

后端代码,处理器方法注解@RequestMapper中value的值不加斜杠。

如果要返回静态资源,那么就加上/,例如返回一个html文件。return “/index.html


3-静态资源访问问题
https://zhaoquaner.github.io/2022/05/11/Spring-MVC/3-静态资源访问问题/
更新于
2022年5月22日
许可协议