Java Oracle数据库未使用jsp.It';它显示一个空白页

Java Oracle数据库未使用jsp.It';它显示一个空白页,java,eclipse,oracle,jsp,Java,Eclipse,Oracle,Jsp,问题是,当我在表单中输入详细信息并输入submit时,它会显示一个空白的.jsp页面,数据库也不会更新。我已经在WEB-INF/lib文件夹中包含了odjbc.14 jar文件,并且正在使用oracle 10g。ideeclipse。代码中有什么错误 这是要连接到数据库(oracle)的页面: =1){ out.println(“保存”); } 否则{ out.println(“未保存”); } } 捕获(SQLE异常){ e、 printStackTrace(); } %> 代码>空白页的问

问题是,当我在表单中输入详细信息并输入submit时,它会显示一个空白的.jsp页面,数据库也不会更新。我已经在WEB-INF/lib文件夹中包含了odjbc.14 jar文件,并且正在使用oracle 10g。ideeclipse。代码中有什么错误

这是要连接到数据库(oracle)的页面:


=1){
out.println(“保存”);
}
否则{
out.println(“未保存”);
}
}
捕获(SQLE异常){
e、 printStackTrace();
}
%>

<>代码>空白页的问题是SQL是无效的,抛出SQLExpRebug。您的代码将在
catch
块中结束,并将错误打印到应用程序服务器日志中,而不是打印到您的页面中。在您的示例中,有几件事情您可以做得更好,如下所述:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   pageEncoding="ISO-8859-1" import="java.sql.*,java.security.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Test</title>
</head>
<body>
<%
  String user = request.getParameter("login_id");    
  String pwd = request.getParameter("password");
  String fname = request.getParameter("first_name");
  String lname = request.getParameter("last_name");
  String email = request.getParameter("email");
  String sql = "INSERT INTO MEMBERS(FIRST_NAME, LAST_NAME, EMAIL, USER_ID, PASSWORD, REG_DATE)"
        + " VALUES(?, ?, ?, ?, ?, SYSDATE)";
  try {
     Class.forName("oracle.jdbc.driver.OracleDriver");
     Connection con = DriverManager
           .getConnection("jdbc:oracle:thin:nishtha/FirstJ2ee@//localhost:1521/XE");
     con.setAutoCommit(false);
     PreparedStatement stmt = con.prepareStatement(sql);
     stmt.setString(1, fname);
     stmt.setString(2, lname);
     stmt.setString(3, email);
     stmt.setString(4, user);

     MessageDigest md = MessageDigest.getInstance("SHA-256");
     md.update(pwd.getBytes("UTF-8"));
     byte[] digest = md.digest();
     stmt.setString(5, new String(digest, "UTF-8"));

     int action = stmt.executeUpdate();
     if (action >= 1) {
        con.commit();
        out.println("saved");
     } else {
        out.println("not saved");
     }

  } catch (SQLException e) {
     e.printStackTrace();
     out.println("Error saving your details:<br/>");
     out.println(e.getMessage());
  }
%>
</body>
</html>
输入以下代码后,您将开始在页面上看到错误消息,并将其打印到app server日志中:

} catch (SQLException e) {
    e.printStackTrace();
    out.println("Error saving your details:<br/>");
    out.println(e.getMessage());
}
现在我得到了预期的结果:
saved

注意:
SYSDATE
是一个关键字,因此不需要任何
()
。但还有更多

3.提交数据:如另一个答案中所述,您不一定提交数据。它可以正常工作,因为AutoCommit的默认值为
true
,也可以在第一次调用页面后正常工作,因为您已将AutoCommit设置为
true
,但在这两种情况下,您都可能会有一些非常糟糕的副作用,可能会变得难以调试。确保数据安全的最佳方法是通过更改

int action=con.createStatement().executeUpdate(sql);
con.setAutoCommit(true);
if(action>=1){
  out.println("saved");
}
要执行实际的提交,并且仅当我还执行了插入时:

con.setAutoCommit(false);
int action = con.createStatement().executeUpdate(sql);
if (action >= 1) {
    con.commit();
    out.println("saved");
} else {
    out.println("not saved");
}
这可能会给您一个
无法提交,而自动提交设置为on
,就像在我的系统上一样,因为自动提交默认设置为
true
。因此,我通过添加一个额外的行来显式地取消激活它:

con.setAutoCommit(false);
4.防止和降低性能:您所能做的最糟糕的事情之一就是将值直接连接到SQL语句中!这对Oracle的性能来说是非常糟糕的,因为数据库总是需要硬解析您的语句并使用更多的CPU来解析语句,但对安全性来说更糟糕,因为现在有人可以将实际的SQL语句放在一个值中。解决方法是使用绑定变量:

String sql = "INSERT INTO MEMBERS(FIRST_NAME, LAST_NAME, EMAIL, USER_ID, PASSWORD, REG_DATE)"
        + " VALUES(?, ?, ?, ?, ?, SYSDATE)";
try {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection con = DriverManager
            .getConnection("jdbc:oracle:thin:nishtha/FirstJ2ee@//localhost:1521/XE");
    con.setAutoCommit(false);
    PreparedStatement stmt = con.prepareStatement(sql);
    stmt.setString(1, fname);
    stmt.setString(2, lname);
    stmt.setString(3, email);
    stmt.setString(4, user);
    stmt.setString(5, pwd);

    int action = stmt.executeUpdate();
    if (action >= 1) {
        con.commit();
        out.println("saved");
    } else {
        out.println("not saved");
    }
5.混淆密码:这是另一个安全问题。以明文形式存储密码是不好的,确实非常糟糕。您不需要知道您的用户密码,DBA也不应该只需在您的表上执行一个简单的
SELECT
,就可以获得密码。Unix或存储管理员也不应该通过将其从数据文件中灰显出来,网络管理员也不应该看到它以明文形式在网络上飞行。理想情况下,您可以尽快加密密码,在这种情况下,我将对其应用简单的SHA-256哈希。然后在登录页面上,我将确保再次将密码转换为SHA-256哈希,并比较哈希而不是明文密码:

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(pwd.getBytes("UTF-8"));
byte[] digest = md.digest();
stmt.setString(5, new String(digest, "UTF-8"));

int action = stmt.executeUpdate();

您是否遇到过任何异常或错误?“代码中有什么错误?”SQL注入。@对于Oracle,它不使用sysdate而使用curdate
con.setAutoCommit(false);
String sql = "INSERT INTO MEMBERS(FIRST_NAME, LAST_NAME, EMAIL, USER_ID, PASSWORD, REG_DATE)"
        + " VALUES(?, ?, ?, ?, ?, SYSDATE)";
try {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection con = DriverManager
            .getConnection("jdbc:oracle:thin:nishtha/FirstJ2ee@//localhost:1521/XE");
    con.setAutoCommit(false);
    PreparedStatement stmt = con.prepareStatement(sql);
    stmt.setString(1, fname);
    stmt.setString(2, lname);
    stmt.setString(3, email);
    stmt.setString(4, user);
    stmt.setString(5, pwd);

    int action = stmt.executeUpdate();
    if (action >= 1) {
        con.commit();
        out.println("saved");
    } else {
        out.println("not saved");
    }
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(pwd.getBytes("UTF-8"));
byte[] digest = md.digest();
stmt.setString(5, new String(digest, "UTF-8"));

int action = stmt.executeUpdate();