【问题标题】:Servlet code dispatching to JSP shows errorServlet 代码分派到 JSP 显示错误
【发布时间】:2019-03-29 06:24:16
【问题描述】:

我有以下验证注册表单的代码。我有两种方法可以验证“密码”和“确认密码”是否相同,如果不是,则发送错误消息,如果电子邮件已经存在,还会检查数据库。当我不包括 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;  
    }
}

【问题讨论】:

    标签: java html validation jsp servlets


    【解决方案1】:

    ResultSet 永远不会被计算,因为准备好的语句永远不会被执行。这会导致在执行rs.next() 时出现 NPE。

    设置邮箱后这样添加:

    rs = preparedStatement.executeQuery();
    

    这将使用给定的参数执行准备好的语句并返回您正在寻找的 ResultSet。

    顺便说一句:

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

    【讨论】:

    • 已删除评论
    • 是的,这就是问题所在,但我还有另一个问题。如果两个密码不相等并且电子邮件存在,我怎样才能让两个错误同时出现。因为使用我上面编写的当前实现,它只显示电子邮件错误。
    • 我的意思是添加另一个 div 因为我已经添加了另一个 ${errorMsg } 但它仍然只生成电子邮件错误并在控制台中说它给出以下错误:java.lang.IllegalStateException : 响应提交后无法转发
    • 因为这个答案解决了你的问题,rewading 将不胜感激 ;)
    • 您需要将 User.checkEmail(email) 和 User.confirmPassword(p1, p2) 的结果保存在单独的变量中。之后根据两个结果设置 errorMessage 。最后将所有与输入无关的属性分配给请求。
    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2019-04-19
    • 2020-12-13
    相关资源
    最近更新 更多