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

《前端文件下载实战:从原理到最佳实践》

《前端文件下载实战:从原理到最佳实践》

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * 《前端文件下载实战:从原理到最佳实践》 * 引言 * 一、需求背景与初始实现 * 1.1 业务需求 * 1.2 初始后端实现 * 1.3

By Ne0inhk
五分钟入门控制算法:MPC(模型预测控制)算法

五分钟入门控制算法:MPC(模型预测控制)算法

什么是控制算法?         比如我现在的无人机悬浮在空中的某个位置,我想要让他以最短时间抬升悬浮到上方10m的位置,那我要具体如何去调整输入(如电流、油门、功率),以最好的性能(时间最短)来达到预期的目标呢?那就需要控制算法来求解,来调整这些输入。         控制算法(Control Algorithm)本质上是一套控制机械系统运作的“数学指挥指令”。它告诉机器(如无人机、恒温空调、机械臂)如何根据目前的状态,通过调整输入(如电流、油门、功率)来达到预期的目标。         不同的算法有不同的使用场景与特性,有些适用于动态系统,有些适用于静态。有些适用于低阶系统,有些适用于高阶系统。有些计算量小,有些计算量大。所以衍生出了很多种控制算法。         如何根据不同的场景选择合适的控制算法,创造更厉害的控制算法,调整控制算法的参数使得任务完成的效果更好;如何让实时波形图(如 rqt_plot)更加贴合跟踪曲线;如何对机械系统编写“保护逻辑” ;如何处理传感器噪声与延迟,用一些滤波算法(卡尔曼滤波)做更好的状态估计。如何增加前馈(

By Ne0inhk

黑马程序员java web学习笔记--后端进阶(二)SpringBoot原理

目录 1 配置优先级 2 Bean的管理 2.1 Bean的作用域 2.2 第三方Bean 3 SpringBoot原理 3.1 起步依赖 3.2 自动配置 3.2.1 实现方案 3.2.2 原理分析 3.2.3 自定义starter 1 配置优先级 SpringBoot项目当中支持的三类配置文件: * application.properties * application.yml ❤ * application.yaml 配置文件优先级排名(从高到低):properties配置文件 > yml配置文件 > yaml配置文件 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置。

By Ne0inhk

快速部署指南:CV-UNet图像抠图WebUI搭建

快速部署指南:CV-UNet图像抠图WebUI搭建 你是否还在为一张证件照反复调整魔棒选区而头疼?是否因为电商主图要批量换背景,不得不熬夜修图到凌晨?有没有试过打开PyTorch代码、配置CUDA环境、下载模型权重,结果卡在ModuleNotFoundError: No module named 'torch'就再也没继续下去? 别折腾了。今天这篇指南不讲原理、不配环境、不写代码——只做一件事:从镜像启动到完成第一张人像抠图,全程不超过90秒。 我们用的是由开发者“科哥”二次开发构建的 cv_unet_image-matting图像抠图 webui 镜像。它不是Demo,不是玩具,而是一个真正开箱即用、界面清爽、参数直观、结果可靠的生产级AI抠图工具。没有命令行黑框,没有报错日志,只有紫蓝渐变的界面、三秒出图的响应,和一张干净利落的透明背景人像。 本文就是为你写的——给没装过CUDA的运营、没写过Python的设计师、不想碰终端的剪辑师,一份真正能“照着点、就能用”的部署实录。

By Ne0inhk