前言:我自己也是刚学Spring MVC不久,解决方案是自己摸索出来的,原理我也不知道;配置文件中已经有如下配置,但还是失效
<!-- 让Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler />
有其他解决方案或者知道原理的大佬欢迎在评论中提出 ~互相学习 ~
问题:
1.绝对路径无效
图片位置截图:
绝对路径方式:
<img src="C:\Users\w\Desktop\1\1.png" alt="picture">
页面获取不到:(不是在c盘的问题,其他盘我也试过了)
2.相对路径无效
图片位置截图:
相对路径方式(该jsp页面在WEB-INF/jsp下,确定路径正确):
<img src="../img/11.png" alt="picture">
页面同样获取不到:
放在WEB-INF外面也是同样获取不到:
<img src="../../img/33.png" alt="picture">
解决方案:
将图片存在这个位置(web/img),注意是在WEB-INF的外面
将引用的路径改为:/项目名称/img/图片名
或者改为:${pageContext.request.contextPath}/img/图片名
当然你img有没有和叫啥名字无所谓~
<img src="/SpringMVC2_war_exploded/img/33.png" alt="picture">
<img src="${pageContext.request.contextPath}/img/33.png" alt="picture">
页面获取成功:
补充:
1.css和js
这里只讲了图片显示不出的问题,css和js的引用失效同理。
把包放在web的下面,WEB-INF的外面:
引用的路径修改为:
<link href="/SpringMVC2_war_exploded/js/.....">
<link href="${pageContext.request.contextPath}/js/.....">
这样的格式就行了。
2.图片的名字最好没有除了"."的特殊字符!
如果你打算把图片在前端使用文件上传,然后把图片名存在数据库中,或者存在哪。而图片名里有特殊字符,文件上传后的fileName:(文件上传这里不做赘述)
String fileName=file.getOriginalFilename();
也是包含了特殊字符的!!!
会有啥问题?
如果直接在前端用这样的代码 直接把 路径和文件名 取出来是获取不到图片的!!(路径后面已经额外加了一个‘/’了,没有问题) :
<img src="<%=picture.getPath() + picture.getName()%>" alt="picture" height="100px" width="200px">
原因如下:
如果图片名称为: ]51_P__@`TLJ$165_82Y[PD.png
用上面的代码你得到的是:
/SpringMVC2_war_exploded/img/]51_P__@`TLJ$165_82Y[PD.png
但是!
在url上,部分特殊字符是要转义的!!想了解如何转义的可自行百度。
所以就有两种解决方案:
一:将特殊字符转义后访问
二:不允许图片名含有除了"."的特殊字符
我个人偏向第二种,第一种的方法可以自行查询。这里贴一下我过滤特殊字符的方法:
//正则表达式,过滤除了"."的特殊字符
String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\]<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\n|\r|\t";
Pattern p = Pattern.compile(regEx);
assert fileName != null;
//fileName为文件名
Matcher m = p.matcher(fileName);
if (!m.find()){
//不含特殊字符
return true;
}
else {
//含有特殊字符
return false;
}