MVC架构下点击HTML文本获取游戏详情的页面空白问题排查
首先看你遇到的问题:点击游戏标题跳转后success.jsp空白,核心问题出在JSP页面的代码逻辑错误上,我帮你梳理下:
主要问题点
错误使用
<c:forEach>遍历单个对象:
你的GameIdController中把单个Game对象存入了request.setAttribute("Game", game);,但在JSP里却用<c:forEach items="${requestScope.Game}" var="game">来遍历——<c:forEach>是用来遍历集合(比如List、数组)的,单个对象无法被遍历,所以这段代码完全不会执行,自然看不到内容。无效的语法错误:
页面里的$game = ${requestScope.Game}是错误的JSP语法,既不是Java代码块也不是EL表达式,会被直接当作文本输出,但因为前面的forEach没执行,加上这个错误代码也不会正确渲染内容。场景未区分导致的冗余渲染:
当前页面同时处理搜索结果列表和单个游戏详情两种场景,但没有做互斥判断——当打开单个游戏详情时,搜索结果的<c:forEach items="${requestScope.games}"...>也会执行,但此时requestScope.games是不存在的,虽然不会报错,但属于冗余逻辑,也可能影响页面结构。
修正后的success.jsp代码
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link rel="stylesheet" type="text/css" href="style.css"> <title>Search results</title> </head> <body> <%-- 搜索结果列表场景 --%> <c:if test="${not empty requestScope.games}"> <fieldset id="IGDB"> <legend> IGDB search for <c:out value="${param.searchQuery}" /> </legend> <c:forEach items="${requestScope.games}" var="game"> <article name="gameArticle" id="gameArticle"></article> <a href="GameIdController?id=${game.id}"><c:out value="${game.name}" /></a> <br /> </c:forEach> </fieldset> </c:if> <%-- 单个游戏详情场景 --%> <c:if test="${requestScope.Item=='gameID' and not empty requestScope.Game}"> <fieldset id="GameDetails"> <legend>Game Details</legend> <article name="gameByIDArticle" id="gameByIDArticle"> <h2><c:out value="${Game.name}" /></h2> <%-- 这里可以添加更多游戏详情字段,比如描述、发行日期等,根据你的Game类属性来 --%> <%-- 示例:<p>Release Date: <c:out value="${Game.releaseDate}" /></p> --%> </article> </fieldset> </c:if> </body> </html>
修改说明
- 用
<c:if>做了场景区分:只有当requestScope.games存在时,才渲染搜索结果列表;只有当Item=='gameID'且Game对象不为空时,才渲染单个游戏详情。 - 去掉了错误的
<c:forEach>遍历单个Game对象的代码,直接通过EL表达式${Game.name}获取单个对象的属性。 - 移除了无效的
$game = ${requestScope.Game}代码,避免语法错误。 - 给游戏详情部分添加了基础的结构,你可以根据
Game类的实际属性扩展更多展示内容。
另外,建议你在GameIdController的if分支里补上rd.forward(request, response);——当前代码里只有else分支有forward,if分支遗漏会导致跳转失败:
if(game!=null) { rd = request.getRequestDispatcher("/success.jsp"); request.setAttribute("Game", game); request.setAttribute("Item", "gameID"); rd.forward(request, response); // 补上这行 } else { // ... else分支代码 }
内容的提问来源于stack exchange,提问作者rayo329

