飯前點心:
該程序采用三層架構的模式實現對用戶信息的增刪改查,功能尚未完善,不過實現基本的要求應該是沒問題的。
采用的數據庫是 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 及不足,如需要源代碼及文件包,請私信我。
客官有任何問題可以在下方留言,共同學習交流,交個朋友。
感謝您的光顧。