Servlet与JSP映射不匹配 点击链接无响应如何解决
问题根因与修复方案
核心问题:导航链接地址配置错误
页面中「Listino Videogiochi」的导航链接直接指向JSP文件,完全绕过了Servlet的请求映射,Servlet中查询数据、转发页面的逻辑根本不会执行,这是点击后无预期效果的最主要原因:
<!-- 错误写法:直接访问静态JSP,不经过业务逻辑处理 --> <li><a href ="listinoVideogiochi.jsp" class="active"> Listino Videogiochi </a></li>
将链接地址改为Servlet配置的@WebServlet对应的urlPatterns路径即可:
<!-- 正确写法:先请求Servlet执行业务逻辑,再由Servlet转发到JSP渲染 --> <li><a href ="listinoVideogiochi" class="active"> Listino Videogiochi </a></li>
其余会导致功能异常的问题
- JSP缺少JSTL标签库声明
页面中使用了<c:set>、<c:if>、<c:forEach>等JSTL标签,但未在页面顶部引入标签库,会直接导致JSP编译失败。需要在JSP文件最开头、<!DOCTYPE html>之前添加如下声明:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - EL表达式写法错误
页面中写的${empty utente.getUsername()}、${videogiochi.getTitolo()}这类调用getter的写法不符合EL语法规范,EL会自动匹配实体类的getter方法,直接写属性名即可,例如${empty utente.username}、${videogiochi.titolo}。同时需要确认登录逻辑执行成功后,确实将utente对象存入了Session作用域,否则页面会一直重定向到登录页。 - 数据库查询逻辑未给实体对象赋值
VideogiocoFactory的getAllVideogiochi()方法中,遍历ResultSet时仅创建了空的Videogioco对象,没有从查询结果中读取字段给对象属性赋值,最终返回的列表里全是空属性的对象,页面无法渲染出任何游戏数据。需要在while循环中补全属性赋值逻辑,字段名与数据库表、实体类属性对应即可:while (set.next()) { Videogioco videogioco = new Videogioco(); videogioco.setTitolo(set.getString("titolo")); videogioco.setGenere(set.getString("genere")); videogioco.setUrl_Foto(set.getString("url_foto")); // 其余价格、发行时间、配置要求等属性按相同方式补全赋值 videogiochi.add(videogioco); } - JSP存在语法与结构错误
- 游戏封面的img标签未闭合,src属性的EL表达式写了一半,会导致页面渲染错乱:
修正为:<!-- 错误写法,标签未闭合 --> <img title ="BlackMesa" alt="Foto del gioco di Black Mesa" src="${videogiochi.getUrl_Foto(<img title="BlackMesa" alt="Foto del gioco di Black Mesa" src="${videogiochi.url_Foto}" /> - JSTL逻辑标签放错位置:
<c:set>、<c:if>标签放在了<head>和<body>之间,不符合HTML语法规范,需要移到页面顶部(标签库声明之后)或<body>标签最开头。 - 页面多写了一个多余的
</article>闭合标签,会导致HTML结构错乱,直接删除即可。
- 游戏封面的img标签未闭合,src属性的EL表达式写了一半,会导致页面渲染错乱:
- 数据库资源关闭存在空指针风险
getAllVideogiochi()方法的finally块中,没有判断Connection、PreparedStatement、ResultSet对象是否为null就直接调用close()方法,如果数据库连接初始化阶段就抛出异常,会触发空指针错误。需要添加非空判断:finally { try {if (set != null) set.close();} catch (Exception e) {} try {if (stmt != null) stmt.close();} catch (Exception e) {} try {if (conn != null) conn.close();} catch (Exception e) {} }
内容的提问来源于stack exchange,提问作者erica
相关产品推荐
相关产品推荐

