JSP+Servlet实现对数据库增编削查之进阶mvc架构

打印 上一主题 下一主题

主题 921|帖子 921|积分 2763

1.Bean层(Model层)​


  • 脚色:就像餐厅里的“菜品”。
  • 功能:是纯数据对象(如Person类),封装属性和 getter/setter(比方用户名、密码)。
  • 示例Person类
  1. package com.bean;
  2. public class Person {
  3.     private int id;
  4.     private String name;
  5.     private String pwd;
  6.     public int getId() {
  7.         return id;
  8.     }
  9.     public void setId(int id) {
  10.         this.id = id;
  11.     }
  12.     public String getName() {
  13.         return name;
  14.     }
  15.     public void setName(String name) {
  16.         this.name = name;
  17.     }
  18.     public String getPwd() {
  19.         return pwd;
  20.     }
  21.     public void setPwd(String pwd) {
  22.         this.pwd = pwd;
  23.     }
  24. }
复制代码
2.Dao层(Data Access Object)​




  • 脚色:后厨的“厨师”,专注做菜(操纵数据)。
  • 功能:直接和数据库对话,实行增编削查(CRUD)。
  • 示例:UserDAO 类中的 saveUser(User user) 方法,负责把用户数据存入数据库。
接口
  1. package com.dao;
  2. import com.bean.Person;
  3. import java.sql.SQLException;
  4. import java.util.List;
  5. public interface PersonDao {
  6.     public List<Person> queryAll() throws SQLException;
  7.     public  Boolean selectOne(Person person) throws SQLException;
  8.     public int save(Person person) throws SQLException;
  9. }
复制代码
实现接口
  1. package com.dao.impl;
  2. import com.bean.Person;
  3. import com.dao.PersonDao;
  4. import com.db.DB;
  5. import java.sql.*;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. public class PersonDaoImpl implements PersonDao {
  9.     // ------------------------- 方法1:查询所有用户 -------------------------
  10.     @Override
  11.     public List<Person> queryAll() throws SQLException {
  12.         Connection connection=new DB().getConnection(); //获取数据库连接
  13.         Statement statement= connection.createStatement(); //创建SQL执行器
  14.         ResultSet resultSet= statement.executeQuery("select * from person"); //执行查询SQL语句
  15.         List list=new ArrayList(); //准备空集合装数据
  16.         while (resultSet.next()){  //遍历查询结果(一行一行读)
  17.             Person p=new Person(); //新建数据盒子
  18.             p.setId(resultSet.getInt(1));  //取第一列(id)放入盒子
  19.             p.setName(resultSet.getString(2));  //取第二列(name)放入
  20.             p.setPwd(resultSet.getString(3));  //取第三列(pwd)放入
  21.             list.add(p); //把盒子加入集合
  22.         }
  23.         resultSet.close();
  24.         statement.close();
  25.         connection.close();
  26.         return list;
  27.     }
  28.     // ------------------------- 方法2:检查用户名是否存在 -------------------------
  29.     @Override
  30.     public Boolean selectOne(Person person) throws SQLException {
  31.         //Connection connection=new DB().getConnection(); getConnection()为静态方法就可以之间如下:
  32.         Connection connection= DB.getConnection(); //获取一个数据库连接
  33.         PreparedStatement statement= connection.prepareStatement("select * from person where name=?");
  34.         statement.setString(1,person.getName()); //设置参数(替换第一个问号)
  35.         ResultSet resultSet= statement.executeQuery(); //执行查询
  36.         if (resultSet.next()){
  37.             return false;
  38.         }else {
  39.            return true;
  40.        }
  41.     }
  42.     // ------------------------- 方法3:保存用户 -------------------------
  43.     @Override
  44.     public int save(Person person) throws SQLException {
  45.         Connection connection= DB.getConnection();
  46.         //  预编译SQL(提高性能,防止注入)
  47.         PreparedStatement statement= connection.prepareStatement("insert into person(name,pwd) values(?,?)");
  48.         statement.setString(1,person.getName()); //设置第一个参数(name)
  49.         statement.setString(2,person.getPwd()); //设置第二个参数(pwd)
  50.         int i= statement.executeUpdate(); //执行插入操作
  51.         statement.close();
  52.         connection.close();
  53.         return i; //返回影响的行数(1=成功,0=失败)
  54.     }
  55. }
复制代码
3.DB(驱动连接数据库)



  • 脚色:餐厅的“仓库”,存储所有食材。
  • 功能:持久化生存数据(如 MySQL、PostgreSQL)
  1. package com.db;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. public  class  DB {
  6.     public static Connection getConnection(){
  7.         Connection connection=null;
  8.         try {
  9.             Class.forName("com.mysql.cj.jdbc.Driver");
  10.             connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");
  11.         } catch (ClassNotFoundException e) {
  12.             e.printStackTrace();
  13.         } catch (SQLException e) {
  14.             e.printStackTrace();
  15.         }
  16.         return connection;
  17.     }
  18. }
复制代码
4.Service层



  • 脚色:餐厅的“经理”,和谐复杂流程。
  • 功能:处理业务逻辑(比方注册时检查用户名是否重复 + 加密密码)。
  • 示例:UserService 的 registerUser() 方法会调用 DAO 的多个操纵,并处理事件。
接口
  1. package com.service;
  2. import com.bean.Person;
  3. import java.sql.SQLException;
  4. import java.util.List;
  5. public interface PersonSercie {
  6.     public List<Person> AllPerson() throws SQLException;
  7.     public boolean register(Person person) throws SQLException;
  8. }
复制代码
实现接口
  1. package com.service.impl;
  2. import com.bean.Person;
  3. import com.dao.PersonDao;
  4. import com.dao.impl.PersonDaoImpl;
  5. import com.service.PersonSercie;
  6. import java.sql.SQLException;
  7. import java.util.List;
  8. public class PersonServiceImpl implements PersonSercie {
  9.     @Override
  10.     public List<Person> AllPerson() throws SQLException {
  11.         PersonDao dao=new PersonDaoImpl(); // 1. 创建DAO对象,准备访问数据库
  12.         return dao.queryAll();  // 2. 调用DAO查询所有用户
  13.     }
  14.     @Override
  15.     public boolean register(Person person) throws SQLException {
  16.         PersonDao dao=new PersonDaoImpl();
  17.         //检查用户名是否已存在
  18.         if(dao.selectOne(person)){  //调用DAO查询是否存在同名用户
  19.             dao.save(person); //无重复 → 保存用户
  20.             return true; //返回注册成功
  21.         }else {
  22.             return false; //返回注册失败
  23.         }
  24.     }
  25. }
复制代码
5.Servlet(Controller层)​




  • 脚色:餐厅的“服务员”,欢迎客人并传递需求。
  • 功能:接收 HTTP 请求(如 POST /login),调用 Service 处理,返反响应(跳转页面或 JSON)。
  • 示例:LoginServlet 获取表单参数,交给 UserService 验证登录。
删除
  1. package com.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.sql.*;
  9. @WebServlet(name = "DeleteServlet",urlPatterns = "/del")
  10. public class DeleteServlet extends HttpServlet {
  11.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12.     }
  13.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14.         String id=request.getParameter("id");
  15.         try {
  16.         Class.forName("com.mysql.cj.jdbc.Driver");
  17.         Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");
  18.         //Statement statement= connection.createStatement();
  19.            PreparedStatement statement= connection.prepareStatement("delete  from person where id=?");
  20.            statement.setInt(1,Integer.parseInt(id));
  21.            int i=statement.executeUpdate();
  22.            if(i>0){
  23.                response.sendRedirect("listall");
  24.            }else {
  25.                response.getWriter().println("Error");
  26.            }
  27.         statement.close();
  28.         connection.close();
  29.     } catch (ClassNotFoundException e) {
  30.         e.printStackTrace();
  31.     } catch (SQLException e) {
  32.         e.printStackTrace();
  33.     }
  34.     }
  35. }
复制代码
查看
  1. package com.servlet;
  2. import com.bean.Person;
  3. import com.service.PersonSercie;
  4. import com.service.impl.PersonServiceImpl;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.io.IOException;
  11. import java.sql.*;
  12. import java.util.List;
  13. @WebServlet(name = "ListAllServlet",urlPatterns = "/listall")
  14. public class ListAllServlet extends HttpServlet {
  15.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  16.     }
  17.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18.         PersonSercie personSercie=new PersonServiceImpl();
  19.         try {
  20.             List<Person> list=personSercie.AllPerson();
  21.             request.setAttribute("persons",list);
  22.             request.getRequestDispatcher("listall.jsp").forward(request,response);
  23.         } catch (SQLException e) {
  24.             e.printStackTrace();
  25.         }
  26.     }
  27. }
