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方法该使用哪个