2013-02-25 136 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