Spring MVC 无法显示 JSP 页面的常见原因与解决方案
发布时间 - 2025-12-26 00:00:00 点击率:次本文详解 spring mvc 项目中 jsp 视图无法正常渲染的典型问题,重点分析组件扫描范围配置不当导致控制器未被识别、视图解析器失效等核心原因,并提供可立即验证的配置修复方案。
在 Spring MVC 项目中,当访问映射 URL(如 /home)时返回 Whitelabel Error Page(404 或 500),而非预期的 home.jsp,通常并非 JSP 本身语法错误,而是Spring 容器未能正确加载控制器或视图解析链断裂。结合你提供的项目结构与配置片段,最常见且易被忽略的根本原因是:@ComponentScan 扫描路径未覆盖 Controller 所在包。
✅ 正确的包结构与组件扫描配置
假设你的项目采用标准 Maven 结构,且 Controller 类位于 com.example.demo.controller.HomeController,那么:
-
❌ 错误配置(仅扫描 com.example.config):
@Configuration @EnableWebMvc @ComponentScan("com.example.config") // ← 仅扫描配置类,Controller 不在此路径下! public class WebConfig implements WebMvcConfigurer { ... } -
✅ 正确配置(扫描父级基础包):
@Configuration @EnableWebMvc @ComponentScan("com.example") // ← 扫描 com.example 及其所有子包(含 controller、service、config 等) public class WebConfig implements WebMvcConfigurer { ... }
? 为什么必须是 "com.example"? 因为 @ComponentScan 的值是包前缀匹配,不是通配符。若 Controller 在 com.example.demo.controller,而扫描路径只设为 com.example.config,Spring 将完全忽略该 Controller——它根本不会被注册进 IoC 容器,自然无法响应请求,DispatcherServlet 查找不到对应 handler,最终抛出 404 并显示 Whitelabel 页面。
✅ 补充关键配置检查项(缺一不可)
确保以下配置完整、路径准确:
-
ViewResolver 必须正确定义(JSP 专用):
@Bean public ViewResolver viewResolver(
) {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // 注意结尾斜杠
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class); // 启用 JSTL 支持(推荐)
return resolver;
} JSP 文件存放位置必须符合约定:
src/main/webapp/WEB-INF/views/home.jsp —— 路径必须与 viewResolver.setPrefix() 严格一致,且 不能放在 src/main/resources 或 src/main/java 下(这些路径不参与 Web 资源发布)。-
Controller 方法需使用 @Controller(非 @RestController):
@Controller public class HomeController { @GetMapping("/home") public String showHome() { return "home"; // → 解析为 /WEB-INF/views/home.jsp } } -
Maven 依赖需包含 JSP 运行时支持(尤其 Spring Boot 3+ 或 Tomcat 10+):
若使用较新 Tomcat(如 10.x),注意 javax.* 已迁移至 jakarta.*,需确认 pom.xml 中引入的是兼容版本:javax.servlet jstl1.2 jakarta.servlet.jsp.jstl jakarta.servlet.jsp.jstl-api2.0.0
⚠️ 注意事项与调试建议
- 禁用 @RestController:它会强制返回 JSON/文本,忽略 ViewResolver,永远无法跳转 JSP。
- 检查 Tomcat 日志:启动时搜索 Mapped 关键字,确认类似 Mapped "{[/home]}" 是否出现——若无,则 Controller 未被扫描。
- 验证 DispatcherServlet 映射:确保 WebApplicationInitializer 或 ServletWebServerFactory 正确注册了 DispatcherServlet,且 urlPatterns 包含 /(非 /*.html 等限制性模式)。
- 避免混合配置:勿同时使用 XML 配置(dispatcher-servlet.xml)和 Java Config,易引发冲突;统一采用一种方式。
通过将 @ComponentScan("com.example") 设为项目根包,并配合正确的视图解析路径与依赖,90% 以上的“Spring MVC 不显示 JSP”问题即可解决。记住:Spring MVC 的请求流转始于容器发现 Controller,止于 ViewResolver 定位资源——二者缺一不可。
# java
# html
# js
# json
# app
# tomcat
# ai
# spring mvc
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
🚀拖拽式CMS建站能否实现高效与个性化并存?
如何在云主机快速搭建网站站点?
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Android 常见的图片加载框架详细介绍
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
Laravel如何记录自定义日志?(Log频道配置)
实例解析Array和String方法
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Android Socket接口实现即时通讯实例代码
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
高性能网站服务器配置指南:安全稳定与高效建站核心方案
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
高端网站建设与定制开发一站式解决方案 中企动力
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
什么是javascript作用域_全局和局部作用域有什么区别?
Laravel如何处理异常和错误?(Handler示例)
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Laravel怎么使用Intervention Image库处理图片上传和缩放
如何基于PHP生成高效IDC网络公司建站源码?
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何用已有域名快速搭建网站?
如何用免费手机建站系统零基础打造专业网站?
如何在香港免费服务器上快速搭建网站?
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
大同网页,大同瑞慈医院官网?
Laravel如何发送系统通知?(Notification渠道示例)
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Bootstrap整体框架之CSS12栅格系统
lovemo网页版地址 lovemo官网手机登录
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
如何快速完成中国万网建站详细流程?
如何在VPS电脑上快速搭建网站?
在线教育网站制作平台,山西立德教育官网?
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
简单实现jsp分页
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
利用vue写todolist单页应用


) {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // 注意结尾斜杠
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class); // 启用 JSTL 支持(推荐)
return resolver;
}