<%@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 -
输入例外报告
消息
description服务器遇到内部错误(),导致无法完成此请求。
例外
org.apache.jasper.JasperException:java.lang.NullPointerException 根本原因
显示java.lang.NullPointerException
答案 0 :(得分:7)
将Bobby Tables problem放在一边,你需要null
- 在调用方法之前检查你的变量:
if(user != null && !user.isEmpty() && pass != null && !pass.isEmpty()){
}
但在此代码投入生产之前,您应该自行修复SQL injection problem。否则,你的数据库很可能被隔壁的“剧本小孩”消灭。使您的SQL语句参数化,并将值绑定到它,而不是将值嵌入到语句中。
String sql = "Insert into users (firstname, lastname, username, password) values(?,?,?,?)";
// Bind values to
最后,您似乎计划在数据库中存储密码。即使在您不打算部署到Internet的玩具数据库中,也不要这样做。这是你可以对客户做的最糟糕的事情,甚至是内部客户。阅读this answer以解决此问题。
答案 1 :(得分:4)
您没有检查user
是否为空。你假设它不是null然后检查它是空的。在检查是否为空之前,您需要检查空值。
也许Apache Commons StringUtils.isBlank()可能用于简洁/可靠性?
答案 2 :(得分:1)
尝试替换
if(user.isEmpty() && pass.isEmpty()){
与
if((user != null && pass != null) && (user.isEmpty() && pass.isEmpty())) {
答案 3 :(得分:1)
您正在分配一个空字符串,然后立即用request.getParameter中的新值替换它。这将覆盖您初始化的值,因此如果参数为null,则user和pass的值为null。然后,如果在null String对象上调用isEmpty,则会得到NullPointerException
答案 4 :(得分:0)
尝试使用isNullOrEmpty()取代isEmpty()