1. Phân tích chức năng
Xây dựng chức năng:
dữ liệu bảng danh mục (users)
2. Thực thi
Đối với mối chức năng chúng ta sẽ có 1 controller riêng để đảm nhiệm
2.1. Chức năng hiển thị
B1: Tạo controller IndexUserServlet kế thừa lớp BaseAdminServlet thực hiện chức năng quản lý trang hiển thị dữ liệu các người dùng
package binh.dev.admin.user;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import binh.dev.BaseServlet;
import binh.dev.data.dao.DatabaseDao;
import binh.dev.data.model.User;
public class IndexUserServlet extends BaseServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<User> userList = DatabaseDao.getInstance().getUserDao().findAll();
request.setAttribute("userList", userList);
request.getRequestDispatcher("admin/user/index.jsp").include(request, response);
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
B2: Tạo giao diện index.jsp trong thư mục web/admin/users làm chức năng view
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>CornSalad Admin - Dashboard</title>
<!-- Custom fonts for this template-->
<link href="./assets/admin/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
<!-- Custom styles for this template-->
<link href="./assets/admin/css/sb-admin-2.min.css" rel="stylesheet">
<%@include file="../inc/sidebar.jsp" %>
<div id="content-wrapper" class="d-flex flex-column">
<%@include file="../inc/header.jsp" %>
<!-- Begin Page Content -->
<div class="container-fluid">
<h1 class="h3 mb-2 text-gray-800">Users</h1>
<p class="mb-4">Danh sách các user đã đăng ký trong CornSalad Store .</p>
<!-- DataTales Example -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">Users Table</h6>
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<c:set var="index" value="0"/>
<c:forEach items="${userList}" var="user">
<c:set var="index" value="${index + 1}"/>
<td>${user.password}</td>
<a href="EditUserServlet?userId=${user.id}">Edit</a>
<a href="DeleteUserServlet?userId=${user.id}">Delete</a>
<!-- /.container-fluid -->
<!-- End of Main Content -->
<%@include file="../inc/footer.jsp" %>
<!-- End of Content Wrapper -->
<!-- End of Page Wrapper -->
<!-- Scroll to Top Button-->
<a class="scroll-to-top rounded" href="#page-top">
<i class="fas fa-angle-up"></i>
<!-- Bootstrap core JavaScript-->
<script src="./assets/admin/vendor/jquery/jquery.min.js"></script>
<script src="./assets/admin/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="./assets/admin/vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="./assets/admin/js/sb-admin-2.min.js"></script>
<!-- Page level plugins -->
<script src="./assets/admin/vendor/chart.js/Chart.min.js"></script>
<!-- Page level custom scripts -->
<script src="./assets/admin/js/demo/chart-area-demo.js"></script>
<script src="./assets/admin/js/demo/chart-pie-demo.js"></script>
B1: Tạo controller CreateUserServlet kế thừa lớp BaseAdminServlet thực hiện chức năng quản lý trang hiển thị dữ liệu các người dùng
package binh.dev.admin.user;
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.BaseServlet;
import binh.dev.data.dao.DatabaseDao;
import binh.dev.data.dao.UserDAO;
import binh.dev.data.model.User;
public class CreateUserServlet extends BaseServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("admin/user/create.jsp").include(request, response);
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
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);
HttpSession session = request.getSession();
// 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ý");
request.getRequestDispatcher("admin/user/create.jsp").forward(request, response);
// Xử lý lỗi khi emai trùng
} else if (user != null) {
session.setAttribute("errorMessage", "Email trùng");
request.getRequestDispatcher("admin/user/create.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");
request.getRequestDispatcher("admin/user/create.jsp").forward(request, response);
// Xử lý thông tin đăng ký hợp lệ
user = new User(email, password, role);
response.sendRedirect("IndexUserServlet");
B2: Tạo tập tin create.jsp trong thư mục web/admin/users làm chức năng view
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>CornSalad Admin - Dashboard</title>
<!-- Custom fonts for this template-->
<link href="./assets/admin/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
<!-- Custom styles for this template-->
<link href="./assets/admin/css/sb-admin-2.min.css" rel="stylesheet">
<link href="./assets/admin/css/style.css" rel="stylesheet">
<%@include file="../inc/sidebar.jsp" %>
<div id="content-wrapper" class="d-flex flex-column">
<%@include file="../inc/header.jsp" %>
<div class="container-fluid">
<form action="CreateUserServlet" method="post">
<label for="exampleInputEmail1">Name</label>
<input type="email" name="email" class="form-control" placeholder="Enter Email">
<label for="exampleInputEmail1">Password</label>
<input type="text" name="password" class="form-control" placeholder="Enter password">
<label for="exampleInputEmail1">Repeat Password</label>
<input type="text" name="repeatPass" class="form-control" placeholder="Enter Repeat Password">
<label for="exampleInputEmail1" >Role:</label>
<select name="role" class="form-sub-select">
<option value="User">User </option>
<option value="Admin">Admin </option>
<div class="form-text text-muted" >
<c:remove var="errorMessage" scope="session" />
<button type="submit" class="btn btn-primary">Submit</button>
<!-- End of Main Content -->
<%@include file="../inc/footer.jsp" %>
<!-- End of Content Wrapper -->
<!-- End of Page Wrapper -->
<!-- Scroll to Top Button-->
<a class="scroll-to-top rounded" href="#page-top">
<i class="fas fa-angle-up"></i>
<!-- Bootstrap core JavaScript-->
<script src="./assets/admin/vendor/jquery/jquery.min.js"></script>
<script src="./assets/admin/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="./assets/admin/vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="./assets/admin/js/sb-admin-2.min.js"></script>
<!-- Page level plugins -->
<script src="./assets/admin/vendor/chart.js/Chart.min.js"></script>
<!-- Page level custom scripts -->
<script src="./assets/admin/js/demo/chart-area-demo.js"></script>
<script src="./assets/admin/js/demo/chart-pie-demo.js"></script>
2.3. Chức năng cập nhật
B1: Tạo controller EditUserServlet kế thừa lớp BaseAdminServlet thực hiện chức năng cập nhật người dùng
package binh.dev.admin.user;
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.BaseServlet;
import binh.dev.data.dao.DatabaseDao;
import binh.dev.data.dao.UserDAO;
import binh.dev.data.model.User;
public class EditUserServlet extends BaseServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
int userId = Integer.parseInt(request.getParameter("userId"));
User user1 = DatabaseDao.getInstance().getUserDao().find(userId);
session.setAttribute("user1", user1);
request.getRequestDispatcher("admin/user/edit.jsp").include(request, response);
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
UserDAO userDao = DatabaseDao.getInstance().getUserDao();
HttpSession session = request.getSession();
int userId = Integer.parseInt(request.getParameter("userId"));
User user = userDao.find(userId);
String email = request.getParameter("email");
String password = request.getParameter("password");
String role = request.getParameter("role");
user.setPassword(password);
if (email.isEmpty() || password.isEmpty() || role.isEmpty()) {
session.setAttribute("errorMessage", "Vui lòng điền đầy đủ thông tin");
request.getRequestDispatcher("admin/user/edit.jsp").forward(request, response);
// Xử lý lỗi khi thay đổi email
} else if (!email.equals(user.getEmail())) {
session.setAttribute("errorMessage", "Không được thay đổi Email");
request.getRequestDispatcher("admin/user/edit.jsp").forward(request, response);
response.sendRedirect("IndexUserServlet");
B2: Tạo tập tin update.jsp trong thư mục web/admin/users làm chức năng view
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>CornSalad Admin - Dashboard</title>
<!-- Custom fonts for this template-->
<link href="./assets/admin/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
<!-- Custom styles for this template-->
<link href="./assets/admin/css/sb-admin-2.min.css" rel="stylesheet">
<link href="./assets/admin/css/style.css" rel="stylesheet">
<%@include file="../inc/sidebar.jsp" %>
<div id="content-wrapper" class="d-flex flex-column">
<%@include file="../inc/header.jsp" %>
<div class="container-fluid">
<form action="EditUserServlet?userId=${user1.id}" method="post">
<input type="hidden" name="userId" value="${user1.id}">
<label for="exampleInputEmail1">Email</label>
<input type="email" name="email" class="form-control" placeholder="Enter Email" value="${user1.email}" >
<label for="exampleInputEmail1">Password</label>
<input type="text" name="password" class="form-control" placeholder="Enter Password" value="${user1.password}">
<label for="exampleInputEmail1">Role</label>
<select name="role" class="form-control">
<option value="User">${user1.role} </option>
<option value="user">User </option>
<option value="admin">Admin </option>
<div class="form-text text-muted" >
<c:remove var="errorMessage" scope="session" />
<button type="submit" class="btn btn-primary">Submit</button>
<!-- End of Main Content -->
<%@include file="../inc/footer.jsp" %>
<!-- End of Content Wrapper -->
<!-- End of Page Wrapper -->
<!-- Scroll to Top Button-->
<a class="scroll-to-top rounded" href="#page-top">
<i class="fas fa-angle-up"></i>
<!-- Bootstrap core JavaScript-->
<script src="./assets/admin/vendor/jquery/jquery.min.js"></script>
<script src="./assets/admin/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="./assets/admin/vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="./assets/admin/js/sb-admin-2.min.js"></script>
<!-- Page level plugins -->
<script src="./assets/admin/vendor/chart.js/Chart.min.js"></script>
<!-- Page level custom scripts -->
<script src="./assets/admin/js/demo/chart-area-demo.js"></script>
<script src="./assets/admin/js/demo/chart-pie-demo.js"></script>
2.3. Chức năng xoá
B1: Tạo controller DeleteUserServlet kế thừa lớp BaseAdminServlet thực hiện chức năng xoá người dùng
package binh.dev.admin.user;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import binh.dev.BaseServlet;
import binh.dev.data.dao.DatabaseDao;
public class DeleteUserServlet extends BaseServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int userId = Integer.parseInt(request.getParameter("userId"));
DatabaseDao.getInstance().getUserDao().delete(userId);
response.sendRedirect("IndexUserServlet");
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
B2: Với chức năng xoá thì chúng ta không cần giao diện chỉ sử lý việc xoá dữ liệu xong chuyển hướng trang lại trang index trong method doGet
response.sendRedirect("IndexUserServlet");
0 Nhận xét