jsp - Tomcat 吞下 SQLException

标签 jsp tomcat exception

我正在使用 Oracle 11g(瘦驱动程序)和 Java 6 在 Windows 上的 Tomcat 7 中开发一个应用程序。我正在开发一个页面,让用户验证存储在 Oracle 数据库中的 SQL 语句。我的计划是使用 Oracle 中的 EXPLAIN PLAN FOR 功能来执行此操作。

我有一个 JSP,它在 try-catch-finally block 中执行 SQL 语句,如下所示:

String error = "";
try {
    Context initCtx = new InitialContext();
    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    DataSource ds = (DataSource)envCtx.lookup("jdbc/myDatabase");
    con = ds.getConnection();
    st = con.prepareStatement(sql);
    st.execute();
} catch(SQLException e) {
    error = "SQL error: "  + e.getMessage();
} finally {
    if(rs != null) rs.close();
    if(st != null) st.close();
    if(con != null) con.close();
}
// respond with error....

当传递一个已知有效的 SQL 语句时,JSP 会做出相应的响应。然而,当错误被引入 SQL 语句(“SELECT fubar FROM mytable”)时,SQLException 不会被 JSP 捕获并且 st.execute() 语句不会返回,就像它卡在循环中一样。

Tomcat 日志显示 SQL 错误。我试过在 logging.properties 文件中使用不同的设置,我也试过使用 Log4J。我还在 Tomcat 6 中尝试过相同的代码,并且尝试将 JSP 中的代码移动到 DAO bean。这些都没有帮助。

看来肯定是 Tomcat 记录器吞下了 SQLExceptions,我该如何改变这种行为?我最近从 Tomcat 5 升级到 Tomcat 7,我不记得以前有过这个问题,但我在互联网上找不到任何关于此的信息。有人有什么想法吗?

最佳答案

Tomcat 无法更改响应以完整显示错误页面,因为响应已经提交给客户端。响应已经提交,因为您正在使用 JSP(仅用于呈现结果)而不是普通的 Java 类(如 servlet)来执行前/后处理工作。

每当 JSP 向响应发送一定数量的模板数据(HTML 等)时,它就会被提交,这是一个不归路。客户端已经收到响应的第一部分。如果在那之后发生异常,那么服务器就无法收回那部分。将记录异常,但响应停留在那里。客户得到的只是半生不熟的回应。

解决这个问题相当简单:在业务作业完成之前不要向响应写入任何内容。基本上有两种方法可以实现这一点:

  1. 将所有 Java 代码放在一个大的 <% %> 中在 JSP 文件的顶部。在所有业务工作完成之前,JSP 不应向响应发送任何字符。

  2. 摆脱 JSP 中的所有 Java 代码并将其移至 servlet 类中。在其中,您可以自由地以正常方式编写 Java 代码并处理异常和控制响应。

不用说,在 MVC 看来,第二种方式更可取。

另见:

关于jsp - Tomcat 吞下 SQLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8523695/

相关文章:

javascript - 从 url 中删除 webjars 版本

java - PageContext线程是否共享

xml - 使用 Spring/Tomcat 的库来解析 XML

jsp - Adobe CQ5的助手是空的(未显示任何组件)

java - 在维护期间更改 Java EE 应用程序的欢迎页面

java - 将 java servlet 作为独立进程运行

bash - CATALINA_OPTS 调试选项

exception - NetBeans:打开 -e 开关重新运行 Maven/PluginResolutionException

c# - 为什么编译器检测不到这里会抛出异常呢?

java - NavigableMap : java. lang.IllegalArgumentException:键超出范围