复制代码
增加
  1. package com.servlet;
  2. import com.bean.Person;
  3. import com.service.PersonSercie;
  4. import com.service.impl.PersonServiceImpl;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.io.IOException;
  11. import java.sql.SQLException;
  12. @WebServlet(name = "RegServlet",urlPatterns = "/reg")
  13. public class RegServlet extends HttpServlet {
  14.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15.         String name=request.getParameter("uname");
  16.         String pwd=request.getParameter("upwd");
  17.         Person person=new Person();
  18.         person.setName(name);
  19.         person.setPwd(pwd);
  20.         //调用模型中注册业务逻辑实现
  21.         PersonSercie personSercie = new PersonServiceImpl(); // 创建服务层对象(业务逻辑处理者)
  22.         try {
  23.             if(personSercie.register(person)){  // 调用服务层的注册方法
  24.                 response.sendRedirect("login.jsp");   // 注册成功:跳转到登录页
  25.             }else {
  26.                 response.sendRedirect("reg.jsp");// 注册失败:返回注册页
  27.             };
  28.         } catch (SQLException e) {
  29.             e.printStackTrace();
  30.         }
  31.     }
  32.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  33.     }
  34. }
复制代码
改1
  1. package com.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.sql.Connection;
  9. import java.sql.DriverManager;
  10. import java.sql.PreparedStatement;
  11. import java.sql.SQLException;
  12. @WebServlet(name = "UpdateDoServlet",urlPatterns = "/updateDo")
  13. public class UpdateDoServlet extends HttpServlet {
  14.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15.         String id=request.getParameter("id");
  16.         String name=request.getParameter("username");
  17.         String pwd=request.getParameter("userpwd");
  18.         try {
  19.             Class.forName("com.mysql.cj.jdbc.Driver");
  20.             Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");
  21.             //Statement statement= connection.createStatement();
  22.             PreparedStatement statement= connection.prepareStatement("update person set name=?,pwd=? where  id=?");
  23.             statement.setString(1,name);
  24.             statement.setString(2,pwd);
  25.             statement.setInt(3,Integer.parseInt(id));
  26.             int i=statement.executeUpdate();
  27.             if(i>0){
  28.                 response.sendRedirect("listall");
  29.             }else {
  30.                 response.getWriter().println("Error");
  31.             }
  32.             statement.close();
  33.             connection.close();
  34.         } catch (ClassNotFoundException e) {
  35.             e.printStackTrace();
  36.         } catch (SQLException e) {
  37.             e.printStackTrace();
  38.         }
  39.     }
  40.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  41.     }
  42. }
复制代码
改2
  1. package com.servlet;
  2. import com.bean.Person;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.sql.*;
  10. @WebServlet(name = "UpdateServlet",urlPatterns = "/update")
  11. public class UpdateServlet extends HttpServlet {
  12.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13.     }
  14.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15.         String id=request.getParameter("id");
  16.         try {
  17.             Class.forName("com.mysql.cj.jdbc.Driver");
  18.             Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");
  19.             PreparedStatement statement= connection.prepareStatement("select *  from person where id=?");
  20.             statement.setInt(1,Integer.parseInt(id));
  21.             ResultSet resultSet=statement.executeQuery();
  22.             Person p=new Person();
  23.         if (resultSet.next()){
  24.             p.setId(resultSet.getInt(1));
  25.             p.setName(resultSet.getString(2));
  26.            p.setPwd(resultSet.getString(3));
  27.         }
  28.         request.setAttribute("user",p);
  29.         resultSet.close();
  30.             statement.close();
  31.             connection.close();
  32.             request.getRequestDispatcher("update.jsp").forward(request,response);
  33.         } catch (ClassNotFoundException e) {
  34.             e.printStackTrace();
  35.         } catch (SQLException e) {
  36.             e.printStackTrace();
  37.         }
  38.     }
  39. }
复制代码
总结

大概流程:就像网购流程:JSP→ 你下单(Servlet收件)→ 调度中心检查(Service处理)→ 仓库存取(DAO操纵→仓库DB)→ 终极收到包裹(响应结果)

  • 用户填写表单
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表