分配给JSP的Servlet代码显示错误

时间:2018-10-24 18:27:17

标签: java html validation jsp servlets

我有以下代码可以验证“注册”表单。我有两种方法可以验证“ Password”和“ Confirm password”是否相同,如果不相同则发送错误消息,还可以通过checkEmail()来检查数据库是否已存在该电子邮件。当我不包括checkEmail()方法时,另一个方法就可以正常工作(甚至是错误消息)。但是,当我包含checkEmail()时,它会给出NullPointerException的错误消息。我相信这与在我的代码中并入checkEmail()方法有关,但是我不确定将其放在何处。如果有人可以帮助我,我将不胜感激。

// SERVLET doPost方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        HttpSession s = request.getSession();
        UserInfo ud = new UserInfo(); 
        ud.createTable();
        UserBean u = new UserBean();
        ServletContext ctx = s.getServletContext();

            u.setEmail(request.getParameter("email"));
            u.setName(request.getParameter("name"));
            u.setLname(request.getParameter("sname"));
            u.setPassword(request.getParameter("password"));
            s.setAttribute("User", u);
            String e = u.getEmail();
            String p1 = u.getPassword();
            String p2 = request.getParameter("password2");

            if(User.confirmPassword(p1, p2) && !User.checkEmail(e)) {

            //Save data to DB
            u = (User)s.getAttribute("User");
            s.invalidate();
            ud.insert(u);
            forwardTo(ctx, request, response, "/Somepage.jsp");

            } else {
                if(User.checkEmail(e)) {
                        request.setAttribute("name",request.getParameter("name"));
                        request.setAttribute("sname",request.getParameter("sname"));
                        request.setAttribute("email",request.getParameter("email"));
                        request.setAttribute("pass", request.getParameter("password"));
                        request.setAttribute("pass2", request.getParameter("password2"));
                        request.setAttribute("errorMessage", "Email already exists!");
                        request.getRequestDispatcher("/SignUp.jsp").forward(request, response);
                }
                if(!User.confirmPassword(p1, p2)) {
                request.setAttribute("name",request.getParameter("name"));
                request.setAttribute("sname",request.getParameter("sname"));
                request.setAttribute("email",request.getParameter("email"));
                request.setAttribute("pass", request.getParameter("password"));
                request.setAttribute("pass2", request.getParameter("password2"));
                request.setAttribute("errorMessage", "Passwords do not match!");
                request.getRequestDispatcher("/SignUp.jsp").forward(request, response);
                    }
                } 
            }   

//注册表格

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>User Registration</title>
</head>
<body>
<form action = "UserServ" method ="POST">
<h5 >Enter the details below to Sign Up</h5><br>
Name: <input type="text" name="name" required placeholder="Firstname" value="${name}"><br>
Surname: <input type="text" name="sname" required placeholder="Surname" value="${sname}"><br>
Email: <input type="text" value="${email}" name="email" placeholder="Email"><br>
Password:
<input type="password" value="${pass}" name="password" placeholder="Password"  required><br>
Confirm password:
<input type="password" name="password2" value="${pass2}" placeholder="Confirm password" required><br>
<div style="color: #FF0000;">${errorMessage}</div><br>
<input type="submit" value="Sign Up">
</form>
</body>
</html>
</body>
</html>

//方法

public static boolean confirmPassword(String p1, String p2){          
        boolean status = false;  
        if(p1.equals(p2)) {
        status =true;  
        }
        return status;
    }


    public static boolean checkEmail(String email) {
        boolean check = false;
         PreparedStatement pst = null;  
            ResultSet rs = null;  
            try(Connection conn= ConnectionConfiguration.getConnection()){
                pst = conn.prepareStatement("SELECT * FROM users WHERE email=?;");  
                pst.setString(1, email);  

                check = rs.next();  
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return check;  
    }
}

1 个答案:

答案 0 :(得分:0)

由于永远不会执行预处理语句,因此不会计算ResultSet。这将在执行rs.next()时生成NPE。

在设置电子邮件后添加以下内容:

rs = preparedStatement.executeQuery();

这将使用给定的参数执行准备好的语句,并返回您要查找的ResultSet。

顺便说一句:

请考虑使用rs.isBeforeFirst()而非rs.next()来检查是否有任何结果。在您的情况下,它将起作用,因为您没有读取任何行,但是如果需要,则需要重置光标,因为rs.next()将光标移至下一行(如果存在)。