问题是当我在表单中输入详细信息并输入submit时,它会显示一个空白的.jsp页面,数据库也不会更新。我已经在WEB中包含了odjbc.14 jar文件-INF / lib文件夹,我正在使用oracle 10g。 IDE月食。代码中出了什么问题??
这是连接数据库(oracle)的页面:
<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 MEMEBERS(FIRST_NAME,LAST_NAME,EMAIL,USER_ID,PASSWORD,REG_DATE)values('"+fname+"','"+lname+"','"+email+"','"+user+"','"+pwd+"',CURDATE())";
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:nishtha/FirstJ2ee@//localhost:1521/XE");
int action=con.createStatement().executeUpdate(sql);
con.setAutoCommit(true);
if(action>=1){
out.println("saved");
}
else{
out.println("not saved");
}
}
catch (SQLException e) {
e.printStackTrace();
}
%>
</body>
</html>
答案 0 :(得分:0)
空白页面的问题是您的SQL无效并抛出SQLException。您的代码最终会出现在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>
1。)更好的错误处理如上所述,您的错误最有可能在应用服务器日志中结束。这可能是绝对正常的,因为您可能不希望在整个网页上打印堆栈跟踪和随机错误,但是通过更好的错误处理,您可以很好地将其呈现给用户并将其打印到应用服务器日志中。例如,如果您更改
catch (SQLException e) {
e.printStackTrace();
}
到下面的代码,您将开始在页面上看到错误消息并将其打印到应用服务器日志中:
} catch (SQLException e) {
e.printStackTrace();
out.println("Error saving your details:<br/>");
out.println(e.getMessage());
}
2。)正确的SQL语句:运行上面的示例后(注意,我已经更正了表中的拼写错误并将其称为MEMBERS
),我收到错误{{ 1}}。正如评论中已经提到的那样,您需要ORA-00904: "CURDATE": invalid identifier
而不是SYSDATE
:
CURDATE
现在我得到了预期的结果:String sql="INSERT INTO MEMBERS(FIRST_NAME,LAST_NAME,EMAIL,USER_ID,PASSWORD,REG_DATE)values('"+fname+"','"+lname+"','"+email+"','"+user+"','"+pwd+"',SYSDATE)";
注意:saved
是一个关键字,因此不需要任何SYSDATE
。但还有更多!
3。)提交您的数据:如其他答案中所述,您不一定要提交数据。它可能正常工作,因为AutoCommit的默认值为()
,或者在第一次调用页面后它可能正常工作,因为您已将AutoCommit设置为true
但在任何一种情况下您可能都有一些非常糟糕的一面调试可能变得棘手的效果。确保数据安全的最佳方法是通过更改
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");
}
,就像我在系统上一样,因为默认情况下AutoCommit设置为Could not commit with auto-commit set on
。所以我通过添加额外的行来明确地停用它:
true
4。)防止SQL injection和性能不佳:您可以做的最糟糕的事情之一就是将值直接连接到SQL语句中!这对于Oracle性能来说非常糟糕,因为数据库总是必须硬解析你的语句并使用更多的CPU这样做但是安全性更差,因为现在有人可以将实际的SQL语句放在单个值中。解决方法是使用绑定变量:
con.setAutoCommit(false);
5。)模糊密码:这是另一个安全问题。以明文形式存储密码很糟糕,确实非常糟糕。您不需要知道您的用户密码,DBA也不需要通过在桌面上执行简单的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");
}
来获取密码。 Unix或存储管理员也不应该通过将数据文件和网络管理员看成是以明文形式在网络上飞行而将其从数据文件中提取出来。理想情况下,您应尽快加密密码,在这种情况下,我将在其上应用简单的SHA-256哈希。然后在登录页面上,我将确保再次将密码转换为SHA-256哈希并比较哈希值而不是明文密码:
SELECT