1. Phân tích chức năng
Trang đăng ký với chức năng đăng ký người dùng thông qua các thông tin định danh như email và mật khẩu bảo mật
2. Thực thi
B1: Xây dựng lớp RegisterServlet kế thừa lớp BaseController có chức năng đăng ký người dùng vào hệ thống.
Phương thức register sẽ kiểm tra sự tồn tại người dùng duy nhất thông qua email trên bảng cơ sở dữ liệu users.
Nếu email đã tồn tại sẽ báo false. Ngược lại sẽ lưu thông tin email và mật khẩu sau khi mã hóa md5 vào cơ sở dữ liệu
package binh.dev; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import binh.dev.data.dao.DatabaseDao; import binh.dev.data.dao.UserDAO; import binh.dev.data.model.User; /** * * @author binhdev */ public class RegisterServlet extends BaseServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("register.jsp").include(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); String email = request.getParameter("email"); String password = request.getParameter("password"); String repeatPass = request.getParameter("repeatPass"); String role = request.getParameter("role"); UserDAO userDao = DatabaseDao.getInstance().getUserDao(); User user = userDao.find(email); // Kiểm tra thông tin đăng ký // Xử lý lỗi khi nhập thông tin thiếu if (email.isEmpty() || password.isEmpty() || repeatPass.isEmpty() || role.isEmpty()) { session.setAttribute("errorMessage", "Vui lòng điền đầy đủ thông tin đăng ký"); session.setAttribute("email", email); request.getRequestDispatcher("register.jsp").forward(request, response); // Xử lý lỗi khi emai trùng } else if (user != null) { session.setAttribute("errorMessage", "Email trùng"); session.setAttribute("email", email); request.getRequestDispatcher("register.jsp").forward(request, response); // Xử lý lỗi khi mật khẩu nhập lại không đúng } else if (!password.equals(repeatPass)) { session.setAttribute("errorMessage", "Mật khẩu nhập lại không trùng"); session.setAttribute("email", email); request.getRequestDispatcher("register.jsp").forward(request, response); } else { // Xử lý thông tin đăng ký hợp lệ user = new User(email, password, role); userDao.insert(user); response.sendRedirect("LoginServlet"); } } }
B2: Tạo tập tin register.jsp dùng làm view
<%-- Document : register.jsp Created on : May 26, 2023, 4:37:55 PM Author : binhdev --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Resest Css --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css"> <!-- nhúng font-chữ roboto vào --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet"> <link rel="stylesheet" href="./assets/fonts/themify-icons/themify-icons.css"> <link rel="stylesheet" href="./assets/fonts/fontawesome-free-6.4.0-web/css/all.min.css"> <link rel="stylesheet" href="./assets/css/base.css"> <link rel="stylesheet" href="./assets/css/login.css"> <link rel="stylesheet" href="./assets/css/register.css"> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous"> <!-- câu lệnh nếu trình duyệt nhỏ hơn IE 9 thì sẽ add thư viện hỗ trợ vào -- bình thường thì không cần --> <!--[if lt IE 9]> <script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.3.0/respond.min.js"></script> <![endif]--> <title>CornSalad Store</title> </head> <body> <!--header--> <div class="header-w3l"> <h1>CornSalad Register Form</h1> </div> <!--//header--> <!-- main --> <div class="main-layout"> <div class="main-form"> <h2>Fill out the form below to Register</h2> <form action="RegisterServlet" method="post"> <div class="form-sub-w3"> <input type="email" name="email" placeholder="email" value="${email}" required=""> <c:remove var="email" scope="session" /> <div class="icon-w3"> <i class="fa-solid fa-envelope" aria-hidden="true"></i> </div> </div> <div class="form-sub-w3"> <input type="password" name="password" placeholder="Password" required=""> <div class="icon-w3"> <i class="fa fa-unlock-alt" aria-hidden="true"></i> </div> </div> <div class="form-sub-w3"> <input type="password" name="repeatPass" placeholder="Repeatpassword" required=""> <div class="icon-w3"> <i class="fa fa-unlock-alt" aria-hidden="true"></i> </div> </div> <div class="form-sub-w3"> <div class="form-sub-lable"> <label for="exampleInputEmail1" >Role:</label> <select name="role" class="form-sub-select"> <option value="User">User </option> </select> </div> </div> <div class="error" > ${errorMessage} <c:remove var="errorMessage" scope="session" /> </div> <label class="anim"> <div class="anim-left"> <input type="checkbox" class="checkbox"> <span class="checkbox-span">I agree all statements in <a href="">Terms of service</a></span> </div> <a href="LoginServlet">Login</a> </label> <div class="clear"></div> <div class="submit-agileits"> <input type="submit" value="Register"> </div> </form> </div> </div> <!-- fotter --> <div class="footer"> <p>© 2023 CornSalad Register Form. All rights reserved | Design by <a href="http://w3layouts.com">W3layouts</a> </p> </div> </body> </html>