我正在使用Oracle 11g (瘦驱动程序)和Java 6在windows上开发一个Tomcat 7应用程序,我正在开发一个允许用户验证存储在Oracle数据库中的SQL语句的页面。我的计划是使用Oracle中的“解释计划”功能来完成此操作。
我有一个JSP,它在一个尝试捕获-最终块中执行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语句(“从mytable中选择fubar”)时,SQLException不会被JSP捕获,而st.execute()语句不会返回,就像卡在循环中一样。
Tomcat日志显示SQL错误。我尝试在logging.properties文件中使用不同的设置,也尝试使用Log4J。我还尝试了Tomcat 6中的相同代码,并尝试将JSP中的代码移动到DAO bean中。这些都没有用。
当然,似乎是吞下SQLExceptions的Tomcat记录器,我如何才能改变这种行为?我最近从Tomcat 5升级到Tomcat 7,我不记得这是个问题,但我在网上找不到任何关于这个的东西。有人有什么想法吗?
发布于 2011-12-16 02:09:56
Tomcat无法更改响应以充分显示错误页面,因为响应已经提交给客户端。响应已经提交,因为您使用的是JSP (只打算显示结果),而不是普通的Java类(比如servlet)来完成预处理/后处理工作。
当JSP向响应发送一定数量的模板数据(HTML等)时,它将被提交,这是一个不返回的点。客户端已经收到响应的第一部分。如果在此之后出现异常,那么服务器就无法收回该部分。异常将被记录下来,但是响应会在那里停止。客户得到的只是一个半生不熟的答复。
解决这个问题相当简单:在业务工作完成之前,不要向响应写任何东西。实现这一目标的方法主要有两种:
<% %>代码放在JSP文件顶部的一个大型<% %>中。在所有业务工作完成之前,JSP不应该向响应发送任何字符。不用说,在MVC观点中,第二种方式更可取。
另请参阅:
https://stackoverflow.com/questions/8523695
复制相似问题