Nội dung thực hành chủ yếu thực hiện việc lập trình Socket trên họ giao thức TCP/IP và giao thức UDP trên các ứng dụng viết bằng ngôn ngữ Java, kết hợp các kĩ thuật lập trình đa luồng, l
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN
Trang 2rất rộng mở cho sinh viên và việc nắm bắt những kĩ thuật cơ bản của nó cực kì
cần thiết và quan trọng Sau một loạt các môn học lí thuyết nền tảng như Mạng
máy tính, Lập trình Java, Lập trình mạng, thì học phần Lập trình mạng này
chính là hội tụ hiện thực các kiến thức học trên sách vở Nội dung thực hành chủ
yếu thực hiện việc lập trình Socket trên họ giao thức TCP/IP và giao thức UDP
trên các ứng dụng viết bằng ngôn ngữ Java, kết hợp các kĩ thuật lập trình đa
luồng, lập trình web JSP để thực hiện các hạng mục của học phần Thông qua
các bài các bài giảng trên lớp, sinh viên dần thông thạo với công việc lập trình
và một phần nào đó làm quen kĩ thuật xây dựng một hệ thống làm việc sao cho
hiệu quả.
Dù đã kiểm tra nhiều lần nhưng trong báo cáo này có thể sẽ xuất hiện một số
lỗi và sai sót, do đó em rất mong đợi sự góp ý từ các thầy cô Em xin chân thành
cảm ơn.
Trang 3Ý KIẾN ĐÁNH GIÁ CỦA GIẢNG VIÊN
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 4MỤC LỤC
LỜI MỞ ĐẦU 1
Ý KIẾN ĐÁNH GIÁ CỦA GIẢNG VIÊN 2
BÀI TẬP 1: XÂY DỰNG CHỨC NĂNG ĐĂNG NHẬP VÀ ĐĂNG KÝ TÀI KHOẢN BẰNG JSP, SERVLET THEO MÔ HÌNH MVC 4
BÀI TẬP 2: XÂY DỰNG HỆ THỐNG QUẢN LÝ TRUNG TÂM Y TẾ DỰ PHÒNG 22
1 Tổng quan đề tài 22
1.1 Bối cảnh đề tài 22
1.2 Mục tiêu và mục đích đề tài 22
1.3 Phương pháp triển khai 22
1.4 Môi trường áp dụng 22
2 Phân tích và thiết kế hệ thống 22
2.1 Phát biểu bài toán 22
2.2 Phân tích hệ thống 24
2.3 Thiết kế hệ thống 24
3 Cài đặt và triển khai 26
3.1 Cài đặt 26
3.2 Triển khái 47
4 Kết luận 51
4.1 Kết quả đạt được 51
4.2 Hạn chế 52
4.3 Hướng phát triển 52
Trang 5Bài tập 1: Xây dựng chức năng đăng nhập và đăng ký tài
khoản bằng JSP, Servlet theo mô hình MVC
Yêu cầu đề bài:
Xây dựng một ứng dụng bằng JSP, SERVLET theo mô hình MVC cung cấp
chức năng như sau:
- Người dùng muốn truy cập vào hệ thống phải thực hiện login để kiểm tra
username và password có hợp lệ hay không
- Hệ thống thông qua DB kiểm tra tính xác thực của dữ liệu:
Nếu username và password không chính xác hay không tồn tại ứng
dụng thông báo cho người dùng thông tin “Invalid username and
password” và cho người dùng trở về trang Login thông qua một Link
có tên là Try Again và cung cấp một Link Register cho phép người
dùng đăng ký một account mới
Nếu user tồn tại thì chương trình bày form Search Đặc biệt, trên đầu
trang phải sử dụng session để lưu trữ user và tất cả các trang phải có
câu “Welcome, tênUser”
- Form Search cho phép người dùng tìm kiếm một user bất kỳ khi biết một
phần tên của họ
Kết quả Search sẽ trình bày trên lưới dữ liệu
Nếu tìm không thấy sẽ in ra câu “No Result is matched!”
- Kết quả trên lưới dữ liệu cho phép người dùng xóa một hàng bất kỳ bằng
cách click vào link hay update thông tin về lastname hay roles bằng click
nút update trên hàng được lựa chọn
- Khi các thao tác update, delete được thực hiện thành công thì lưới dữ liệu
sẽ được cập nhật lại và trình bày kết quả cho người dùng
Cấu trúc thư mục:
Trang 6public class BaseDAO {
private Connection connect;
public Connection getConnectMySql() {
String userName = "root";String password = "";
try {
dbName + "?useUnicode=true&characterEncoding=UTF-8";
Trang 7connect = DriverManager.getConnection(connURL, userName,
public class UserDAO extends BaseDAO {
private ResultSet results;
private Connection conn;
private PreparedStatement pst;
public boolean addUser(User userInfor) {
boolean status = false;
VALUES(?,?,?)";
try {
pst = conn.prepareStatement(sql);
pst.setString(1, userInfor.getUsername());
pst.setString(2, userInfor.getPassword());
pst.setString(3, userInfor.getFullname());
status = (temp == 1) ? true : false;
public boolean isExistUser(String userName, String password) {
boolean status = false;
Trang 8public User getUser(String userName) {
public ArrayList <User> getUserByName(String name) {
listUser.add(obj);
}
Trang 9public boolean deleteUser(String userName) {
boolean status = false;
try {
pst = conn.prepareStatement(sql);
pst.setString(1, userName);
status = (temp == 1) ? true : false;
public boolean editUser(User user) {
boolean status = false;
try {
WHERE username = ?";
pst = conn.prepareStatement(sql);
pst.setString(1, user.getPassword());
pst.setString(2, user.getFullname());
pst.setString(3, user.getUsername());
status = (temp == 1) ? true : false;
public static void main(String[] args) {
Trang 10System.out.println(u.editUser(new User("thailoi","222222","ThaiVan Lon")));
public class HomeController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
if(session.getAttribute("fullname") != null){
if(logout != null){
Trang 11ArrayList<User> listUser =
userDAO.getUserByName(name);
request.setAttribute("listUser", listUser);
}}
request.getRequestDispatcher("/view/home.jsp");
}else{
response.sendRedirect(request.getContextPath() +
"/login.html");
}}
/**
* @see HttpServlet#doPost(HttpServletRequest request,
HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub}
String destination = null;
if(session.getAttribute("fullname") != null){
Trang 12public class LoginController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
request.getRequestDispatcher("/view/login.jsp");
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
if (userDAO.isExistUser(userName, password)) {
session.setAttribute("fullname",
userInfor.getFullname());
destination = request.getContextPath() + "/home.html";
response.sendRedirect(destination);
} else {
request.getRequestDispatcher("/view/failed_login.jsp");
}}
}
RegisterController.java
Trang 13public class RegisterController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.getRequestDispatcher("/view/register.jsp");
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
if(!password.equals("") && !fullname.equals("") && !
username.equals("")){
check = user.getUser(username);
if(check == null){
session.setAttribute("success", true);
Trang 14user.addUser(new User(username,password,fullname));
response.sendRedirect(request.getContextPath() + "/
register.html");
}else{
session.setAttribute("success", false);
response.sendRedirect(request.getContextPath() + "/
register.html");
}}else{
session.setAttribute("success", false);
response.sendRedirect(request.getContextPath() +
"/register.html");
}}
public class EditUserController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.getRequestDispatcher("/view/error_page.jsp");
}
Trang 15* @see HttpServlet#doPost(HttpServletRequest request,
HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
boolean status = false;
if(!edit.equals("")){
status = userDAO.editUser(new User(username,
password, fullname));
if(status == true){
name="+fullname+"&search=Search";
response.sendRedirect(request.getContextPath() + destination);
}else{
response.sendRedirect(request.getContextPath() + destination);
}}else{
response.sendRedirect(request.getContextPath() +
destination);
}
if(!delete.equals("")){
status = userDAO.deleteUser(username);
if(status == true){
response.sendRedirect(request.getContextPath() + destination);
}}else{
response.sendRedirect(request.getContextPath() +
destination);
}}
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo Login</title>
Trang 16<link href= <%=request.getContextPath()%>/templates/css/style.css"
rel="stylesheet">
</head>
<body class="login-bg">
<div class="login-page">
<div class="form">
<form class="login-form"
action= <%=request.getContextPath()%>/login.html"
%=request.getContextPath()%>/register.html">Create an account</a
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo Login</title>
<link href= <%=request.getContextPath()%>/templates/css/style.css"
rel="stylesheet">
</head>
<body class="login-bg">
<div class="login-page">
<div class="form">
<form class="register-form" action= <
%=request.getContextPath()%>/register.html" method="post"
<button type="submit"
name="create">Register</button>
< class="message">
%=request.getContextPath()%>/login.html">Log In</a
Trang 17<%@ page import="model.bean.User"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo Login</title>
<link href= <%=request.getContextPath()%>/templates/css/style.css"
<div class="welcome-user">
<h3> Welcome <%=session.getAttribute("fullname")%></h3>
< href= <%=request.getContextPath()%>/home.html?
logout=logout">Logout</a
</div>
<div class="container">
<div class="body-form">
<form class="form-inline" action= <
%=request.getContextPath()%>/home.html" method="get" accept-charset=
<input type="submit" class="btn btn-success"
name="search" value="Search">
Trang 18<thead <tr class="bg-success text-white">
<th class="col-md-2">STT</th>
<th class= 4">Username</th>
"col-md-<th class="col-md-4">Full Name</th>
<th class="col-md-2">Method</th>
< style="cursor: pointer"
data-toggle="modal" data-target="#edit-<%=i%>" Edit</a
< style="cursor: pointer"
data-toggle="modal" data-target="#delete-<%=i%>" Delete</a
</td>
</tr>
<%
}}
<div id="edit-<%=i %>" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" dismiss="modal">×</button>
User</h4>
</div>
<div class="modal-body">
Trang 19<form class="form-horizontal" action= <
%=request.getContextPath()%>/user/edit.html" method="post"
accept-charset="utf-8">
<div class="form-group">
col-sm-2" for="username">User Name:</label>
<div class="col-sm-10">
<input type="text"
name="username" class="form-control" id="username" value= <
%=u.getUsername()%>" readonly>
</div>
</div>
<div class="form-group">
col-sm-2" for="pwd">Password:</label>
<div class="col-sm-10">
<input type="password"
class="form-control" name="password" id="pwd" placeholder="Enter password">
</div>
</div>
<div class="form-group">
col-sm-2" for="fullname">User Name:</label>
<div class="col-sm-10">
<input type="text"
name="fullname" class="form-control" id="fullname" value= <
%=u.getFullname()%>"
</div>
</div>
<div class="form-group">
col-sm-10">
<input type="submit"
class="btn btn-primary" name="edit" value="Update">
<button type="button"
class="btn btn-default" data-dismiss="modal">Close</button>
<div id="delete-<%=i %>" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" dismiss="modal">×</button>
<h4 class="modal-title">Delete User</h4>
</div>
<div class="modal-body">
%=request.getContextPath()%>/user/edit.html" method="post"
Trang 20<div class="col-sm-offset-2 col-sm-10">
<input type="submit"
class="btn btn-danger" name="delete" value="Delete">
<button type="button"
class="btn btn-default" data-dismiss="modal">Close</button>
Chức năng Đăng kí login
Nếu login bị lỗi
Trang 21Chức năng đăng kí
Đăng nhập thành công chức năng tìm kiếm
Tìm kiếm thành công
Tìm kiếm thất bại
Trang 22Chức năng UPDate
Chức năng DELETE
Trang 23Tăng cường tiếp cận và tuân thủ lịch tiêm cũng như đảm bảo thông tin kịp thời đến
khách hàng Đề tài này được thực hiện nhằm xây dựng ứng dụng quản lý tiêm
chủng có tính tương tác cao giữa cơ sở cung cấp dịch vụ và khách hàng trên nền
tảng website
1.2 Mục tiêu và mục đích đề tài
- Tìm hiểu và thực hiện xây dựng một ứng dụng JSP, SERVLET theo mô hình
MVC cơ bản, cụ thể ở đây là chức năng đăng nhập và đăng kí tài khoản.
- Hiểu được cách thức làm việc và hoạt động của JSP, SERVLET
- Hiểu ý nghĩa của từng tầng và cách xây dựng một project theo mô hình MVC
1.3 Phương pháp triển khai
- Tìm hiểu lý thuyết và phương pháp lập trình thông qua các tài liệu, video hướng
dẫn lập trình JSP, SERVLET, MVC trên internet
1.4 Môi trường áp dụng
- Sử dụng công cụ lập trình Eclipse Neon
Trang 24- Sử dụng Server MySQL và Apache Tomcat 8.5 để chạy Server.
2 Phân tích và thiết kế hệ thống
2.1 Phát biểu bài toán
Cho một hệ thống quản lý trung tâm y tế dự phòng được mô tả như sau:
- Có chức năng admin của hệ thống, có yêu cầu đăng nhập để quản lý
- Không có chức năng cho phần end-user
- Mỗi khách hàng đến trung tâm sẽ được tạo một tài khoản để theo dõi lịch sử
tiêm phòng
- Mỗi khách hàng có thể tiêm phòng 1 hoặc nhiều bệnh
- Đối với mỗi bệnh, khách hàng chỉ được chọn 1 loại của 1 hãng văcxin
- Cùng một bệnh nhưng mỗi loại văcxin có thể có số mũi cần tiêm phòng khác
nhau
- Thời gian chờ giữa các mũi tiêm cũng khác nhau giữa các loại văcxin
Ví dụ: Văcxin A sau khi tiêm mũi 1 thì đến 1 tháng sau mới tiêm mũi 2, Văcxin B
thì sau 2 tháng mới tiêm mũi 2
- Mỗi loại văcxin có giá thành khác nhau
- Không được phép tiêm các loại văcxin khác nhau cùng một lúc cho cùng một
bệnh
Ví dụ: Khi tiêm phòng bệnh sởi, nếu mũi thứ nhất đã tiêm loại văcxin của Bỉ
thì ở những mũi tiêm tiếp theo cũng phải dùng loại văcxin này, không được
tiêm loại văcxin của Mỹ, Ý…
- Đối với loại văcxin cần tiêm nhiều mũi, sau khi tiêm mũi thứ nhất, phải lập lịch
hẹn khách hàng để tiêm các mũi tiếp theo
- Có một số loại văcxin có thể tiêm phòng cho nhiều bệnh cùng lúc
Lược đồ cơ sở dữ liệu quan hệ của hệ thống được mô tả như sau:
Trang 25 STTMui: Là số thứ tự của mũi, vd: mũi thứ nhất có STTMui = 1, mũi thứ hai
có giá trị là 2
NgayHenTiepTheo: Là ngày được hẹn để tiêm mũi tiếp theo (nếu có)
SoMui: là số lượng mũi cần phải tiêm đối với từng loại văcxin
GiaVacxin: là giá tiền của 1 mũi văcxin
Bảng PHONGBENH dùng để xác định loại văcxin nào có thể phòng được
bệnh nào
Thiết kế web bằng ngôn ngữ lập trình JSP, SERVLET theo MVC:
Yêu cầu về chức năng:
- Tạo mới một loại văcxin
- Sửa một loại văcxin
- Liệt kê toàn bộ lịch sử tiêm phòng của một khách hàng bao gồm các thông tin:
Mã Khách Hàng, Tên Khách Hàng, Tên Bệnh, Mã Văcxin, Tên Văcxin, Tổng
số mũi cần phải tiêm
- Thống kê tổng số tiền đã trả cho trung tâm của từng khách hàng, sắp xếp theo
chiều tăng dần của tổng số tiền đã trả
- Cho phép tìm kiếm theo tên vacxin của các hãng sản xuất
Yêu cầu về kỹ thuật:
- Tạo đầy đủ CSDL và kết nối được đến CSDL bằng code Java
- Sử dụng JSP và Servlet theo đúng mô hình MVC
2.2 Phân tích hệ thống
Trang 26Theo yêu cầu của bài toàn chúng ta chi cần xây dựng các chức năng sau:
Có chức năng admin của hệ thống, có yêu cầu đăng nhập để quản lý
Không có chức năng cho phần end-user
Mỗi khách hàng đến trung tâm sẽ được tạo một tài khoản để theo dõi lịch
sử tiêm phòng
- Quản lý Vác xin:
Tạo mới một loại văcxin
Sửa một loại văcxin
Cho phép tìm kiếm theo tên vacxin của các hãng sản xuất
- Thống kê tổng số tiền đã trả cho trung tâm của từng khách hàng, sắp xếp theo
chiều tăng dần của tổng số tiền đã trả
- Liệt kê toàn bộ lịch sử tiêm phòng của một khách hàng bao gồm các thông tin:
Mã Khách Hàng, Tên Khách Hàng, Tên Bệnh, Mã Văcxin, Tên Văcxin, Tổng
số mũi cần phải tiêm
Vì vậy các usercase sau:
Quản lý thông tin vắc xin:
Trang 27Quản lý xếp lịch tiêm chủng:
Quản lý kết quả tiêm chủng: