JavaWeb案例——用户信息管理系统

1. 需求分析

  1. 完成一个用户信息管理系统(基于 BS 架构),功能如下:

    • 分页展示用户信息
    • 添加用户信息
    • 删除用户信息(可以删除选中用户)
    • 修改用户信息(包括用户数据的回显)
    • 查询用户信息(可以输入条件,模糊查询)
  2. 效果图如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. 概要设计

2.1 技术选型

  • Tomcat 服务器
  • Servlet
  • JSP
  • Bootstrap
  • Mysql 数据库
  • Spring JDBC
  • Druid 连接池
  • BeanUtils

2.2 数据库设计

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `gender` varchar(5) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(32) DEFAULT NULL,
  `qq` varchar(20) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.3 分页展示用户功能设计

在这里插入图片描述

在这里插入图片描述

2.4 添加用户功能设计

在这里插入图片描述

2.5 删除用户功能设计

在这里插入图片描述

2.6 删除选中用户功能设计

在这里插入图片描述

2.7 修改用户功能设计

在这里插入图片描述

2.8 查询用户功能设计

在这里插入图片描述

3. 开发阶段

3.1 环境搭建

  1. 创建数据库环境

    1. 打开 Navicat,新建一个数据库 day17
    2. 创建 user 表(表的结构概要设计中已给出)
  2. 创建项目

    打开 IDEA,创建一个 Java EE 项目,Java EE version 为 Java EE 7,勾选 Web Application,不勾选 Create web.xml,项目名称为 day17_2

  3. 导入需要的 jar 包

    导入需要的 jar 包到 web/WEB-INF/lib 中,右键 Add as Library

    • commons-beanutils-1.8.3.jar
    • jstl-impl.jar
    • commons-logging-1.1.1.jar
    • spring-core-4.2.4.RELEASE.jar
    • spring-beans-4.2.4.RELEASE.jar
    • javax.servlet.jsp.jstl.jar
    • druid-1.0.9.jar
    • spring-jdbc-4.2.4.RELEASE.jar
    • mysql-connector-java-5.1.18-bin.jar
    • spring-tx-4.2.4.RELEASE.jar
  4. 创建配置文件

    在 src 下创建 Druid 配置文件 druid.properties

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/day17
    username=root
    password=123456
    initialSize=5
    maxActive=10
    maxWait=3000
    
    
  5. 修改 Tomcat 配置

    1. 热部署:将 On ‘Update’ action 修改为 Redeploy 和 On frame deactivation 修改为 Update classes and resourses
    2. 修改端口号:将 HTTP Port 修改为 80
    3. 修改虚拟目录:将 Application context 修改为 /day17_2

