JavaWeb學習(16): 三層架構模式實現簡單的學生管理系統(內含數據庫)


飯前點心:

該程序采用三層架構的模式實現對用戶信息的增刪改查,功能尚未完善,不過實現基本的要求應該是沒問題的。
采用的數據庫是 Mysql.

前置知識:

三層架構

三層架構流程(通過增加用戶舉例):

Code:

表示層前台:

index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import = "java.util.List" %>
<%@ page import = "org.entity.Student" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<% 
			// 增加 一個標記,用作提示是否增加成功
			String error = (String)request.getAttribute("error");
			if(error != null ) {
				if(error.equals("addError")){
					out.print("增加失敗");
				} else if(error.equals("successAdd")){
					out.print("增加成功");
				}
			}
		%>
		<!-- 表格布局實現顯示用戶的各個信息 -->
		<table border = "1">
			<tr>
				<th>學號</th>
				<th>姓名</th>
				<th>年齡</th>
				<th>性別</th>
				<th>地址</th>
				<th>操作</th>
			</tr>
		<!-- 因為用戶是動態的,所以我們選擇用循環進行動態添加 -->
				<% 
					// 后台通過 request 進行請求轉發將所有用戶傳輸到前台,通過 getAttribute(),setAttribute()可以添加請求中的信息
					List<Student> students = (List<Student>)request.getAttribute("students");
					
					for(Student student:students) {
				%>	 
					<tr>
						<!-- 將學號設置成一個超鏈接,點擊即可實現查看用戶的詳細信息 -->
						<td> <a href = "QueryStudentStudent?sno=<%=student.getSno() %>"><%=student.getSno() %></a>  </td>
						<td> <%=student.getName()%></td>
						<td> <%=student.getAge() %></td>
						<td> <%=student.getSex() %></td>
						<td> <%=student.getSad() %></td>
						<td> <a href = "DeleteStudentServlet?sno=<%=student.getSno()%>">刪除 </a></td>
					</tr>
				 <% 
				 	}
					
				 %>
			
		</table>
		<!-- 超鏈接到 add.jsp 進行 增加用戶 -->
		<a href = "add.jsp">注冊</a>
</body>
</html>

studentInfo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "org.entity.Student" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<%
			// 獲取從后台傳過來的數據域(根據 Key 取 Value)
			Student student = (Student)request.getAttribute("student");
		
		%>
		
		<form action="UpdateStudentServlet">
			<!-- Value 用來顯示文本框中的內容,通過request傳過來的數據域,我們可以顯示用戶的信息 -->
			學號:<input type = "text" name = "sno" value = <%=student.getSno() %>>       <br>
			姓名:<input type = "text" name = "sname" value = <%=student.getName() %>>		<br>
			年齡:<input type = "text" name = "sage" value = <%=student.getAge() %>>		<br>
			性別:<input type = "text" name = "ssex" value = <%=student.getSex() %>>		<br>
			地址:<input type = "text" name = "sad" value = <%=student.getSad() %>>		<br>
			
			<input type = "submit" value = "修改">
			<!-- 返回當然要先查詢信息,即更新信息再返回,我們在 QueryAllStudentServlet中就會跳轉到首頁 -->
			<a href = "QueryAllStudentServlet">返回</a>
		</form>
		
</body>
</html>

add.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<!-- 跳轉到Servlet 實現用戶的增加 -->
		<form action="AddStudentServlet" method = "post">
			學號: <input type = "text" name = "sno"> <br/>
			姓名: <input type = "text" name = "sname"> <br/>
			年齡: <input type = "text" name = "sage"> <br/>
			性別: <input type = "text" name = "ssex"> <br/>
			地址: <input type = "text" name = "sad"> <br/>
			
			<input type = "submit" value = "注冊">

		</form>
</body>
</html>

表示層后台(一個Servlet 對應一個功能):

AddStudentServlet.java:

package org.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.entity.Student;
import org.service.StudentService;

@WebServlet("/AddStudentServlet")
public class AddStudentServlet extends HttpServlet {
	
	/*
	 *  增加用戶
	 * 用戶在前台輸入信息,在Servlet中將用戶信息封裝成一個實體類
	 * 通過Service(業務邏輯層)將用戶信息添加到數據庫
	 *
	 * */
	
	
	private static final long serialVersionUID = 1L;
       
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 一定要設置成統一的編碼
		request.setCharacterEncoding("utf-8");
		
		int sno = Integer.parseInt(request.getParameter("sno"));
		String sname = request.getParameter("sname");
		int age = Integer.parseInt(request.getParameter("sage"));
		String sex = request.getParameter("ssex");
		String address = request.getParameter("sad");
		// 將用戶信息封裝成一個實體類,便於傳遞
		Student student = new Student(sno,sname,age,sex,address);
		// new 一個 StudentService 對象(業務邏輯層)
		StudentService studentService = new StudentService();
		// 調用方法實現增加用戶的信息(在業務邏輯層實現邏輯,具體功能在 Dao 層實現)
		boolean result = studentService.addStudent(student);
		// 響應時編碼問題進行統一
		response.setContentType("text/html; charset=UTF-8");
		response.setCharacterEncoding("utf-8");
		
		
		if(!result) {
			request.setAttribute("error", "addError");
		} else {
			request.setAttribute("error", "successAdd");
		}
		// 無論增加成功與失敗都要將結果返回到前台,通過請求轉發的形式,不會丟失數據
		request.getRequestDispatcher("QueryAllStudentServlet").forward(request, response);
		
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doGet(request, response);
	}

}

DeleteStudentServlet.java

package org.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.service.StudentService;

@WebServlet("/DeleteStudentServlet")
public class DeleteStudentServlet extends HttpServlet {
	
	/*
	 * 功能: 根據學號刪除某個學生
	 * 
	 * */
	
	private static final long serialVersionUID = 1L;
       
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		int sno = Integer.parseInt(request.getParameter("sno"));
		
		StudentService studentService = new StudentService();
		// 設置響應時編碼
		response.setContentType("text/html; charset=UTF-8");
		response.setCharacterEncoding("utf-8");
		boolean result = studentService.deleteStudent(sno);
		if(result) {
			response.getWriter().println("刪除成功");
			response.sendRedirect("QueryAllStudentServlet");
		} else {
			response.getWriter().println("刪除失敗");
		}
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

QueryAllStudentServlet:

package org.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.entity.Student;
import org.service.StudentService;


@WebServlet("/QueryAllStudentServlet")
public class QueryAllStudentServlet extends HttpServlet {
	
	/*
	 * 功能:查詢所有用戶信息
	 *     所有用戶肯定要用一個 List集合來存儲
	 * 
	 * */
	
	private static final long serialVersionUID = 1L;
       
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		StudentService studentService = new StudentService();
		
		List<Student> students = studentService.queryAllStudents();
		
		System.out.println(students);
		// 將數據內容存在數據域中
		request.setAttribute("students", students);
		// 將數據內容通過跳轉的方式傳輸到 index.jsp
		request.getRequestDispatcher("index.jsp").forward(request, response);
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

QueryStudentStudent.java

package org.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.entity.Student;
import org.service.StudentService;


@WebServlet("/QueryStudentStudent")
public class QueryStudentStudent extends HttpServlet {
	
	/*
	 * 功能: 根據學號查詢用戶信息
	 * 
	 * */
	
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		int no = Integer.parseInt(request.getParameter("sno"));
		
		StudentService studentService = new StudentService();
		
		Student student = studentService.queryStudentBySno(no);
		
		System.out.println(student);
		
		// 將用戶的信息通過 request 進行請求轉發的方式跳轉到另一個頁面
		// 通過 setAttribute()方法增加請求信息,另一個頁面通過前面的 key("student") 取到后面的 value
		request.setAttribute("student",student);
		
