2013-02-25 138 views
1
<%@page import="java.sql.*"%> 
<%@page import="java.util.*"%> 
<%@page import="java.lang.*"%> 

<% 
String fname=request.getParameter("firstname"); 
String lname=request.getParameter("lastname"); 
String bday=request.getParameter("birthday"); 
String user=""; 
user = request.getParameter("username"); 
String pass=""; 
pass = request.getParameter("password"); 



try { 
if(user.isEmpty() && pass.isEmpty()){ 
Class.forName("com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", "user"); 

String sql = "Insert into users (firstname, lastname, username, password) values('"+fname+"', '"+lname+"', '"+user+"', '"+pass+"')"; 
Statement stmt = conn.createStatement(); 

stmt.execute(sql); 

conn.close(); 
response.sendRedirect("profile.jsp"); 
} 

} catch (ClassNotFoundException e) { 
e.printStackTrace(); 
} catch (SQLException e) { 
e.printStackTrace(); 
} 
%> 

<html> 
<body> 
<form method="post"> 
First Name: 
<input type="text" name="firstname"/> 
<br> 
Last Name: 
<input type = "text" name="lastname"/> 
<br> 
Birthdate: 
Day: <select name="day"> 
<% 
for(int x=1;x<32;x++){ 
%> 
<option value= <% out.println(x); %> ><% out.println(x); %></option> 
<% 
} 
%> 
</select> 
Month: <select name="month"> 
<% 
for(int y=1;y<13;y++){ 
%> 
<option value= <% out.println(y); %> ><% out.println(y); %></option> 
<% 
} 
%> 
</select> 
Year: <select name="year"> 
<% 
for(int z=1985;z<2030;z++){ 
%> 
<option value= <% out.println(z); %> ><% out.println(z); %></option> 
<% 
} 
%> 
</select> 
<br> 
Username: 
<input type="text" name="username"/> 
<br> 
Password: 
<input type="password" name = "password"/> 
<br> 
<input type="submit" value="Register"/> 
</form> 
</body> 
</html> 

檢查時,我得到的錯誤:空指針異常錯誤空變量

HTTP狀態500 -

類型異常報告

消息

descriptionThe服務器遇到一個內部錯誤()阻止它履行這個請求。

例外

org.apache.jasper.JasperException:顯示java.lang.NullPointerException 根源

顯示java.lang.NullPointerException

回答

7

離開Bobby Tables problem一邊更換

if(user.isEmpty() && pass.isEmpty()){ 

,你需要null - 檢查你的變量調用方法在他們面前:

if(user != null && !user.isEmpty() && pass != null && !pass.isEmpty()){ 
} 

但在此之前代碼投入生產,你應該爲自己解決問題SQL injection problem。否則,你的數據庫可能會被隔壁的「scriptie kid」所摧毀。使您的SQL語句參數化,並將值綁定到它,而不是將值嵌入到語句中。

String sql = "Insert into users (firstname, lastname, username, password) values(?,?,?,?)"; 
// Bind values to 

最後,看起來您打算將密碼存儲在數據庫中。不要這樣做,即使在你不打算部署到互聯網的玩具數據庫中。這是你可以對客戶做的最糟糕的事情,甚至是內部的事情。閱讀this answer來解決這個問題。

+0

我會在sql注入後一旦我去檢查一個變量是否爲空。我試過如果(用戶!=空),但即使用戶爲空也會繼續。 – magicianiam 2013-02-25 14:53:02

4

你不檢查user爲空。你假設它不是null,然後檢查它是空的。在檢查它是否爲空之前,您需要檢查nullness。

也許Apache Commons StringUtils.isBlank()可能是簡潔/可靠的?

+0

你能舉個例子嗎?你能否更簡單地解釋你的答案?謝謝:) – magicianiam 2013-02-25 14:57:14

1

嘗試用

if((user != null && pass != null) && (user.isEmpty() && pass.isEmpty())) { 
0

嘗試isNullOrEmpty()是地方的的isEmpty()

1

您assinging一個空字符串,然後用來自用request.getParameter一個新值將立即替換它。這會覆蓋你初始化的值,所以如果參數爲null,你將有一個用於用戶和傳遞的空值。然後,如果你在null String對象上調用isEmpty,你將得到NullPointerException