3.2 前端代码

  1. 将 Bootstrap 相关的 css,fonts,js 三个文件夹复制到 web 目录下

  2. 首页 index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="utf-8"/>
      <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
      <meta name="viewport" content="width=device-width, initial-scale=1"/>
      <title>首页</title>
    
      <!-- 1. 导入CSS的全局样式 -->
      <link href="css/bootstrap.min.css" rel="stylesheet">
      <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
      <script src="js/jquery-2.1.0.min.js"></script>
      <!-- 3. 导入bootstrap的js文件 -->
      <script src="js/bootstrap.min.js"></script>
      <script type="text/javascript">
      </script>
    </head>
    <style>
      div{
        text-align: center;
      }
      a{
        font-size:33px;
      }
    </style>
    <body>
    <div>
      <a
            href="${pageContext.request.contextPath}/FindUserByPageServlet">进入用户信息管理系统
      </a>
    </div>
    </body>
    </html>
    
  3. 用户信息列表页面 list.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <!-- 网页使用的语言 -->
    <html lang="zh-CN">
    <head>
        <!-- 指定字符集 -->
        <meta charset="utf-8">
        <!-- 使用Edge最新的浏览器的渲染方式 -->
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
        width: 默认宽度与设备的宽度相同
        initial-scale: 初始的缩放比,为1:1 -->
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>用户信息管理系统</title>
    
        <!-- 1. 导入CSS的全局样式 -->
        <link href="css/bootstrap.min.css" rel="stylesheet">
        <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
        <script src="js/jquery-2.1.0.min.js"></script>
        <!-- 3. 导入bootstrap的js文件 -->
        <script src="js/bootstrap.min.js"></script>
        <style>
            h3 {
                text-align: center;
            }
    
            #search {
                float: left;
                margin: 10px;
            }
    
            #search div {
                margin-right: 5px;
            }
    
            #add_del {
                float: right;
                margin: 10px;
            }
    
            #add_del a {
                margin-left: 5px;
            }
    
            td, th {
                text-align: center;
            }
    
            #paging_info {
                font-size: 15px;
                margin-left: 10px;
                line-height: 35px;
            }
        </style>
        <script>
            function deleteUser(id) {
                //用户安全提示
                if (confirm("您确定要删除吗?")) {
                    //访问路径
                    location.href = "${pageContext.request.contextPath}/DelUserServlet?id=" + id;
                }
            }
    
            window.onload = function () {
                // 给删除选中按钮添加删除事件
                document.getElementById("delSelected").onclick = function () {
                    if (confirm("您确定要删除吗?")) {
                        var flag = false;
                        // 判断是否有选中条目
                        var cbs = document.getElementsByName("id");
                        for (var i = 0; i < cbs.length; i++) {
                            if (cbs[i].checked) {
                                // 有一个条目选中了
                                flag = true;
                                break;
                            }
                        }
                        // 有条目被选中
                        if (flag) {
                            // 表单提交
                            document.getElementById("form").submit();
                        }
                    }
                }
    
                // 全选按钮
                // 1.获取第一个 cb
                document.getElementById("firstCb").onclick = function () {
                    //2.获取下边列表中所有的 cb
                    var cbs = document.getElementsByName("id");
                    //3.遍历
                    for (var i = 0; i < cbs.length; i++) {
                        //4.设置这些cbs[i]的checked状态 = firstCb.checked
                        cbs[i].checked = this.checked;
    
                    }
    
                }
            }
        </script>
    </head>
    <body>
    <div class="container">
        <%--标题--%>
        <h3>用户信息列表</h3>
    
        <%--查询用户信息--%>
        <form id="search" class="form-inline" action="${pageContext.request.contextPath}/FindUserByPageServlet" method="post">
            <div class="form-group">
                <label for="exampleInputName2">姓名</label>
                <input type="text" name="name" value="${condition.name[0]}" class="form-control" id="exampleInputName2">
            </div>
            <div class="form-group">
                <label for="exampleInputName3">籍贯</label>
                <input type="text" name="address" value="${condition.address[0]}" class="form-control" id="exampleInputName3">
            </div>
            <div class="form-group">
                <label for="exampleInputEmail2">Email</label>
                <input type="email" name="email" value="${condition.email[0]}" class="form-control" id="exampleInputEmail2">
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-default">查询</button>
            </div>
        </form>
    
        <%--增加和删除用户信息按钮--%>
        <div id="add_del">
            <a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加用户</a>
            <a class="btn btn-primary" href="javascript:void(0);" id="delSelected">删除选中</a>
        </div>
            
        <%--用户信息表单--%>
        <form id="form" action="${pageContext.request.contextPath}/DelSelectedServlet" method="post">
            <table border="1" class="table table-bordered table-hover">
                <tr class="success">
                    <th><input type="checkbox" id="firstCb"></th>
                    <th>编号</th>
                    <th>姓名</th>
                    <th>性别</th>
                    <th>年龄</th>
                    <th>籍贯</th>
                    <th>QQ</th>
                    <th>邮箱</th>
                    <th>操作</th>
                </tr>
                <c:forEach items="${userByPage.list}" var="user" varStatus="s">
                    <tr>
                        <td><input type="checkbox" name="id" value="${user.id}"></td>
                        <td>${s.count}</td>
                        <td>${user.name}</td>
                        <td>${user.gender}</td>
                        <td>${user.age}</td>
                        <td>${user.address}</td>
                        <td>${user.qq}</td>
                        <td>${user.email}</td>
                        <td><a class="btn btn-default btn-sm"
                               href="${pageContext.request.contextPath}/FindUserServlet?id=${user.id}">修改</a>&nbsp;
                            <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a>
                        </td>
                    </tr>
                </c:forEach>
            </table>
        </form>
    
        <%--分页--%>
        <nav>
            <ul class="pagination">
                <%--上一页--%>
                <c:if test="${userByPage.currentPage == 1}">
                    <li class="disabled">
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">&laquo;</span>
                        </a>
                    </li>
                </c:if>
                <c:if test="${userByPage.currentPage != 1}">
                    <li>
                        <a href="${pageContext.request.contextPath}/FindUserByPageServlet?currentPage=${userByPage.currentPage-1}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}"
                           aria-label="Previous">
                            <span aria-hidden="true">&laquo;</span>
                        </a>
                    </li>
                </c:if>
                <%--第 n 页面--%>
                <c:forEach begin="1" end="${userByPage.totalPage}" step="1" var="i">
                    <c:if test="${userByPage.currentPage == i}">
                        <li class="active">
                            <a href="${pageContext.request.contextPath}/FindUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a>
                        </li>
                    </c:if>
                    <c:if test="${userByPage.currentPage != i}">
                        <li>
                            <a href="${pageContext.request.contextPath}/FindUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a>
                        </li>
                    </c:if>
                </c:forEach>
                <%--下一页--%>
                <c:if test="${userByPage.currentPage == userByPage.totalPage}">
                    <li class="disabled">
                        <a href="#" aria-label="Next">
                            <span aria-hidden="true">&raquo;</span>
                        </a>
                    </li>
                </c:if>
                <c:if test="${userByPage.currentPage != userByPage.totalPage}">
                    <li>
                        <a href="${pageContext.request.contextPath}/FindUserByPageServlet?currentPage=${userByPage.currentPage+1}&rows=5&&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}"
                           aria-label="Next">
                            <span aria-hidden="true">&raquo;</span>
                        </a>
                    </li>
                </c:if>
                <%--分页信息--%>
                <span id="paging_info">共${userByPage.totalCount}条记录,共${userByPage.totalPage}页</span>
            </ul>
        </nav>
    </div>
    </body>
    </html>
    
    
  4. 添加用户页面 add.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <!-- HTML5文档-->
    <!DOCTYPE html>
    <!-- 网页使用的语言 -->
    <html lang="zh-CN">
    <head>
        <!-- 指定字符集 -->
        <meta charset="utf-8">
        <!-- 使用Edge最新的浏览器的渲染方式 -->
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
        width: 默认宽度与设备的宽度相同
        initial-scale: 初始的缩放比,为1:1 -->
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>添加用户</title>
    
        <!-- 1. 导入CSS的全局样式 -->
        <link href="css/bootstrap.min.css" rel="stylesheet">
        <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
        <script src="js/jquery-2.1.0.min.js"></script>
        <!-- 3. 导入bootstrap的js文件 -->
        <script src="js/bootstrap.min.js"></script>
        <style>
            #add {
                width:400px;
            }
            h3 {
                text-align: center;
            }
            #btn {
                text-align: center;
            }
        </style>
    </head>
    <body>
    <div class="container" id="add">
        <h3>添加用户</h3>
    
        <form action="${pageContext.request.contextPath}/AddUserServlet" method="post">
            <div class="form-group">
                <label for="name">姓名:</label>
                <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
            </div>
    
            <div class="form-group">
                <label>性别:</label>
                <input type="radio" name="gender" value="男" checked="checked"/>男
                <input type="radio" name="gender" value="女"/>女
            </div>
    
            <div class="form-group">
                <label for="age">年龄:</label>
                <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
            </div>
    
            <div class="form-group">
                <label for="address">籍贯:</label>
                <select name="address" class="form-control" id="address">
                    <option value="北京">北京</option>
                    <option value="上海">上海</option>
                    <option value="广州">广州</option>
                </select>
            </div>
    
            <div class="form-group">
                <label for="qq">QQ:</label>
                <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
            </div>
    
            <div class="form-group">
                <label for="email">Email:</label>
                <input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/>
            </div>
    
            <div class="form-group" id="btn">
                <input class="btn btn-primary" type="submit" value="提交" />
                <input class="btn btn-default" type="reset" value="重置" />
                <a class="btn btn-default" href="${pageContext.request.contextPath}/FindUserByPageServlet">返回</a>
            </div>
        </form>
    </div>
    </body>
    </html>
    
  5. 修改用户页面 update.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <!-- 网页使用的语言 -->
    <html lang="zh-CN">
    <head>
        <!-- 指定字符集 -->
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>修改用户</title>
    
        <link href="css/bootstrap.min.css" rel="stylesheet">
        <script src="js/jquery-2.1.0.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
    
    </head>
    <style>
        #update {
            width:400px;
        }
        h3 {
            text-align: center;
        }
        #btn {
            text-align: center;
        }
    </style>
    <body>
    <div class="container" id="update">
        <h3>修改用户</h3>
        <form action="${pageContext.request.contextPath}/UpdateUserServlet" method="post">
            <%--隐藏域提交 id--%>
            <input type="hidden" name="id" value="${user.id}">
    
            <div class="form-group">
                <label for="name">姓名:</label>
                <input type="text" class="form-control" id="name" name="name" value="${user.name}" readonly="readonly" placeholder="请输入姓名" />
            </div>
    
            <div class="form-group">
                <label>性别:</label>
                <c:if test="${user.gender == '男'}">
                    <input type="radio" name="gender" value="男" checked />男
                    <input type="radio" name="gender" value="女" />女
                </c:if>
                <c:if test="${user.gender == '女'}">
                    <input type="radio" name="gender" value="男" />男
                    <input type="radio" name="gender" value="女" checked />女
                </c:if>
            </div>
    
            <div class="form-group">
                <label for="age">年龄:</label>
                <input type="text" class="form-control" id="age"  name="age" value="${user.age}" placeholder="请输入年龄" />
            </div>
    
            <div class="form-group">
                <label for="address">籍贯:</label>
                <select name="address" class="form-control" id="address">
                    <c:if test="${user.address == '北京'}">
                        <option value="北京" selected>北京</option>
                        <option value="上海">上海</option>
                        <option value="广州">广州</option>
                    </c:if>
                    <c:if test="${user.address == '上海'}">
                        <option value="北京">北京</option>
                        <option value="上海" selected>上海</option>
                        <option value="广州">广州</option>
                    </c:if>
                    <c:if test="${user.address == '广州'}">
                        <option value="北京">北京</option>
                        <option value="上海">上海</option>
                        <option value="广州" selected>广州</option>
                    </c:if>
                </select>
            </div>
    
            <div class="form-group">
                <label for="qq">QQ:</label>
                <input type="text" class="form-control" id="qq" name="qq" value="${user.qq}" placeholder="请输入QQ号码"/>
            </div>
    
            <div class="form-group">
                <label for="email">Email:</label>
                <input type="text" class="form-control" id="email" name="email" value="${user.email}" placeholder="请输入邮箱地址"/>
            </div>
    
            <div class="form-group" id="btn">
                <input class="btn btn-primary" type="submit" value="提交" />
                <input class="btn btn-default" type="reset" value="重置" />
                <a class="btn btn-default" href="${pageContext.request.contextPath}/FindUserByPageServlet">返回</a>
            </div>
        </form>
    </div>
    </body>
    </html>
    
    

3.3 后端代码

  1. 在 src 中创建 com.zt 包,在其中创建以下包:

    • utils
    • domain
    • dao
      • impl
    • service
      • impl
    • web
      • servlet
  2. utils 包

    • JDBCUtils

      package com.zt.utils;
      
      import com.alibaba.druid.pool.DruidDataSourceFactory;
      
      import javax.sql.DataSource;
      import java.io.IOException;
      import java.io.InputStream;
      import java.sql.Connection;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      import java.util.Properties;
      
      public class JDBCUtils {
      
          // 1.定义静态变量 dataSource
          private static DataSource dataSource;
      
          static {
              try {
                  // 2.加载配置文件
                  Properties properties = new Properties();
                  InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
                  properties.load(resourceAsStream);
                  // 3.创建数据库连接池对象,并赋值给 dataSource
                  dataSource = DruidDataSourceFactory.createDataSource(properties);
              } catch (IOException e) {
                  e.printStackTrace();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
          /**
           * 获取连接池方法
           */
          public static DataSource getDataSource() {
              return dataSource;
          }
      
          /**
           * 通过数据库连接池获取连接对象
           */
          public static Connection getConnection() throws SQLException {
              return dataSource.getConnection();
          }
      
          /**
           * 释放资源
           */
          public static void close(ResultSet resultSet, Statement statement, Connection connection) {
              if (resultSet != null) {
                  try {
                      resultSet.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              if (statement != null) {
                  try {
                      statement.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              if (connection != null) {
                  try {
                      connection.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
          }
      
          public static void close(Statement statement, Connection connection) {
              close(null, statement, connection);
          }
      
      
      }
      
      
  3. domain 包

    • User

      package com.zt.domain;
      
      /**
       * 用户对象
       */
      public class User {
          private int id;
          private String name;
          private String gender;
          private int age;
          private String address;
          private String qq;
          private String email;
      
          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 getGender() {
              return gender;
          }
      
          public void setGender(String gender) {
              this.gender = gender;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          public String getAddress() {
              return address;
          }
      
          public void setAddress(String address) {
              this.address = address;
          }
      
          public String getQq() {
              return qq;
          }
      
          public void setQq(String qq) {
              this.qq = qq;
          }
      
          public String getEmail() {
              return email;
          }
      
          public void setEmail(String email) {
              this.email = email;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "id=" + id +
                      ", name='" + name + '\'' +
                      ", gender='" + gender + '\'' +
                      ", age=" + age +
                      ", address='" + address + '\'' +
                      ", qq='" + qq + '\'' +
                      ", email='" + email + '\'' +
                      '}';
          }
      
      
      }
      
      
    • PageBean

      package com.zt.domain;
      
      import java.util.List;
      
      /**
       * 分页对象
       */
      public class PageBean<T> {
          private int totalCount; // 总记录数
          private int totalPage; // 总页码数
          private int currentPage; // 当前页码
          private int rows; // 每页显示的条数
          private List<T> list; // 每页的数据
      
          public int getTotalCount() {
              return totalCount;
          }
      
          public void setTotalCount(int totalCount) {
              this.totalCount = totalCount;
          }
      
          public int getTotalPage() {
              return totalPage;
          }
      
          public void setTotalPage(int totalPage) {
              this.totalPage = totalPage;
          }
      
          public int getCurrentPage() {
              return currentPage;
          }
      
          public void setCurrentPage(int currentPage) {
              this.currentPage = currentPage;
          }
      
          public int getRows() {
              return rows;
          }
      
          public void setRows(int rows) {
              this.rows = rows;
          }
      
          public List<T> getList() {
              return list;
          }
      
          public void setList(List<T> list) {
              this.list = list;
          }
      
          @Override
          public String toString() {
              return "PageBean{" +
                      "totalCount=" + totalCount +
                      ", totalPage=" + totalPage +
                      ", currentPage=" + currentPage +
                      ", rows=" + rows +
                      ", list=" + list +
                      '}';
          }
      }
      
      
  4. dao 包

    • UserDao

      package com.zt.dao;
      
      import com.zt.domain.User;
      
      import java.util.List;
      import java.util.Map;
      
      public interface UserDao {
      
          /**
           * 添加用户信息
            * @param user
           */
          public void add(User user);
      
          /**
           * 删除用户信息
           * @param id
           */
          public void delete(int id);
      
          /**
           * 查询用户信息
           * @param id
           * @return
           */
          public User find(int id);
      
          /**
           * 更新用户信息
           * @param user
           */
          public void update(User user);
      
          /**
           * 查询总记录数
           * @return
           * @param condition
           */
          public int findTotalCount(Map<String, String[]> condition);
      
          /**
           * 分页条件查询用户信息
           * @param start
           * @param rows
           * @param condition
           * @return
           */
          public List<User> findByPage(int start, int rows, Map<String, String[]> condition);
      }
      
      
    • UserDaoImpl

      package com.zt.dao.impl;
      
      import com.zt.dao.UserDao;
      import com.zt.domain.User;
      import com.zt.utils.JDBCUtils;
      import org.springframework.jdbc.core.BeanPropertyRowMapper;
      import org.springframework.jdbc.core.JdbcTemplate;
      
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Map;
      import java.util.Set;
      
      public class UserDaoImpl implements UserDao {
          // 使用 Spring JDBC 操作数据库
          private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
      
          @Override
          public void add(User user) {
              String sql = "insert into user values(null,?,?,?,?,?,?)";
              jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());
          }
      
          @Override
          public void delete(int id) {
              String sql = "delete from user where id = ?";
              jdbcTemplate.update(sql,id);
          }
      
          @Override
          public User find(int id) {
              String sql = "select * from user where id = ?";
              User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);
              return user;
          }
      
          @Override
          public void update(User user) {
              String sql = "update user set name = ?, gender = ?, age = ?, address = ?, qq = ?, email = ? where id = ?";
              jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail(),user.getId());
          }
      
          @Override
          public int findTotalCount(Map<String, String[]> condition) {
              // 1.定义初始化 sql,注意 sql语句后加空格
              String sql = "select count(*) from user where 1 = 1 ";
              StringBuilder stringBuilder = new StringBuilder(sql);
              // 2.定义参数的集合 params
              List<Object> params = new ArrayList<Object>();
              // 3.遍历 condition
              Set<String> keySet = condition.keySet();
              for (String key : keySet) {
                  // 排除分页条件参数
                  if("currentPage".equals(key) || "rows".equals(key)){
                      continue;
                  }
                  // 获取 value
                  String value = condition.get(key)[0];
                  // 判断 value 是否有值
                  if(value != null || !"".equals(value)){
                      // 给 sql 附加条件语句,注意 sql语句前后加空格
                      stringBuilder.append(" And " + key +" like ? ");
                      // 将 value 放入 params 集合
                      params.add("%"+value+"%");
                  }
              }
      
              return jdbcTemplate.queryForObject(stringBuilder.toString(), Integer.class, params.toArray());
          }
      
          @Override
          public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
              // 1.定义初始化 sql,注意 sql语句后加空格
              String sql = "select * from user where 1 = 1 ";
              StringBuilder stringBuilder = new StringBuilder(sql);
              // 2.定义参数的集合 params
              List<Object> params = new ArrayList<Object>();
              // 3.遍历 condition
              Set<String> keySet = condition.keySet();
              for (String key : keySet) {
                  // 排除分页条件参数
                  if("currentPage".equals(key) || "rows".equals(key)){
                      continue;
                  }
                  // 获取 value
                  String value = condition.get(key)[0];
                  // 判断 value 是否有值
                  if(value != null || !"".equals(value)){
                      // 给 sql 附加条件语句,注意 sql语句前后加空格
                      stringBuilder.append(" And " + key +" like ? ");
                      // 将 value 放入 params 集合
                      params.add("%"+value+"%");
                  }
              }
              // 4.添加分页条件
              stringBuilder.append(" limit ?,? ");
              // 5.添加分页条件参数值
              params.add(start);
              params.add(rows);
      
              return jdbcTemplate.query(stringBuilder.toString(), new BeanPropertyRowMapper<User>(User.class), params.toArray());
          }
      }
      
      
  5. service 包

    • UserService

      package com.zt.service;
      
      import com.zt.domain.PageBean;
      import com.zt.domain.User;
      
      import java.util.Map;
      
      public interface UserService {
      
          /**
           * 添加用户信息
           * @param user
           */
          public void addUser(User user);
      
          /**
           * 删除用户信息
           * @param id
           */
          public void deleteUser(String id);
      
          /**
           * 查询用户信息
           * @param id
           */
          public User findUser(String id);
      
          /**
           * 更新用户信息
           * @param user
           */
          public void updateUser(User user);
      
          /**
           * 分页条件查询用户信息
           * @param currentPage
           * @param rows
           * @param condition
           * @return
           */
          public PageBean<User> findUserByPage(String currentPage, String rows, Map<String, String[]> condition);
      
      }
      
      
    • UserServiceImpl

      package com.zt.service.impl;
      
      import com.zt.dao.UserDao;
      import com.zt.dao.impl.UserDaoImpl;
      import com.zt.domain.PageBean;
      import com.zt.domain.User;
      import com.zt.service.UserService;
      
      import java.util.List;
      import java.util.Map;
      
      public class UserServiceImpl implements UserService {
          // 调用 UserDaoImpl 来实现业务逻辑
          private UserDao userDao = new UserDaoImpl();
      
          @Override
          public void addUser(User user) {
              userDao.add(user);
          }
      
          @Override
          public void deleteUser(String id) {
              userDao.delete(Integer.parseInt(id));
          }
      
          @Override
          public User findUser(String id) {
              return userDao.find(Integer.parseInt(id));
          }
      
          @Override
          public void updateUser(User user) {
              userDao.update(user);
          }
      
          @Override
          public PageBean<User> findUserByPage(String currentPage, String rows, Map<String, String[]> condition) {
              int currentPage1 = Integer.parseInt(currentPage);
              int rows1 = Integer.parseInt(rows);
              // 1.创建一个空的 PageBean 对象
              PageBean<User> userPageBean = new PageBean<>();
              // 2.设置属性
              userPageBean.setCurrentPage(currentPage1);
              userPageBean.setRows(rows1);
              // 3.调用 dao 查询总记录数
              int totalCount = userDao.findTotalCount(condition);
              userPageBean.setTotalCount(totalCount);
              // 4.调用 dao 查询 list 集合
              // 计算开始的记录索引
              int start = (currentPage1 - 1) * rows1;
              List<User> byPage = userDao.findByPage(start, rows1, condition);
              userPageBean.setList(byPage);
              // 5.计算总页码数
              int totalPage = totalCount % rows1 == 0 ?  totalCount/rows1 : totalCount/rows1 + 1;
              userPageBean.setTotalPage(totalPage);
      
              return userPageBean;
          }
      }
      
      
  6. servlet 包

    • FindUserByPageServlet

      package com.zt.web.servlet;
      
      import com.zt.domain.PageBean;
      import com.zt.domain.User;
      import com.zt.service.UserService;
      import com.zt.service.impl.UserServiceImpl;
      
      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.util.Map;
      
      @WebServlet("/FindUserByPageServlet")
      public class FindUserByPageServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              // 1.设置编码
              request.setCharacterEncoding("utf-8");
              // 2.获取参数
              String currentPage = request.getParameter("currentPage"); // 当前页码
              String rows = request.getParameter("rows"); // 每页显示条数
              Map<String, String[]> condition = request.getParameterMap();
      
              // 3.参数为空的情况
              if(currentPage == null || "".equals(currentPage)) {
                  currentPage = "1";
              }
              if(rows == null || "".equals(rows)) {
                  rows = "5";
              }
      
              // 4.调用 UserService 完成查询
              UserService userService = new UserServiceImpl();
              PageBean<User> userByPage = userService.findUserByPage(currentPage, rows, condition);
              // 5.将 userByPage 存入 request
              request.setAttribute("userByPage",userByPage);
              // 6.将 condition 存入 request
              request.setAttribute("condition",condition);
              // 7.转发到 list.jsp
              request.getRequestDispatcher("/list.jsp").forward(request,response);
      
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
      
    • AddUserServlet

      package com.zt.web.servlet;
      
      import com.zt.domain.User;
      import com.zt.service.UserService;
      import com.zt.service.impl.UserServiceImpl;
      import org.apache.commons.beanutils.BeanUtils;
      
      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.lang.reflect.InvocationTargetException;
      import java.util.List;
      import java.util.Map;
      
      @WebServlet("/AddUserServlet")
      public class AddUserServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              // 1.设置编码
              request.setCharacterEncoding("utf-8");
              // 2.获取参数
              Map<String, String[]> parameterMap = request.getParameterMap();
              // 3.封装对象
              User user = new User();
              try {
                  BeanUtils.populate(user,parameterMap);
              } catch (IllegalAccessException e) {
                  e.printStackTrace();
              } catch (InvocationTargetException e) {
                  e.printStackTrace();
              }
              // 4.调用 UserService 完成添加
              UserService userService = new UserServiceImpl();
              userService.addUser(user);
      
              //5.重定向到 FindUserByPageServlet
              response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
      
    • DelUserServlet

      package com.zt.web.servlet;
      
      import com.zt.service.UserService;
      import com.zt.service.impl.UserServiceImpl;
      
      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;
      
      @WebServlet("/DelUserServlet")
      public class DelUserServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              // 1.获取参数
              String id = request.getParameter("id");
              // 2.调用 UserService 完成删除
              UserService userService = new UserServiceImpl();
              userService.deleteUser(id);
              // 3.重定向到 FindUserByPageServlet
              response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
      
    • DelSelectedServlet

      package com.zt.web.servlet;
      
      import com.zt.service.UserService;
      import com.zt.service.impl.UserServiceImpl;
      
      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;
      
      @WebServlet("/DelSelectedServlet")
      public class DelSelectedServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              // 1.获取参数
              String[] ids = request.getParameterValues("id");
              // 2.调用 UserService 完成删除
              UserService userService = new UserServiceImpl();
              for (String id : ids) {
                  userService.deleteUser(id);
              }
              // 3.重定向到 FindUserByPageServlet
              response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
      
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
      
    • FindUserServlet

      package com.zt.web.servlet;
      
      import com.zt.domain.User;
      import com.zt.service.UserService;
      import com.zt.service.impl.UserServiceImpl;
      
      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;
      
      @WebServlet("/FindUserServlet")
      public class FindUserServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              // 1.获取参数
              String id = request.getParameter("id");
              // 2.调用 UserService 完成查询
              UserService userService = new UserServiceImpl();
              User user = userService.findUser(id);
              // 3.将 user 存入 request
              request.setAttribute("user",user);
              // 4.转发到 update.jsp
              request.getRequestDispatcher("/update.jsp").forward(request,response);
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
      
    • UpdateUserServlet

      package com.zt.web.servlet;
      
      import com.zt.domain.User;
      import com.zt.service.UserService;
      import com.zt.service.impl.UserServiceImpl;
      import org.apache.commons.beanutils.BeanUtils;
      
      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.lang.reflect.InvocationTargetException;
      import java.util.Map;
      
      @WebServlet("/UpdateUserServlet")
      public class UpdateUserServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              // 1.设置编码
              request.setCharacterEncoding("utf-8");
              // 2.获取参数
              Map<String, String[]> parameterMap = request.getParameterMap();
              // 3.封装对象
              User user = new User();
              try {
                  BeanUtils.populate(user,parameterMap);
              } catch (IllegalAccessException e) {
                  e.printStackTrace();
              } catch (InvocationTargetException e) {
                  e.printStackTrace();
              }
              // 4.调用 UserService 完成修改
              UserService userService = new UserServiceImpl();
              userService.updateUser(user);
      
              //5.重定向到 FindUserByPageServlet
              response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
      
发布了64 篇原创文章 · 获赞 20 · 访问量 6510

猜你喜欢

转载自blog.csdn.net/bm1998/article/details/100128275
今日推荐