JSP中Try块内插入HTML标签引发Catch块报错的解决咨询
解决JSP中Try块插入HTML导致Catch报错的问题
兄弟,我太懂你踩的这个坑了!你遇到的核心问题是JSP的脚本代码块被HTML打断后,Java的try-catch语法结构被拆分了——当你在try里用%>插入HTML时,相当于当前的Java代码块直接结束了,后面的catch自然找不到对应的try,编译器肯定会报错。
下面给你两种解决方案,从现代最佳实践到兼容旧代码的写法都有:
方案一:用JSTL + EL(推荐,告别混乱脚本)
现在JSP早就不推荐用<% %>这种脚本式代码了,用JSTL标签库结合EL表达式来展示数据,结构更清晰,也不会出现语法嵌套问题:
- 先在页面顶部引入JSTL核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
- 执行查询并展示表格(更推荐在Servlet中完成数据库查询,把结果转成List放到request域再转发到JSP,这里先演示JSTL SQL标签的写法):
<!-- 配置数据源 --> <sql:setDataSource var="dbCon" driver="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/你的数据库名" user="用户名" password="密码"/> <!-- 执行查询 --> <sql:query var="certResult" dataSource="${dbCon}"> Select * from Certificate </sql:query> <!-- 展示表格 --> <table border="1" cellpadding="5"> <tr> <!-- 根据你的表字段定义表头 --> <th>证书ID</th> <th>证书名称</th> <th>颁发日期</th> </tr> <c:forEach var="row" items="${certResult.rows}"> <tr> <td>${row.id}</td> <td>${row.cert_name}</td> <td>${row.issue_date}</td> </tr> </c:forEach> </table>
方案二:如果必须用脚本代码(兼容旧项目)
要是你得保留原有脚本写法,那必须保证try-catch的Java逻辑是完整的,HTML部分可以嵌入在脚本块内部,不要打断try的结构:
<% PreparedStatement pst = null; ResultSet rs = null; try { pst = con.prepareStatement("Select * from Certificate"); rs = pst.executeQuery(); %> <!-- 这里的HTML属于try块内部,没有关闭Java代码块 --> <table border="1" cellpadding="5"> <tr> <th>证书ID</th> <th>证书名称</th> </tr> <% // 循环遍历结果集 while(rs.next()) { %> <tr> <td><%= rs.getInt("id") %></td> <td><%= rs.getString("cert_name") %></td> </tr> <% } %> </table> <% } catch(SQLException e) { e.printStackTrace(); // 输出错误提示 out.println("<p style='color:red;'>查询出错:" + e.getMessage() + "</p>"); } finally { // 务必关闭资源,避免连接泄漏 if(rs != null) rs.close(); if(pst != null) pst.close(); } %>
这里的关键是:<% try { %> 开启try后,直接写HTML,之后用<%回到Java代码继续逻辑,最后在同一个脚本块里完成catch和finally,保证整个try-catch-finally是完整的Java语法结构。
另外提醒一句:尽量不要在JSP里直接写数据库操作,把查询逻辑放到Servlet或者Service层,JSP只负责展示数据,这样代码更易维护~
内容的提问来源于stack exchange,提问作者achilles59
相关产品推荐
相关产品推荐

