1.Bean層(Model層)?
- 角色:就像餐廳里的“菜品”。
- ?功能:是純數據對象(如Person類),封裝屬性和 getter/setter(例如用戶名、密碼)。
- ?示例:Person類
package com.bean;public class Person {private int id;private String name;private String pwd;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}
}
2.Dao層(Data Access Object)?
- 角色:后廚的“廚師”,專注做菜(操作數據)。
- ?功能:直接和數據庫對話,執行增刪改查(CRUD)。
- ?示例:
UserDAO
?類中的?saveUser(User user)
?方法,負責把用戶數據存入數據庫。
接口
package com.dao;import com.bean.Person;import java.sql.SQLException;
import java.util.List;public interface PersonDao {public List<Person> queryAll() throws SQLException;public Boolean selectOne(Person person) throws SQLException;public int save(Person person) throws SQLException;
}
實現接口
package com.dao.impl;import com.bean.Person;
import com.dao.PersonDao;
import com.db.DB;import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class PersonDaoImpl implements PersonDao {// ------------------------- 方法1:查詢所有用戶 -------------------------@Overridepublic List<Person> queryAll() throws SQLException {Connection connection=new DB().getConnection(); //獲取數據庫連接Statement statement= connection.createStatement(); //創建SQL執行器ResultSet resultSet= statement.executeQuery("select * from person"); //執行查詢SQL語句List list=new ArrayList(); //準備空集合裝數據while (resultSet.next()){ //遍歷查詢結果(一行一行讀)Person p=new Person(); //新建數據盒子p.setId(resultSet.getInt(1)); //取第一列(id)放入盒子p.setName(resultSet.getString(2)); //取第二列(name)放入p.setPwd(resultSet.getString(3)); //取第三列(pwd)放入list.add(p); //把盒子加入集合}resultSet.close();statement.close();connection.close();return list;}// ------------------------- 方法2:檢查用戶名是否存在 -------------------------@Overridepublic Boolean selectOne(Person person) throws SQLException {//Connection connection=new DB().getConnection(); getConnection()為靜態方法就可以之間如下:Connection connection= DB.getConnection(); //獲取一個數據庫連接PreparedStatement statement= connection.prepareStatement("select * from person where name=?");statement.setString(1,person.getName()); //設置參數(替換第一個問號)ResultSet resultSet= statement.executeQuery(); //執行查詢if (resultSet.next()){return false;}else {return true;}}// ------------------------- 方法3:保存用戶 -------------------------@Overridepublic int save(Person person) throws SQLException {Connection connection= DB.getConnection();// 預編譯SQL(提高性能,防止注入)PreparedStatement statement= connection.prepareStatement("insert into person(name,pwd) values(?,?)");statement.setString(1,person.getName()); //設置第一個參數(name)statement.setString(2,person.getPwd()); //設置第二個參數(pwd)int i= statement.executeUpdate(); //執行插入操作statement.close();connection.close();return i; //返回影響的行數(1=成功,0=失敗)}
}
3.DB(驅動連接數據庫)
- ?角色:餐廳的“倉庫”,存儲所有食材。
- ?功能:持久化保存數據(如 MySQL、PostgreSQL)
package com.db;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DB {public static Connection getConnection(){Connection connection=null;try {Class.forName("com.mysql.cj.jdbc.Driver");connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return connection;}}
4.Service層
- 角色:餐廳的“經理”,協調復雜流程。
- ?功能:處理業務邏輯(例如注冊時檢查用戶名是否重復 + 加密密碼)。
- ?示例:
UserService
?的?registerUser()
?方法會調用 DAO 的多個操作,并處理事務。
接口
package com.service;import com.bean.Person;import java.sql.SQLException;
import java.util.List;public interface PersonSercie {public List<Person> AllPerson() throws SQLException;public boolean register(Person person) throws SQLException;
}
實現接口
package com.service.impl;import com.bean.Person;
import com.dao.PersonDao;
import com.dao.impl.PersonDaoImpl;
import com.service.PersonSercie;import java.sql.SQLException;
import java.util.List;public class PersonServiceImpl implements PersonSercie {@Overridepublic List<Person> AllPerson() throws SQLException {PersonDao dao=new PersonDaoImpl(); // 1. 創建DAO對象,準備訪問數據庫return dao.queryAll(); // 2. 調用DAO查詢所有用戶}@Overridepublic boolean register(Person person) throws SQLException {PersonDao dao=new PersonDaoImpl();//檢查用戶名是否已存在if(dao.selectOne(person)){ //調用DAO查詢是否存在同名用戶dao.save(person); //無重復 → 保存用戶return true; //返回注冊成功}else {return false; //返回注冊失敗}}
}
5.Servlet(Controller層)?
- 角色:餐廳的“服務員”,接待客人并傳遞需求。
- ?功能:接收 HTTP 請求(如?
POST /login
),調用 Service 處理,返回響應(跳轉頁面或 JSON)。 - ?示例:
LoginServlet
?獲取表單參數,交給?UserService
?驗證登錄。
刪除
package com.servlet;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 java.io.IOException;
import java.sql.*;@WebServlet(name = "DeleteServlet",urlPatterns = "/del")
public class DeleteServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String id=request.getParameter("id");try {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");//Statement statement= connection.createStatement();PreparedStatement statement= connection.prepareStatement("delete from person where id=?");statement.setInt(1,Integer.parseInt(id));int i=statement.executeUpdate();if(i>0){response.sendRedirect("listall");}else {response.getWriter().println("Error");}statement.close();connection.close();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}
}
查看
package com.servlet;import com.bean.Person;
import com.service.PersonSercie;
import com.service.impl.PersonServiceImpl;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 java.io.IOException;
import java.sql.*;
import java.util.List;@WebServlet(name = "ListAllServlet",urlPatterns = "/listall")
public class ListAllServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PersonSercie personSercie=new PersonServiceImpl();try {List<Person> list=personSercie.AllPerson();request.setAttribute("persons",list);request.getRequestDispatcher("listall.jsp").forward(request,response);} catch (SQLException e) {e.printStackTrace();}}
}
增加
package com.servlet;import com.bean.Person;
import com.service.PersonSercie;
import com.service.impl.PersonServiceImpl;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 java.io.IOException;
import java.sql.SQLException;@WebServlet(name = "RegServlet",urlPatterns = "/reg")
public class RegServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String name=request.getParameter("uname");String pwd=request.getParameter("upwd");Person person=new Person();person.setName(name);person.setPwd(pwd);//調用模型中注冊業務邏輯實現PersonSercie personSercie = new PersonServiceImpl(); // 創建服務層對象(業務邏輯處理者)try {if(personSercie.register(person)){ // 調用服務層的注冊方法response.sendRedirect("login.jsp"); // 注冊成功:跳轉到登錄頁}else {response.sendRedirect("reg.jsp");// 注冊失敗:返回注冊頁};} catch (SQLException e) {e.printStackTrace();}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
改1
package com.servlet;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 java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;@WebServlet(name = "UpdateDoServlet",urlPatterns = "/updateDo")
public class UpdateDoServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String id=request.getParameter("id");String name=request.getParameter("username");String pwd=request.getParameter("userpwd");try {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");//Statement statement= connection.createStatement();PreparedStatement statement= connection.prepareStatement("update person set name=?,pwd=? where id=?");statement.setString(1,name);statement.setString(2,pwd);statement.setInt(3,Integer.parseInt(id));int i=statement.executeUpdate();if(i>0){response.sendRedirect("listall");}else {response.getWriter().println("Error");}statement.close();connection.close();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
改2
package com.servlet;import com.bean.Person;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 java.io.IOException;
import java.sql.*;@WebServlet(name = "UpdateServlet",urlPatterns = "/update")
public class UpdateServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String id=request.getParameter("id");try {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");PreparedStatement statement= connection.prepareStatement("select * from person where id=?");statement.setInt(1,Integer.parseInt(id));ResultSet resultSet=statement.executeQuery();Person p=new Person();if (resultSet.next()){p.setId(resultSet.getInt(1));p.setName(resultSet.getString(2));p.setPwd(resultSet.getString(3));}request.setAttribute("user",p);resultSet.close();statement.close();connection.close();request.getRequestDispatcher("update.jsp").forward(request,response);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}
}
總結
大概流程:就像網購流程:JSP→ 你下單(Servlet收件)→ 調度中心檢查(Service處理)→ 倉庫存取(DAO操作→倉庫DB)→ 最終收到包裹(響應結果)
-
?用戶填寫表單
👉 在?reg.jsp
?頁面輸入用戶名和密碼,點擊提交。 -
?Servlet接收請求
👉?RegServlet
?像快遞員一樣收到包裹(HTTP請求),拆開包裹取出數據(request.getParameter
)。 -
?封裝成Bean
👉 把數據裝進?Person
?盒子(person.setName(name)
)。 -
?Service處理業務
👉 調度員(PersonServiceImpl
)開始工作:- 問倉庫管理員(DAO):“這個用戶名有人用嗎?”(
selectOne
) - 如果沒人用,告訴管理員:“存進倉庫!”(
save
)
- 問倉庫管理員(DAO):“這個用戶名有人用嗎?”(
-
?DAO操作數據庫
👉 管理員打開倉庫(DB連接),執行 SQL 存入數據。 -
?返回結果給用戶
👉 Servlet 根據結果,跳轉到登錄頁(成功)或返回注冊頁(失敗)。
至于Servlet中doGet和doPost方法該使用哪個
?