我正在使用Oracle 11g(瘦驱动程序)和Java 6在Windows上的Tomcat 7中开发应用程序。我正在开发一个页面,允许用户验证存储在Oracle数据库中的SQL语句。我的计划是使用Oracle中的EXPLAIN PLAN FOR功能来执行此操作。
我有一个JSP,它在try-catch-finally块中执行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”)时,JSP不会捕获SQLException,并且st.execute()语句不会返回,就像它停留在循环中一样。
Tomcat日志显示SQL错误。我尝试在logging.properties文件中使用不同的设置,我也尝试过使用Log4J。我也在Tomcat 6中尝试过相同的代码,我尝试将JSP中的代码移动到DAO bean中。这些都没有帮助。
看起来似乎是吞噬SQLExceptions的Tomcat记录器,我该如何改变这种行为?我最近从Tomcat 5升级到Tomcat 7,我不记得以前这是一个问题,但我在互联网上找不到任何关于此的内容。有人有什么想法吗?
答案 0 :(得分:1)
Tomcat无法更改响应以显示错误页面的完整荣耀,因为响应已经提交给客户端。响应已经提交,因为您使用JSP(仅用于呈现结果)而不是普通的Java类(如servlet)来执行前/后处理作业。
当JSP向响应发送一定数量的模板数据(HTML等)时,它会被提交,这是一个不归路的点。客户已收到响应的第一部分。如果在此之后发生异常,则服务器根本无法取回该部分。将记录该异常,但响应仍然存在。所有客户得到的都是半熟的回应。
解决此问题非常简单:在业务作业完成之前,不要在响应中写入任何内容。基本上有两种方法可以实现这一目标:
将所有Java代码放在JSP文件的 top 中的一个大<% %>
中。在完成所有业务工作之前,JSP不应该向响应发送任何字符。
摆脱JSP中的所有Java代码并将其移动到servlet类中。在这里,您可以自由地以正常方式编写Java代码并处理异常并控制响应。
毋庸置疑,第二种方式在MVC意见中更为可取。