Java-Spring入门指南(二十四)SSM整合HTML:解决CSS/JS静态资源被过滤问题

Java-Spring入门指南(二十四)SSM整合HTML:解决CSS/JS静态资源被过滤问题

Java-Spring入门指南(二十四)SSM整合HTML:解决CSS/JS静态资源被过滤问题


前言

  • 在上一篇博客中,我们成功搭建了SSM基础系统,实现了“后端查询数据库→前端HTML展示数据”的核心流程。但实际开发中,我们大概率会遇到一个棘手问题:HTML页面能正常访问,但CSS样式加载失败、JS交互完全失效——打开浏览器F12查看,会发现静态资源(CSS/JS/图片)返回404错误,这就是SpringMVC的“静态资源过滤”导致的。
  • 为什么会出现这种情况?因为我们在web.xml中配置DispatcherServlet时,URL映射设为了<url-pattern>/</url-pattern>,这意味着所有请求(包括动态请求如/index和静态请求如/css/style.css)都会被SpringMVC拦截。而SpringMVC默认只处理动态请求(Controller映射的接口),对静态资源会直接“过滤掉”,导致前端无法加载样式和脚本。
  • 本文将基于Maven+IDEA+Tomcat 11+SSM环境,详细讲解两种解决静态资源被过滤的方案。
我的个人主页,欢迎来阅读我的其他文章
https://blog.ZEEKLOG.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.ZEEKLOG.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482
在这里插入图片描述

一、前置准备

在配置前,先确认项目的静态资源位置,确保后续配置的路径与实际文件位置完全匹配,这是解决问题的关键前提。

1.1 项目结构

ssm ├── src │ ├── main │ │ ├── java(后端代码,与之前一致) │ │ ├── resources(配置文件,与之前一致) │ │ └── web │ │ └── WEB-INF │ │ └── templates │ │ └── html <!-- 静态资源根目录 --> │ │ ├── css <!-- CSS样式文件 --> │ │ ├── js <!-- JS脚本文件 --> │ │ ├── images <!-- 图片资源 --> │ │ ├── font-awesome <!-- 图标资源 --> │ │ ├── fonts <!-- 字体资源 --> │ │ ├── index.html <!-- 前端页面 --> │ │ └── 其他HTML文件... │ └── test └── target 
在这里插入图片描述

1.2 问题场景复现

当我们在index.html中引用CSS和JS时,若未配置静态资源放行,浏览器会拦截这些请求:

<!-- index.html中引用CSS(路径看似正确,但会被SpringMVC拦截) --><linkrel="stylesheet"href="css/style.css"><!-- index.html中引用JS --><scriptsrc="js/script.js"></script>
在这里插入图片描述
  • 访问页面后,F12打开“开发者工具→Network”,会发现style.cssscript.js的请求状态为404 Not Found,原因是DispatcherServlet拦截了/css/style.css这类请求,且SpringMVC未配置如何处理,导致资源无法加载。
在这里插入图片描述

二、解决方案

针对上述问题,SpringMVC提供了两种主流解决方案,分别适用于不同场景,你可根据项目复杂度选择。

方法一:使用mvc:default-servlet-handler

该方法通过“委托默认Servlet处理静态资源”实现放行,配置简单,适合静态资源目录少、需求简单的项目。

2.1.1 原理

  • SpringMVC的<mvc:default-servlet-handler>标签会注册一个DefaultServletHttpRequestHandler,当SpringMVC收到请求时:
    1. 先判断该请求是否为“动态请求”(如/index/findStudent),若是则由DispatcherServlet处理;
    2. 若为“静态资源请求”(如/css/style.css/js/script.js),则将请求委托给Tomcat的默认ServletDefaultServlet)处理,从而绕过SpringMVC的过滤。

2.1.2 配置步骤(仅需1步)

resources/springmvc.xml中添加标签,位置需在<mvc:annotation-driven>之后(确保动态请求优先处理):

<!-- springmvc.xml --><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 1. 组件扫描(原有配置,无需修改) --><context:component-scanbase-package="com.niit"></context:component-scan><!-- 2. MVC注解驱动(原有配置,动态请求核心) --><mvc:annotation-driven/><!-- 3. 新增:静态资源快速放行(关键配置) --><mvc:default-servlet-handler></mvc:default-servlet-handler><!-- 其他配置(视图解析器、数据源等,原有配置不变) --></beans>
在这里插入图片描述

2.1.3 注意事项

  1. 必须配合<mvc:annotation-driven>:若只加<mvc:default-servlet-handler>而不加<mvc:annotation-driven>,SpringMVC会无法处理动态请求(如Controller的@RequestMapping接口),导致后端接口失效。
  2. 适用场景:适合静态资源目录少、无需精确控制资源访问权限的项目,如小型管理系统。
  3. 不适用场景:若静态资源放在WEB-INF下的深层目录(如本次项目的WEB-INF/templates/html/css),默认Servlet可能无法识别路径,此时推荐用方法二。

方法二:使用mvc:resources标签

该方法通过“手动映射资源URL与实际目录”实现放行,可精确控制每个类型的静态资源(如CSS、JS、图片),适合静态资源目录多、路径复杂的项目(如本次项目结构)。

