首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫吞SQLException

猫吞SQLException
EN

Stack Overflow用户
提问于 2011-12-15 16:52:40
回答 1查看 731关注 0票数 1

我正在使用Oracle 11g (瘦驱动程序)和Java 6在windows上开发一个Tomcat 7应用程序,我正在开发一个允许用户验证存储在Oracle数据库中的SQL语句的页面。我的计划是使用Oracle中的“解释计划”功能来完成此操作。

我有一个JSP,它在一个尝试捕获-最终块中执行SQL语句,如下所示:

代码语言:javascript
复制
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,我不记得这是个问题,但我在网上找不到任何关于这个的东西。有人有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2011-12-16 02:09:56

Tomcat无法更改响应以充分显示错误页面,因为响应已经提交给客户端。响应已经提交,因为您使用的是JSP (只打算显示结果),而不是普通的Java类(比如servlet)来完成预处理/后处理工作。

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

解决这个问题相当简单:在业务工作完成之前,不要向响应写任何东西。实现这一目标的方法主要有两种:

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

  1. 去掉了JSP中的所有代码,并将其移动到servlet类中。在这里,您可以自由地以正常的方式编写Java代码,处理异常并控制响应。

不用说,在MVC观点中,第二种方式更可取。

另请参阅:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8523695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档