【问题标题】:How to send a value from DAO back to Servlet?如何将值从 DAO 发送回 Servlet?
【发布时间】:2020-12-07 17:41:01
【问题描述】:

我对如何进行有疑问。 用户输入电子邮件并单击忘记密码。 然后 servlet 会调用 Dao 来检查 email 是否存在,如果存在 Dao 会重置密码。 我希望 Dao 将重置密码发送回 servlet 并重定向另一个 servlet 以将电子邮件发送回具有重置密码的用户。谁能解释一下我该怎么做?

下面是我的 CheckEmailForgotDao

public class CheckEmailForgotDao{

String url = "jdbc:mysql://localhost:3308/mywebapp";
String username = "root";
String password = "root";
String sql = "SELECT * FROM users WHERE email=?";

public boolean check(String uname) {

    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection con = DriverManager.getConnection(url, username, password);
        PreparedStatement st = con.prepareStatement(sql);
        st.setString(1, uname);

        ResultSet rs = st.executeQuery();

        if (rs.next()) {

            String randomPassword = RandomStringUtils.randomAlphanumeric(10);
            String resetsql = "UPDATE users SET password = ? WHERE email = ?";
            PreparedStatement resetst = con.prepareStatement(resetsql);
            resetst.setString(1, randomPassword);
            resetst.setString(2, uname);

            System.out.println(resetst);
            resetst.executeUpdate();

        }

        return true;

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return false;
}

}

下面是我的 Servlet

@WebServlet("/forgotpassword")
public class ResetPasswordServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public ResetPasswordServlet() {
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String recipient = request.getParameter("email");
    String uname = recipient;

    CheckEmailForgotDao dao = new CheckEmailForgotDao();
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();

    if (dao.check(uname)) {

        request.getRequestDispatcher("/SendEmailResetPassword").include(request, response);
        
    } else {

        request.getRequestDispatcher("index.html").include(request, response);
        out.println("<script>document.getElementById('err-forgot').innerHTML= 'Email does not exist!'; </script>");

    }

}

}

【问题讨论】:

    标签: java servlets dao


    【解决方案1】:

    我终于可以做到了。下面是我的代码。

    -ForgotpasswordServlet -> CheckEmailForgot

    -CheckEmailForgot -> 检查电子邮件是否存在 -> 重置密码 ->

    -ForgotpasswordServlet -ForgotpasswordServlet -> 使用邮箱查询密码 -> EmailForgotDao

    -EmailForgotDao -> SendEmail -> ForgotpasswordServlet -> 显示已发送的电子邮件

    @WebServlet("/forgotpassword")
    public class ResetPasswordServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    public ResetPasswordServlet() {
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String recipient = request.getParameter("email");
        String uname = recipient;
    
        CheckEmailForgotDao dao = new CheckEmailForgotDao();
    
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();     
    
        if (dao.check(uname)) {
    
            String url = "jdbc:mysql://localhost:3308/mywebapp";
            String username = "root";
            String password = "root";
            String sql = "SELECT * FROM users WHERE email=?";
    
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, username, password);
                PreparedStatement st = con.prepareStatement(sql);
                st.setString(1, uname);
    
                ResultSet rs = st.executeQuery();
    
                if (rs.next()) {
                    String newpassword = rs.getString(3);
    
                    EmailForgotDao emaildao = new EmailForgotDao();
                    if (emaildao.sendemailforgot(uname, newpassword)) {
    
                        request.getRequestDispatcher("index.html").include(request, response);
                        out.println(
                                "<script>document.getElementById('msg-forgot').innerHTML= 'Reset password sent!'; </script>");
    
                    }
                } else {
                    request.getRequestDispatcher("index.html").include(request, response);
                    out.println(
                            "<script>document.getElementById('msg-forgot').innerHTML= 'Error!'; </script>");
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
            }
    
        } else {
    
            request.getRequestDispatcher("index.html").include(request, response);
            out.println("<script>document.getElementById('msg-forgot').innerHTML= 'Email does not exist!'; 
     </script>");
    
        }
    
    }
    

    上面的servlet使用下面的CheckEmailForgotDao来检查邮件是否存在。

    1.如果存在这个dao会重置密码并返回true。

    2.如果它不存在,这个 dao 将返回 false 并且 servlet 将显示电子邮件不存在。

    3.如果 CheckEmailForgotDao 以下返回 true,则 servlet 将查询并获取新的重置密码。

    4.然后 servlet 将使用它来调用另一个 EmailForgotDao。

     public class CheckEmailForgotDao{
     String url = "jdbc:mysql://localhost:3308/mywebapp";
     String username = "root";
     String password = "root";
     String sql = "SELECT * FROM users WHERE email=?";
    
     public boolean check(String uname) {
    
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, username,password);
            PreparedStatement st = con.prepareStatement(sql);
            st.setString(1, uname);
    
            ResultSet rs = st.executeQuery();
    
            if (rs.next()) {
    
                String randomPassword = RandomStringUtils.randomAlphanumeric(10);
                String resetsql = "UPDATE users SET password = ? WHERE email = 
      ?";
                PreparedStatement resetst = con.prepareStatement(resetsql);
                resetst.setString(1, randomPassword);
                resetst.setString(2, uname);
    
                System.out.println(resetst);
                resetst.executeUpdate();
    
            }
    
            return true;
    
        } catch (Exception e) {
            
            e.printStackTrace();
        }
    
        return false;
        }
    

    下面的 EmailForgotDao 将发送电子邮件并返回 true。然后 servlet 将显示 Reset Password Sent!

    如果返回false,由于错误,servlet会显示Error。

    public class EmailForgotDao {
    
    public static class SMTPAuthenticator extends Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("youremail@gmail.com", 
    "yourpassword");
        }
    }
    
    
    
    public boolean sendemailforgot(String uname, String newpassword) {
    
        String d_uname = "youremail@gmail.com";
        String d_password = "yourpassword";
        String d_host = "smtp.gmail.com";
        int d_port = 465;
    
        String m_to = uname;
        String m_from = "soemoesmarttoy1@gmail.com";
        String m_subject = "Your Password has been reset";
        String m_text = "Hi your new password is " + newpassword;
        String abc = "text/plain";
    
        Properties props = new Properties();
    
        SMTPAuthenticator auth = new SMTPAuthenticator();
        Session ses = Session.getDefaultInstance(props, auth);
    
        MimeMessage msg = new MimeMessage(ses);
    
        try {
            msg.setContent(m_text, abc);
            msg.setSubject(m_subject);
            msg.setFrom(new InternetAddress(m_from));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to));
    
            Transport transport = ses.getTransport("smtps");
            transport.connect(d_host, d_port, d_uname, d_password);
            transport.sendMessage(msg, msg.getAllRecipients());
            transport.close();
            
            return true;
    
        } catch (Exception e) {
            System.out.println(e);
            
        }
        
        return false;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2013-03-29
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2014-10-11
      • 2017-12-22
      相关资源
      最近更新 更多