【问题标题】:Mysterious sql access behaviour神秘的sql访问行为
【发布时间】:2012-01-12 09:21:20
【问题描述】:

我创建了一个简单的 java 类,它可以访问 sql 数据库,它工作正常 代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Query2 {

public static void main (String[] args) {
    try {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/riconoscimento?"
                        + "user=root&password=root");
        Statement stmt = conn.createStatement();
        ResultSet rs;
        rs = stmt.executeQuery("SELECT * FROM utenti; ");
        while ( rs.next() ) {
            String passwordToRead = rs.getString("password");
            String usernameToRead = rs.getString("username");
            System.out.println(passwordToRead);
            System.out.println(usernameToRead);
        }
        conn.close();
    } catch (Exception e) {
        System.err.println("Database Access Error");
        System.err.println(e.getMessage());
    }
}
}

jsp页面中的相同代码不起作用,问题是try-catch块没有执行,我不知道怎么可能 代码如下:

<%@ page language ="java" import="java.sql.*" %>
<!DOCTYPE html>
<html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>I dati inseriti per l'autenticazione sono:</title>
</head>
<body>
    <h1>
 <%
 try {
        Connection conn =    DriverManager.getConnection("jdbc:mysql://localhost/riconoscimento?"
                        + "user=root&password=root");
        Statement stmt = conn.createStatement();
        ResultSet rs;
        rs = stmt.executeQuery("SELECT * FROM utenti; ");
        while ( rs.next() ) {
            String passwordToRead = rs.getString("password");
            String usernameToRead = rs.getString("username");
            out.println(passwordToRead);
            out.println(usernameToRead);
        }
        conn.close();
    } catch (Exception e) {
        System.err.println("Database Access Error");
        System.err.println(e.getMessage());
    }
 %>
    </h1>
</body>
</html>

【问题讨论】:

  • 你关闭了所有你打开的html标签吗?就像在你的 jsp 中一样,它本身并没有关闭。 jsp 是否正在编译,你看到的输出是什么?
  • 这里忘记复制了,但是出现在.jsp页面中..真的看不懂
  • 增量部署localhost:8080/WebApplication1 完成增量分发localhost:8080/WebApplication1 run-deploy: Browsing: localhost:8080/WebApplication1/index.jsp run-display-browser: run: BUILD SUCCESSFUL (总时间: 4 秒)
  • 你确定rs.next() 是真的,它正在进入while 循环。检查在 while 循环前后放置 out.print("test start");out.print("test end");
  • 试图把各种 out.println("test 123"); try catch 块中包含的所有 println 都被完全忽略 不知道为什么显示所有超出 try catch 的 println

标签: java mysql database jsp


【解决方案1】:
  1. 尝试使用 out 对象的 flush() 方法
  2. 为了调试应用程序,您可以将 sql 结果也放入 logger 或 System.out
  3. 检查您的 jsp 文件是否由应用程序 Web 服务器处理(例如,如果您使用 .html 扩展名,请检查您的 Web 服务器是否将 .html 页面作为 JSP 而不仅仅是 HTML)。为此,您可以在代码 sn -p 的开头添加一些日志记录
  4. 您还可以检查生成的 HttpJspPage 类(但似乎问题出在配置中)

【讨论】:

  • 如果 isAutoFlush() 返回“false”,则必须执行第一步。实际上我不知道这个选项是否以某种方式为所有 Web 服务器预定义,似乎这个选项可能是在外部配置的(到 jsp)。
  • 我试图把一些 out.println("test") 从 try catch 中取出,它们只在屏幕上显示 try catch 中发生的事情没有执行
  • 您查看的是页面源代码还是浏览器的渲染?还在if ( rs.next() ) 语句之后放置一些调试日志
  • 顺便说一句,您必须在 finally 块中关闭连接、结果集和准备好的语句。
  • 在同一个文件夹中创建了一个新的 jsp 文件 现在只能复制和粘贴...这是怎么回事?
【解决方案2】:

您是否希望将 catch 中的语句输出到 JSP 页面?如果是这样,您将需要使用 out.println。 System.err.println 将写入服务器错误日志。

【讨论】: