前言
这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战。恰逢掘金
八月更文挑战
,今天向大家分享一下我在学习SSM框架的过程中遇到的静态资源映射问题
,经过分析和思考,有所感悟,分享给一些正在学习Spring框架的小伙伴们,希望对你们有所启发和帮助吧!加油,共勉!
项目 demo 介绍
登录注册两个模块,并做严格的表单验证
前端项目目录
后端
配置静态资源映射
<mvc:resources mapping="/css/**" location="/static/css/"/>
<mvc:resources mapping="/js/**" location="/static/js/"/>
<mvc:resources mapping="/image/**" location="/static/image/"/>
根据项目资源的位置 location 形成一个映射关系,以减少重复代码、降低项目的耦合度和提高资源文件间的内聚性。
实例代码
问题发现
当 spring-mvc
的配置文件中仅有如下一个映射时
<mvc:resources mapping="/static/**" location="/static/" />
-
在
jsp
文件中加入basepath
标明资源路径从项目根路径http://localhost:8080/login/
开始,此时herf="static/css/login.css"
,CSS
文件在login.jsp
中渲染成功 -
按照这种思路,我在同目录下的
register.jsp
进行同样的操作,也能使外部样式文件渲染成功,但是,在welcome.jsp
中使用相同的套路时,仅能渲染除background
属性外的样式,图片始终不能加载出来
问题分析
首先出现这个问题,最主要的问题就是对静态资源映射理解不深刻,现在分析这个映射关系时,就能发现这个映射没有任何用处,还显得这个映射非常多余,以至于在请求被处理过后,页面跳转发生路径错误,导致报404错误,找不到资源。
问题解决
- 重新编写映射关系
- 修改href属性值,填写相应的路径位置
- 拿登录页面的href属性值举例:
-
- 从上图中可以看出,
login.css
在项目中的绝对位置为:http://localhost:8080/login/css/login.css
,这是个映射后的路径(并不是真正项目中该资源所在位置)但根据静态资源映射解析后,静态资源所处的真实项目位置位于http://localhost:8080/login/static/css/login.css
。
- 从上图中可以看出,
-
- 如果href="/css/login.css"这样写的话:
-
-
- 就会和映射关系产生冲突,一个是
/static/css/
,另一个是从/
(项目的根目录)开始,最后导致资源找不到,不能成功引入css
文件
- 就会和映射关系产生冲突,一个是
-
结论:
-
综上,可以不用在jsp文件中指定basepath,配置静态资源映射即可。
-
如果出现资源找不到问题,在浏览器的控制台中的network栏中找问题,根据加载的路径去核实项目中资源文件的所在位置。