spring mvc需配置静态资源映射以避免404,常用方式是用声明url路径与物理位置映射,或用委托容器默认servlet处理;注意路径前缀隔离、配置生效条件及spring boot默认支持。

Spring MVC 默认会把所有请求(包括 .css、.js、图片等静态资源)都交给 DispatcherServlet 处理,而它本身不负责返回文件内容,导致 404。要让静态资源能被正常访问,关键在于**用路径匹配规则明确告诉框架:哪些 URL 是静态资源,应跳过 Controller 处理流程**。核心方式是通过配置映射规则,把请求导向资源处理器或容器默认 Servlet。
用 <resources></resources> 显式声明资源路径
这是最常用、最可控的方式。在 Spring 配置文件(如 springmvc-config.xml)中添加:
-
<annotation-driven></annotation-driven>必须存在,否则<resources></resources>不生效 -
mapping是浏览器请求的 URL 路径模式,支持 Ant 风格通配符:**(多层)、*(单层)、?(单字符) -
location是服务器上静态资源的实际物理路径,末尾必须带/ - 例如:
<resources mapping="/static/**" location="/WEB-INF/static/"></resources>表示所有以/static/开头的请求,都去/WEB-INF/static/目录下找对应文件 - JSP 中引用时写
<link href="/static/css/app.css">,路径与mapping保持一致
用 <default-servlet-handler></default-servlet-handler> 委托给容器处理
当不想显式定义每个资源路径时,可启用该配置,让 Spring 把无法匹配 Controller 的请求,自动转交 Tomcat 等容器的默认 Servlet(如 default)处理:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 只需在配置文件中加一行:
<default-servlet-handler></default-servlet-handler> - 它内部会注册
DefaultServletHttpRequestHandler,对所有未匹配的请求做二次分发 - 若你用的不是 Tomcat(比如 Resin 或 WebLogic),需指定
default-servlet-name属性 - 优点是简单,缺点是无法控制缓存头、版本化、资源压缩等高级功能
避免路径冲突的常见实践
静态资源路径和 Controller 路径容易重名(比如同时有 /login 接口和 /login.html 页面),引发优先级问题:
- 推荐为静态资源统一加前缀,如
/res/**或/assets/**,与业务路径隔离 - 不要把静态资源放在
/根路径下直接映射,否则可能被 Controller 覆盖 - 若使用 Spring Boot,默认已自动配置四个标准位置:
classpath:/static、classpath:/public、classpath:/resources、classpath:/META-INF/resources,无需额外配置 - 自定义
static-locations时,注意是覆盖而非追加——想保留默认位置,就得全部重新列出
验证是否生效的关键点
配置完别急着重启,先检查几个易错环节:
- 确保
web.xml中DispatcherServlet的<url-pattern>/</url-pattern>确实存在(这是触发问题的前提) - 查看项目构建后,静态文件是否真实出现在目标目录(如
target/xxx/WEB-INF/static/) - 浏览器开发者工具 Network 标签页里,看 CSS/JS 请求返回的是 200 还是 404,响应头是否有
Content-Type - 如果用了 JSP,引用路径建议统一用
${pageContext.request.contextPath},避免硬编码上下文路径
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










