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 -

类型异常报告

信息

描述服务器遇到一个内部错误 () 阻止它完成这个请求。

例外

org.apache.jasper.JasperException:java.lang.NullPointerException 根本原因

java.lang.NullPointerException

4

5 回答 5

7

撇开Bobby Tables 问题不谈,您需要null在调用方法之前检查您的变量:

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

但在此代码投入生产之前,您应该自己解决SQL 注入问题。否则,您的数据库将面临被隔壁的“脚本小子”消灭的严重风险。使您的 SQL 语句参数化,并将值绑定到它,而不是将值嵌入到语句中。

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

最后,您似乎计划将密码存储在数据库中。不要这样做,即使在您不打算部署到 Internet 的玩具数据库中也是如此。这是您可以对您的客户(甚至是内部客户)做的最糟糕的事情。阅读此答案以解决此问题。

于 2013-02-25T14:48:48.463 回答
4

你不检查user是空的。您假设它不为空,然后检查它是否为空。在检查它是否为空之前,您需要检查是否为空。

也许Apache Commons StringUtils.isBlank()可能对简洁/可靠性有用?

于 2013-02-25T14:47:12.743 回答
1

尝试更换

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

if((user != null && pass != null) && (user.isEmpty() && pass.isEmpty())) {
于 2013-02-25T14:48:38.747 回答
1

您正在分配一个空字符串,然后立即用 request.getParameter 中的新值替换它。这将覆盖您的初始化值,因此如果参数为空,您将获得用户的空值并通过。然后,如果您在 null String 对象上调用 isEmpty,您将获得 NullPointerException

于 2013-02-25T14:53:23.517 回答
0

尝试使用 isNullOrEmpty() 代替 isEmpty()

于 2013-02-25T14:51:37.813 回答