SSM框架中静态资源映射问题

893 阅读2分钟

前言

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战。恰逢掘金八月更文挑战,今天向大家分享一下我在学习SSM框架的过程中遇到的静态资源映射问题,经过分析和思考,有所感悟,分享给一些正在学习Spring框架的小伙伴们,希望对你们有所启发和帮助吧!加油,共勉!

项目 demo 介绍

登录注册两个模块,并做严格的表单验证

前端项目目录

image.png

后端

配置静态资源映射

<mvc:resources mapping="/css/**" location="/static/css/"/>
<mvc:resources mapping="/js/**" location="/static/js/"/>
<mvc:resources mapping="/image/**" location="/static/image/"/>

根据项目资源的位置 location 形成一个映射关系,以减少重复代码、降低项目的耦合度和提高资源文件间的内聚性。

实例代码

image.png

问题发现

spring-mvc 的配置文件中仅有如下一个映射时

<mvc:resources mapping="/static/**" location="/static/" />

  1. jsp 文件中加入 basepath 标明资源路径从项目根路径 http://localhost:8080/login/ 开始,此时 herf="static/css/login.css" ,CSS 文件在 login.jsp 中渲染成功

  2. 按照这种思路,我在同目录下的 register.jsp 进行同样的操作,也能使外部样式文件渲染成功,但是,在 welcome.jsp 中使用相同的套路时,仅能渲染除 background 属性外的样式,图片始终不能加载出来

问题分析

首先出现这个问题,最主要的问题就是对静态资源映射理解不深刻,现在分析这个映射关系时,就能发现这个映射没有任何用处,还显得这个映射非常多余,以至于在请求被处理过后,页面跳转发生路径错误,导致报404错误,找不到资源。

问题解决

  • 重新编写映射关系
  • 修改href属性值,填写相应的路径位置
  • 拿登录页面的href属性值举例:

image.png

    • 从上图中可以看出,login.css 在项目中的绝对位置为:http://localhost:8080/login/css/login.css,这是个映射后的路径(并不是真正项目中该资源所在位置)但根据静态资源映射解析后,静态资源所处的真实项目位置位于http://localhost:8080/login/static/css/login.css
    • 如果href="/css/login.css"这样写的话:

image.png

      • 就会和映射关系产生冲突,一个是 /static/css/ ,另一个是从 / (项目的根目录)开始,最后导致资源找不到,不能成功引入 css 文件

结论:

  1. 综上,可以不用在jsp文件中指定basepath,配置静态资源映射即可。
    
  2. 如果出现资源找不到问题,在浏览器的控制台中的network栏中找问题,根据加载的路径去核实项目中资源文件的所在位置。