SpringBoot应用无法返回视图,访问出现404错误求助
问题描述
我知道这类问题大概率有很多相关讨论,但我找不到能解决自己问题的内容(确实是因为不知道该怎么检索)。我正在构建一个非常基础的SpringBoot Web应用,无论如何都没法让控制器返回展示数据库所有用户列表的视图。
控制器代码
@Controller @RequestMapping("/usuario") public class UsuarioController { private final UsuarioDAO usuarioDAO; public UsuarioController(UsuarioDAO usuarioDAO){ this.usuarioDAO = usuarioDAO; } @GetMapping("/exibirUsuario") public String exibirUsuario(Model model){ model.addAttribute("usuarios", usuarioDAO.getUsuarios()); return "ExibirU.jsp"; } }
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>poowspring</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>poowspring</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>3.1.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
application.properties配置
spring.datasource.url=jdbc:postgresql://localhost:5432/csi.poow1 spring.datasource.username=postgres spring.datasource.password=1234 spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
排查与解决建议
- 修正视图返回值:配置里已经指定了视图后缀
.jsp,控制器返回时不需要重复添加,把return "ExibirU.jsp";改成return "ExibirU";。 - 检查视图文件路径:确认
ExibirU.jsp放在src/main/webapp/WEB-INF/jsp/目录下,文件名大小写和路径必须完全匹配。 - 替换JSTL依赖:Spring Boot 3.x基于Jakarta EE规范,原
javax.servlet:jstl依赖会和新版本冲突,移除旧依赖后添加以下Jakarta版本的JSTL依赖:
<dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency>
- 验证DAO数据获取:在控制器方法中添加日志或断点,确认
usuarioDAO.getUsuarios()能正常从数据库拿到数据,排除DAO层或数据库连接问题。 - 调整打包与Tomcat配置:如果是本地运行应用,把pom.xml中的
<packaging>war</packaging>改成<packaging>jar</packaging>,同时移除spring-boot-starter-tomcat的<scope>provided</scope>,确保内嵌Tomcat能正确处理JSP视图。 - 检查JSP渲染逻辑:确保JSP文件正确引入JSTL标签并遍历用户列表,示例代码如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <title>用户列表</title> </head> <body> <h2>所有用户</h2> <c:if test="${empty usuarios}"> <p>暂无用户数据</p> </c:if> <c:if test="${not empty usuarios}"> <table border="1"> <tr> <th>ID</th> <th>用户名</th> <!-- 根据你的实体类字段调整列名 --> </tr> <c:forEach items="${usuarios}" var="user"> <tr> <td>${user.id}</td> <td>${user.username}</td> </tr> </c:forEach> </table> </c:if> </body> </html>
内容的提问来源于stack exchange,提问作者Gian Gabriel
相关产品推荐
相关产品推荐