		request.getRequestDispatcher("studentInfo.jsp").forward(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

UpdateStudentServlet.java

package org.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.entity.Student;
import org.service.StudentService;


@WebServlet("/UpdateStudentServlet")
public class UpdateStudentServlet extends HttpServlet {
	
	/*
	 * 功能: 根據用戶的學號更新用戶的其他信息
	 * 
	 * */
	
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		int sno = Integer.parseInt(request.getParameter("sno"));

		String name = request.getParameter("sname");
		int age = Integer.parseInt(request.getParameter("sage"));
		String sex = request.getParameter("ssex");
		String sad = request.getParameter("sad");
		// 將要修改的內容封裝到一個實體類中
		Student student = new Student(sno,name,age,sex,sad);
		
		StudentService studentService = new StudentService();
		
		// 設置響應時編碼
		response.setContentType("text/html; charset=UTF-8");
		response.setCharacterEncoding("utf-8");
		
		boolean result = studentService.updateStudent(sno, student);
		if(result) {
			response.getWriter().println("修改成功");
			// 修改成功后返回到所有用戶的界面
			response.sendRedirect("QueryAllStudentServlet");
			
		} else {
			response.getWriter().println("修改失敗");
		}
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

業務邏輯層(Service):

StudentService.java

package org.service;

import java.util.List;

// 業務邏輯層

import org.dao.StudentDao;
import org.entity.Student;

/* 
 * 業務邏輯層:組合各種信息,返回給 Servlet
 * 	實現功能:
 * 		1、增加用戶(增加用戶之前需要先判斷用戶是否已經存在)
 * 		2、刪除用戶(刪除用戶之前需要先判斷用戶是否已經存在)
 * 		3、更新用戶(更新用戶之前需要先判斷用戶是否已經存在)
 * 		4、根據用戶號查詢用戶信息
 * 		5、查詢所有用戶信息
 * 	具體來說,每一個功能都對應一個 Servlet。
 * */

public class StudentService {
	// 所有的具體功能都通過 StudentDao 進行實現
	StudentDao stu = new StudentDao();
	// 根據用戶號查詢用戶信息
	public Student queryStudentBySno(int sno) {
		return stu.queryStudentBySno(sno);
	}
	// 查詢所有用戶信息
	public List<Student> queryAllStudents() {
		return stu.queryAllStudents();
	}
	// 更新用戶(更新用戶之前需要先判斷用戶是否已經存在)
	public boolean updateStudent(int sno,Student student) {
		if(stu.isExist(sno)) {
			return stu.updateStudentBySno(sno, student);
		}
		return false;
	}
	// 刪除用戶(刪除用戶之前需要先判斷用戶是否已經存在)
	public boolean deleteStudent(int sno) {
		if(stu.isExist(sno)) {
			return stu.deleteStudentBySno(sno);
		}
		return false;
	}
	// 增加用戶(增加用戶之前需要先判斷用戶是否已經存在)
	public boolean addStudent(Student student) {
		
		// 不存在時返回 true, 存在時返回false
		if(!stu.isExist(student.getSno())) {
			stu.addStudent(student);
			return true;
		} else {
			return false;
		}
		
	}

}

數據訪問(Dao 層):

package org.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.entity.Student;

public class StudentDao {
	private static final String URL = "jdbc:mysql://localhost:3306/sqltest";
	private static final String User = "root";
	private static final String Password = "root";
	
	// 判斷該用戶是否存在
	public boolean isExist(int sno) {
		// 查詢該學生的學號是否存在,存在就返回true,不存在則返回 false
		return queryStudentBySno(sno) == null ? false : true; 
	}
	
	// 添加新用戶
	public boolean addStudent(Student student) {
		Connection conn = null;
		PreparedStatement pstam = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			
			conn = DriverManager.getConnection(URL,User,Password);
			
			String sql = "insert into student values (?,?,?,?,?)";
			
			pstam = conn.prepareStatement(sql);
			
			pstam.setInt(1, student.getSno());
			pstam.setString(2, student.getName());
			pstam.setInt(3, student.getAge());
			pstam.setString(4,student.getSex());
			pstam.setString(5, student.getSad());
			
			int result = pstam.executeUpdate();
			
			if(result > 0) return true;
			else return false;
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(pstam != null )
				try {
					pstam.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(conn != null )
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
		return false;
	}
	
	// 根據學生學號修改學生信息
	public boolean updateStudentBySno(int sno,Student student) {
		Connection conn = null;
		PreparedStatement pstam = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			
			conn = DriverManager.getConnection(URL,User,Password);
			
			String sql = "update student set sname = ?,sage = ?,ssex = ?,sad = ? where sno = ?";
			
			pstam = conn.prepareStatement(sql);
			
			pstam.setString(1, student.getName());
			pstam.setInt(2, student.getAge());
			pstam.setString(3,student.getSex());
			pstam.setString(4,student.getSad());
			
			pstam.setInt(5, sno);
			
			int result = pstam.executeUpdate();
			
			if(result > 0) return true;
			else return false;
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(pstam != null )
				try {
					pstam.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(conn != null )
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
		return false;
	}
	
	// 刪除用戶
	public boolean deleteStudentBySno(int sno) {
		Connection conn = null;
		PreparedStatement pstam = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			
			conn = DriverManager.getConnection(URL,User,Password);
			
			String sql = "delete from student where sno = ?";
			
			pstam = conn.prepareStatement(sql);
			
			pstam.setInt(1, sno);
			
			
			int result = pstam.executeUpdate();
			
			if(result > 0) return true;
			else return false;
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			if(pstam != null )
				try {
					pstam.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(conn != null )
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
		}
	}
	
	// 查詢所有用戶
	public List<Student> queryAllStudents() {
		Connection conn = null;
		PreparedStatement pstam = null;
		ResultSet rs = null;
		
		List<Student> students = new ArrayList<>();
		Student student = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			
			conn = DriverManager.getConnection(URL,User,Password);
			
			String sql = "select * from student";
			
			pstam = conn.prepareStatement(sql);
			
			rs = pstam.executeQuery();
			
			while(rs.next()) {
				int no = rs.getInt("sno");
				String name = rs.getString("sname");
				int age = rs.getInt("sage");
				String sex = rs.getString("ssex");
				String sad = rs.getString("sad");
				// 將每個用戶的信息封裝成一個實體類,便於傳遞
				student = new Student(no,name,age,sex,sad);
				// 將每個用戶添加到集合中進行返回
				students.add(student);
			}
			return students;
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null )
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(pstam != null )
				try {
					pstam.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(conn != null )
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
		return null;
	}
	
	// 通過學號查詢學生信息(返回值是一個學生,如果學生不存在返回 Null)
	public Student queryStudentBySno(int sno) {
		
		Connection conn = null;
		PreparedStatement pstam = null;
		ResultSet rs = null;
		
		Student student = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			
			conn = DriverManager.getConnection(URL,User,Password);
			
			String sql = "select * from student where sno = ?";
			
			pstam = conn.prepareStatement(sql);
			
			pstam.setInt(1, sno);
			
			rs = pstam.executeQuery();
			
			if(rs.next()) {
				int no = rs.getInt("sno");
				String name = rs.getString("sname");
				int age = rs.getInt("sage");
				String sex = rs.getString("ssex");
				String sad = rs.getString("sad");
				
				student = new Student(no,name,age,sex,sad);
				return student;

			} else {
				return null;
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null )
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(pstam != null )
				try {
					pstam.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(conn != null )
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
		return null;
	}
}

實體類(用戶封裝用戶信息):

package org.entity;

public class Student {
	
	/* 實體類:對應 數據庫中的一張表
	 * 
	 * */
	
	
	private int sno;
	private String name;
	private int age;
	private String sex;
	private String sad;
	
	
	// 無參的構造
	public Student() {
		
	}
	
	public Student(int sno, String name, int age, String sex, String sad) {
		this.sno = sno;
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.sad = sad;
	}
	public int getSno() {
		return sno;
	}
	public void setSno(int sno) {
		this.sno = sno;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getSad() {
		return sad;
	}

	public void setSad(String sad) {
		this.sad = sad;
	}

	@Override
	public String toString() {
		return "Student [sno=" + sno + ", name=" + name + ", age=" + age + ", sex=" + sex + ", sad=" + sad + "]";
	}
	
	
	
}

客官勿踩坑:

運行改代碼時首先訪問的頁面應該是  QueryAllStudent.java ,因為本系統首先映入眼簾的是各個用戶的信息。
不過不用擔心,QueryAllStudent.java 中會以請求轉發的方式跳轉到首頁。
您也可以在 web.xml 中 將 QueryAllStudent 設置為第一個即可。

客官請看:

index:

studentinfo:

delete:

update:

add:

客官留步:

本人深知,該系統還有很多的 Bug 及不足,如需要源代碼及文件包,請私信我。
客官有任何問題可以在下方留言,共同學習交流,交個朋友。
感謝您的光顧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM