You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSP中Try块内插入HTML标签引发Catch块报错的解决咨询

解决JSP中Try块插入HTML导致Catch报错的问题

兄弟,我太懂你踩的这个坑了!你遇到的核心问题是JSP的脚本代码块被HTML打断后,Java的try-catch语法结构被拆分了——当你在try里用%>插入HTML时,相当于当前的Java代码块直接结束了,后面的catch自然找不到对应的try,编译器肯定会报错。

下面给你两种解决方案,从现代最佳实践到兼容旧代码的写法都有:

方案一:用JSTL + EL(推荐,告别混乱脚本)

现在JSP早就不推荐用<% %>这种脚本式代码了,用JSTL标签库结合EL表达式来展示数据,结构更清晰,也不会出现语法嵌套问题:

  1. 先在页面顶部引入JSTL核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
  1. 执行查询并展示表格(更推荐在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:55:35