2.2.1 原理

  • <mvc:resources>标签的核心是建立“URL路径映射”与“项目内资源目录”的对应关系
    • mapping:定义浏览器访问静态资源的URL规则(如/css/**表示匹配所有以/css开头的请求);
    • location:定义静态资源在项目中的实际存储目录(如/WEB-INF/templates/html/css/);
  • 配置后,当浏览器发起/css/style.css请求时,SpringMVC会自动映射到WEB-INF/templates/html/css/style.css,从而加载资源。

2.2.2 配置步骤(按资源类型逐一配置)

springmvc.xml<mvc:annotation-driven>之后,添加以下配置,确保覆盖所有静态资源类型:

<!-- springmvc.xml --><!-- 2. MVC注解驱动(原有配置,必须保留) --><mvc:annotation-driven/><!-- 3. 新增:静态资源精确映射(关键配置,按资源类型放行) --><!-- 1. 放行CSS资源:URL以/css/开头 → 映射到WEB-INF/templates/html/css/目录 --><mvc:resourcesmapping="/css/**"location="/WEB-INF/templates/html/css/"/><!-- 2. 放行JS资源:URL以/js/开头 → 映射到WEB-INF/templates/html/js/目录 --><mvc:resourcesmapping="/js/**"location="/WEB-INF/templates/html/js/"/><!-- 3. 放行图片资源:URL以/images/开头 → 映射到WEB-INF/templates/html/images/目录 --><mvc:resourcesmapping="/images/**"location="/WEB-INF/templates/html/images/"/><!-- 4. 放行图标资源(font-awesome):URL以/font-awesome/开头 → 映射到对应目录 --><mvc:resourcesmapping="/font-awesome/**"location="/WEB-INF/templates/html/font-awesome/"/><!-- 5. 放行字体资源:URL以/fonts/开头 → 映射到对应目录 --><mvc:resourcesmapping="/fonts/**"location="/WEB-INF/templates/html/fonts/"/><!-- 其他配置(视图解析器、数据源等,原有配置不变) -->
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

2.2.3 核心参数说明(避免踩坑)

参数名示例配置作用与注意事项
mapping/css/**1. **表示“匹配该路径下所有子目录和文件”,如/css/**可匹配/css/style.css/css/common/base.css
2. 必须以/开头,且末尾需加/**,否则无法匹配子目录资源。
location/WEB-INF/templates/html/css/1. 必须指向项目中静态资源的实际物理路径,末尾必须加/,否则会少一层目录;
2. 路径需与项目结构完全一致(参考本文“1.1 项目结构”),错一个字符都会导致404。

2.2.4 注意事项

  1. 配置顺序不影响效果:多个<mvc:resources>标签的顺序无需严格区分,SpringMVC会自动匹配对应的mapping规则。
  2. 与方法一互斥:若同时配置<mvc:default-servlet-handler><mvc:resources><mvc:resources>的优先级更高,会优先处理匹配的静态资源,未匹配的资源才会由default-servlet-handler处理。
  3. 适用场景:推荐用于本次项目这类“静态资源放在WEB-INF深层目录”的场景,或需要精确控制资源访问的项目(如只允许特定角色访问某类资源)。

我的个人主页,欢迎来阅读我的其他文章
https://blog.ZEEKLOG.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.ZEEKLOG.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦
在这里插入图片描述

Read more

在 GitHub 上找到适合学术图表(尤其是神经网络组件)的 Draw.io 模板

在 GitHub 上找到适合学术图表(尤其是神经网络组件)的 Draw.io 模板

一、核心搜索策略 2. 学术通用模板与库 三、技巧与注意事项 相关链接:https://github.com/WangX0111/drawio-nn-templates 效果: 1. drawio-nn-templates * 特点:包含 CNN、RNN、深度信念网络(DBN)等常见神经网络结构的模板,支持直接导入 Draw.io 编辑,高度可定制。 * 使用步骤: 1. 克隆或下载仓库到本地。 2. 在 Draw.io 中选择「文件 → 打开库 → 从设备」,加载模板文件。 3. 直接拖拽组件或修改现有结构,适配研究需求。 * 地址:GitHub - drawio-nn-templates 2. kennethleungty/Neural-Network-Architecture-Diagrams * 特点:

《开源圈聚焦的技术新作:讯飞 Astron Agent 的 “工作流编排 + MCP 工具集”,如何降低企业智能体开发门槛》

《开源圈聚焦的技术新作:讯飞 Astron Agent 的 “工作流编排 + MCP 工具集”,如何降低企业智能体开发门槛》

前引:今天我们不谈趣味互动类的小智能体,而是聚焦又一个开源的企业级智能体 “基建”—— 讯飞星辰推出的 Astron Agent。作为讯飞首个开源的企业级智能体平台,它把 AI 工作流编排、RPA 自动化、MCP 工具集打包成了可直接复用的基座,刚上线 GitHub 就拿下 6k+ Star,连科技圈都在讨论它怎么降低企业做智能体的门槛! 本文将聚焦于:与其同时开源的RPA介绍及智能体平台Astron Agent 中各个工具的详细使用                                    不是广告!不是广告!不是广告!真心推荐! 目录  【一】Astron智能体平台介绍 【二】RPA介绍 【三】Astron部署登录 (2)登录过程 (2)全程体验 【四】几个重要工具详解 (1)什么是系统/用户提示词 (2)代码节点 (3)什么时候用知识库 (4)

Jenkins Git 克隆失败深度解析:从 “Connection reset by peer“ 到彻底解决

Jenkins Git 克隆失败深度解析:从 “Connection reset by peer“ 到彻底解决

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * Jenkins Git 克隆失败深度解析:从 "Connection reset by peer" 到彻底解决 * 引言:持续集成的脆弱环节