Spring Boot访问JSP遇404及自定义错误页无法加载问题
Spring Boot访问JSP出现404及控制器映射失效问题
问题现象
- 访问
http://localhost:8085/出现404错误,提示“此localhost页面无法找到” - 自定义
CustomErrorController中打印errorMessage的日志正常输出,但无法返回对应的error.jsp页面 HomeController中根路径@GetMapping("/")的方法未触发日志输出,请求直接进入错误控制器逻辑
HomeController代码
package com.bhagya.app; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home() { System.out.println("hello"); return "index"; // 对应views文件夹下的home.jsp } }
CustomErrorController代码
package com.bhagya.app; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class CustomErrorController implements ErrorController { @GetMapping("/error") public String handleError(Exception e) { System.out.println("errorMessage "); // 处理错误并返回自定义错误页面 return "error"; // 对应views文件夹下的error.jsp } public String getErrorPath() { return "/error"; } }
项目启动及请求日志
. ____ _ __ _ _ /\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.2) 2024-02-02T06:44:36.155+05:30 INFO 19404 --- [ main] com.bhagya.app.Web2Application : Starting Web2Application using Java 17.0.9 with PID 19404 (C:\Users\bhagy\web-2\target\classes started by bhagy in C:\Users\bhagy\web-2) 2024-02-02T06:44:36.159+05:30 INFO 19404 --- [ main] com.bhagya.app.Web2Application : No active profile set, falling back to 1 default profile: "default" 2024-02-02T06:44:37.270+05:30 INFO 19404 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8085 (http) 2024-02-02T06:44:37.284+05:30 INFO 19404 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2024-02-02T06:44:37.285+05:30 INFO 19404 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.18] 2024-02-02T06:44:37.358+05:30 INFO 19404 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2024-02-02T06:44:37.359+05:30 INFO 19404 --- [ main] w.s.c.ServletWebServerApplicationContext: Root WebApplicationContext: initialization completed in 1141 ms 2024-02-02T06:44:37.770+05:30 INFO 19404 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8085 (http) with context path '' 2024-02-02T06:44:37.781+05:30 INFO 19404 --- [ main] com.bhagya.app.Web2Application : Started Web2Application in 2.209 seconds (process running for 3.126) 2024-02-02T06:44:43.900+05:30 INFO 19404 --- [nio-8085-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2024-02-02T06:44:43.900+05:30 INFO 19404 --- [nio-8085-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2024-02-02T06:44:43.902+05:30 INFO 19404 --- [nio-8085-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms errorMessage errorMessage
问题分析与解决方案
1. 补全JSP相关依赖与配置
Spring Boot默认不支持JSP视图,需手动添加依赖并配置路径:
- Maven依赖(添加到
pom.xml):
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>
- 视图路径配置(添加到
application.properties):
spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp
- 确保JSP文件放在
src/main/webapp/WEB-INF/views/目录下,比如home.jsp对应路径为src/main/webapp/WEB-INF/views/home.jsp,控制器返回值需与文件名一致(比如返回home而非index)。
2. 修复CustomErrorController代码问题
- 删除重复的
@Controller和@RequestMapping注解; - Spring Boot 2.3+后
getErrorPath()方法已弃用,无需保留; - 确保
error.jsp放在正确的视图目录下。
修改后的代码:
package com.bhagya.app; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class CustomErrorController implements ErrorController { @GetMapping("/error") public String handleError() { System.out.println("errorMessage "); return "error"; } }
3. 确保HomeController被正确扫描
- 检查启动类
Web2Application的包路径:如果启动类在com.bhagya下,com.bhagya.app会被自动扫描;否则需在启动类添加@ComponentScan(basePackages = "com.bhagya.app"); - 修正控制器返回值与JSP文件名的对应关系:如果JSP文件是
home.jsp,控制器需返回home。
4. 清理重建项目
- Eclipse中执行
Project -> Clean,再执行Maven -> Clean和Maven -> Install; - 重启Spring Boot应用后重新访问
http://localhost:8085/。
内容的提问来源于stack exchange,提问作者Bhagya Sri
相关产品推荐
相关产品推荐

