2021_01_09_实习实训_day05_员工后台管理项目_员工列表、新增、查询及复选功能

项目empManeger_2021

员工列表

员工列表页面empList.jsp的实现

<%@ page import="java.util.List" %>
<%@ page import="com.wangbiao.emp.model.Emp" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/1/8
  Time: 15:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>用户列表</title>
    <link rel="stylesheet" href="css/base.css">
    <link rel="stylesheet" href="css/bootstrap.min.css">

    <style>

        #pageDiv{
     
     
            height: 100px;
            margin-bottom: 240px;
        }

    </style>

</head>
<body>
    <div style="float:right;">当前用户:${uname}</div>
    <%--展示员工数据--%>
    <div align="center">

        <h3>欢迎登录员工管理后台</h3>
        <div>
            员工姓名:<input type="text"  id="filter" name="filter" placeholder="请输入员工姓名" value="${filter}">
            <input type="button" class="btn btn-primary" value="查询" onclick="query()">&nbsp;&nbsp;&nbsp;&nbsp;
            <input type="button" class="btn btn-primary" value="新增" onclick="showAdd()"/>
            <input type="button" class="btn btn-primary" value="删除" onclick="delEmp()"/>
            <input type="button" class="btn btn-primary" value="编辑" onclick="editEmp()"/>
        </div>
        <br>
        <table style="width: 750px" class="table table-striped table-bordered table-hover">
            <tr>
                <td align="center"><input type="checkbox" id="chk_all" onclick="chkAll()">全选</td>
                <td align="center">序号</td>
                <td align="center">员工编号</td>
                <td align="center">员工姓名</td>
                <td align="center">员工工作</td>
                <td align="center">入职日期</td>
                <td align="center">员工性别</td>
            </tr>
            <%--使用JSTL的方式实现List的循环--%>
            <c:forEach items="${list}" var="emp" varStatus="vs">
                <tr>
                    <td align="center"><input type="checkbox" value="${emp.empno}" name="chk" onclick="chkItem()"></td>
                    <td align="center">${vs.index + 1}</td>
                    <td align="center">${emp.empno}</td>
                    <td align="center">${emp.ename}</td>
                    <td align="center">${emp.job}</td>
                    <td align="center">${emp.hiredate}</td>
                    <td align="center">${emp.sex}</td>
                </tr>
            </c:forEach>
        </table>
    </div>
    <input id="msg" type="hidden" value="${msg}">
    <div align="center" id="pageDiv">
        <%--显示页码按钮--%>
        <c:if test="${currPage == 1}">
            <button onclick="prev('${currPage}')" class="btn btn-primary" disabled>上一页</button>
        </c:if>
        <c:if test="${currPage != 1}">
            <button onclick="prev('${currPage}')" class="btn btn-primary">上一页</button>
        </c:if>

        <c:forEach var="pageIndex" begin="1" end="${totalPage}" step="1">
            <button onclick="queryPage('${pageIndex}')" class="btn btn-primary">${pageIndex}</button>
        </c:forEach>

        <c:if test="${currPage == totalPage}">
            <button onclick="next('${currPage}')" class="btn btn-primary" disabled>下一页</button>
        </c:if>
        <c:if test="${currPage != totalPage}">
            <button onclick="next('${currPage}')" class="btn btn-primary" >下一页</button>
        </c:if>

    </div>
    <%--获取后台传递来的msg提示信息--%>
    <%--隐藏域,页面中不显示,用它来接收后台传递的msg提示信息--%>


    <script>
        window.onload = function () {
     
     
            //展示提示信息
            var msg = document.getElementById("msg").value;
            if(msg != "" && msg != null){
     
     
                alert(msg);
            }
        }


        //新增按钮的触发事件
        function showAdd(){
     
     
            //展示新增页面,填写员工信息
            window.location.href = "addEmp.jsp";
        }

        //查询功能
        function query(){
     
     
            //获取用户填写的值,并将其发送给后台服务器
            var filter = document.getElementById("filter").value;
            //通过js的方式请求后台
            window.location.href = "GetAllEmpServlet?filter="+filter;
        }
        
        //全选功能
        function chkAll() {
     
     
            //获取全选框的选中状态:true/false
            var isChk = document.getElementById("chk_all").checked;
            //获取每行的复选框
            var arrChk = document.getElementsByName("chk");
            //循环每行的复选框
            for(var i=0; i<arrChk.length; i++){
     
     
                //设置复选框的选中状态
                arrChk[i].checked = isChk;
            }
        }
        
        function chkItem() {
     
     
            //通过每行的复选框控制全选框
            //每选中一个复选框时,都要去判断其他的复选框有没有被选中
            //只要有一个复选框没有被选中,那么全选框就无需选中

            //每勾掉一个复选框时,无需关注其他复选框,全选框直接被勾掉即可
            var arrChk = document.getElementsByName("chk");

            //默认所有的复选框都被选中了
            var isAll = true;
            for(var i=0; i<arrChk.length; i++){
     
     
                //一旦有复选框未必勾选
                if(!arrChk[i].checked){
     
     
                    //全选框不能被选中
                    isAll = false;
                    //跳出循环,无需关注其他复选框
                    break;
                }
            }
            //通过isAll的值决定全选框是否被选中
            document.getElementById("chk_all").checked = isAll;
        }

        //删除功能
        function delEmp(){
     
     
            //判断用户是否选择数据,如果没有选择,我们需要给出提示
            //获取所有的复选框
            var isChk = false;
            var arrChk = document.getElementsByName("chk");
            for(var i=0; i<arrChk.length; i++){
     
     
                if(arrChk[i].checked){
     
     
                    isChk = true;
                    break;
                }
            }
            if(!isChk){
     
     
                alert("请选择要删除的员工信息");
                //结束当前方法,结束删除的动作
                return;
            }
            //如果用户选择了数据,那么要进行二次确认
            if(confirm("确定要删除所选记录么?")){
     
     
                //用户点击了确定按钮,执行接下来的操作
                //获取选中员工的工号,并传递的后台进行删除
                //只有工号才能唯一确定某个员工

                //该变量用于存放所有被选中的员工工号
                var empnos = "";

                for(var i=0; i<arrChk.length; i++){
     
     
                    //判断:如果当前复选框被选中,那么就获取value值
                    if(arrChk[i].checked){
     
     
                        empnos = empnos + arrChk[i].value;
                        empnos += ",";
                    }
                }

                //empnos的值为:  1,2,3,
                //字符串的截取,去掉最后一个,
                empnos = empnos.substring(0,empnos.length-1);

                //请求后台,将empnos传递到后台,进行删除操作
                window.location.href = "DelEmpServlet?empnos=" + empnos;


            }
        }

        //编辑员工
        function editEmp(){
     
     
            //用户如果没有选择记录,那么给出提出
            var isChk = false;
            //用于存储用户所选中的记录数
            var chk_num = 0;
            //用于存储被选中的员工编号
            var empno = "";

            var arrChk = document.getElementsByName("chk");
            for(var i=0; i<arrChk.length; i++){
     
     
                if(arrChk[i].checked){
     
     //当前复选框被选中
                    isChk = true;
                    chk_num ++;
                    empno = arrChk[i].value;
                }
            }
            if(!isChk){
     
     
                alert("请选择要编辑的员工信息");
                //结束当前方法,结束编辑的动作
                return;
            }

            //如果用户多选,那么提示用户只能选择一条进行修改
            if(chk_num > 1){
     
     
                alert("只能选择一条记录进行修改操作");
                return;
            }

            //以上两种都不满足,那么可以进行编辑操作
            //需要单独打开员工编辑的页面进行信息的修改

            //这里不能直接跳转编辑页面,因为编辑页面没有任何的员工信息
            //我们需要先获取这个员工的全部信息,传递到编辑页面中
            //我们去数据库中获取当前员工的全部信息
            window.location.href = "GetEmpByEmpnoServlet?empno=" + empno;

        }

        function queryPage(pageIndex){
     
     
            var filter = document.getElementById("filter").value;
            window.location.href = "GetAllEmpServlet?pageIndex=" + pageIndex + "&filter=" + filter;
        }

        function prev(pageIndex) {
     
     
            var filter = document.getElementById("filter").value;
            var currPage = parseInt(pageIndex) - 1;
            window.location.href = "GetAllEmpServlet?pageIndex=" + currPage + "&filter=" + filter;
        }

        function next(pageIndex) {
     
     
            var filter = document.getElementById("filter").value;
            var currPage = parseInt(pageIndex) + 1;
            window.location.href = "GetAllEmpServlet?pageIndex=" + currPage + "&filter=" + filter;
        }

    </script>

</body>
</html>

实体模型Emp

package com.wangbiao.emp.model;

public class Emp {
    
    
    private int empno;
    private  String ename;
    private  String job;
    private  String hiredate;
    private String sex;

    public int getEmpno() {
    
    
        return empno;
    }

    public void setEmpno(int empno) {
    
    
        this.empno = empno;
    }

    public String getEname() {
    
    
        return ename;
    }

    public void setEname(String ename) {
    
    
        this.ename = ename;
    }

    public String getJob() {
    
    
        return job;
    }

    public void setJob(String job) {
    
    
        this.job = job;
    }

    public String getHiredate() {
    
    
        return hiredate;
    }

    public void setHiredate(String hiredate) {
    
    
        this.hiredate = hiredate;
    }

    public String getSex() {
    
    
        return sex;
    }

    public void setSex(String sex) {
    
    
        this.sex = sex;
    }
}

数据库接口与方法

数据库接口类IEmpDao

package com.wangbiao.emp.dao;

import com.wangbiao.emp.model.Emp;

import java.util.List;

public interface IEmpDao {
    
    

    /**
     * 查询全部的员工信息
     * 数据库的多条数据对应程序中的多个对象
     * @return
     */
    //List<Emp> selectAllEmp();

    /**
     * 新增员工
     * @param emp 要保存的员工对象
     * @return  新增的条数
     */
    int addEmp(Emp emp);


    /**
     * 根据条件进行查询
     * @param ename 前台传递的查询条件
     * @return
     */
    List<Emp> selectEmpByEname(String ename);

    /**
     * 根据工号进行批量删除
     * @param empnos   数组,存放了要删除的员工工号
     * @return
     */
    int deleteByEmpno(int[] empnos) ;

    /**
     * 根据工号查询员工信息
     * @param empno
     * @return
     */
    Emp getEmpByEmpno(int empno);

    int editEmp(Emp emp);

    /**
     * 分页查询
     * @param page  页码数
     * @param limit   每页显示条数
     * @param ename  查询条件
     * @return
     */
    List<Emp> getEmpByPage(int page,int limit,String ename);

}

数据库接口方法实现类EmpDaoImpl

package com.wangbiao.emp.dao.impl;

import com.wangbiao.emp.dao.IEmpDao;
import com.wangbiao.emp.model.Emp;
import com.wangbiao.emp.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName EmpDaoImpl
 * @Description TODO
 * @Author wangbiao
 * @Date 2021/1/8
 * @Version 1.0
 */
public class EmpDaoImpl implements IEmpDao {
    
    

    /*@Override
    public List<Emp> selectAllEmp() {
        Connection conn = DBUtil.getConn();
        //用于存放员工对象的集合
        List<Emp> list = new ArrayList<>();
        //执行sql的对象
        PreparedStatement pst = null;
        //接收结果集的对象
        ResultSet rs = null;

        try{
            String sql = "select * from employee";
            pst = conn.prepareStatement(sql);
            //执行sql
            rs = pst.executeQuery();

            //遍历结果集rs,并将一条条的记录转换为一个个的对象
            while(rs.next()){
                Emp emp = new Emp();
                emp.setEmpno(rs.getInt("empno"));
                emp.setEname(rs.getString("ename"));
                emp.setJob(rs.getString("job"));
                emp.setHiredate(rs.getString("hiredate"));
                //将对象放到list中
                list.add(emp);
            }


        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            //关闭所有的资源
            DBUtil.closeAll(conn,pst,rs);
        }


        return list;
    }*/

    @Override
    public int addEmp(Emp emp) {
    
    
        Connection conn = DBUtil.getConn();
        int num = 0;
        PreparedStatement pst = null;

        try{
    
    
            String sql = "insert into employee (ename,job,hiredate,sex) values (?,?,?,?)";
            pst = conn.prepareStatement(sql);
            pst.setString(1,emp.getEname());
            pst.setString(2,emp.getJob());
            pst.setString(3,emp.getHiredate());
            pst.setString(4,emp.getSex());
            //执行sql语句
            num = pst.executeUpdate();

        }catch (SQLException e){
    
    
            e.printStackTrace();
        }finally {
    
    
            DBUtil.closeAll(conn,pst,null);
        }
        return num;
    }

    @Override
    public List<Emp> selectEmpByEname(String ename) {
    
    
        Connection conn = DBUtil.getConn();
        List<Emp> list = new ArrayList<>();
        PreparedStatement pst = null;
        ResultSet rs = null;


        //ename的值有两种情况
        //1、登录进来,没有传递ename值,ename是一个null
        //2、点击查询按钮,ename的值可能是具体的字符串也可以是空字符串""

        String sql = "select * from employee";
        if(ename != null) {
    
    
            sql += " where ename like ?";
        }
        try {
    
    
            pst = conn.prepareStatement(sql);
            if(ename != null) {
    
    
                pst.setString(1, "%" + ename + "%");
            }
            //执行sql
            rs = pst.executeQuery();

            while(rs.next()){
    
    
                //一个员工对象对应一条数据
                Emp emp = new Emp();
                emp.setEmpno(rs.getInt("empno"));
                emp.setEname(rs.getString("ename"));
                emp.setJob(rs.getString("job"));
                emp.setHiredate(rs.getString("hiredate"));
                emp.setSex(rs.getString("sex"));

                list.add(emp);
            }


        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            DBUtil.closeAll(conn,pst,rs);
        }


        return list;
    }

    @Override
    public int deleteByEmpno(int[] empnos)  {
    
    
        Connection conn = DBUtil.getConn();
        int num = 0;
        PreparedStatement pst = null;

        String sql = "delete from employee where empno in (";
        //根据数组的长度,决定在sql中拼接几个?
        for(int i=0; i<empnos.length; i++){
    
    
            sql += "?";
            //除去最后一次,其他循环都需要加上,
            if(i != empnos.length -1){
    
    
                sql += ",";
            }
        }
        sql += ")";

        try {
    
    
            pst = conn.prepareStatement(sql);
            //设置占位符
            for(int i=0; i<empnos.length; i++){
    
    
                pst.setInt(i+1,empnos[i]);
            }
            num = pst.executeUpdate();

        } catch (SQLException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            DBUtil.closeAll(conn,pst,null);
        }

        return num;
    }

    @Override
    public Emp getEmpByEmpno(int empno) {
    
     //
        Connection conn = DBUtil.getConn();
        Emp emp = null;
        PreparedStatement pst = null;
        ResultSet rs = null;

        String sql = "select * from employee where empno = ?";
        try {
    
    
            pst = conn.prepareStatement(sql);
            pst.setInt(1,empno);
            rs = pst.executeQuery();

            if(rs.next()){
    
    
                emp = new Emp();
                emp.setEmpno(rs.getInt("empno"));
                emp.setEname(rs.getString("ename"));
                emp.setJob(rs.getString("job"));
                emp.setHiredate(rs.getString("hiredate"));
                emp.setSex(rs.getString("sex"));
            }

        } catch (SQLException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            DBUtil.closeAll(conn,pst,rs);
        }

        return emp;
    }

    @Override
    public int editEmp(Emp emp) {
    
    
        Connection conn = DBUtil.getConn();
        int num = 0;
        PreparedStatement pst = null;

        String sql = "update employee set ename = ?,job = ?,hiredate = ?,sex = ? where empno = ?";
        try {
    
    
            pst = conn.prepareStatement(sql);
            pst.setString(1,emp.getEname());
            pst.setString(2,emp.getJob());
            pst.setString(3,emp.getHiredate());
            pst.setString(4,emp.getSex());
            pst.setInt(5,emp.getEmpno());

            num = pst.executeUpdate();

        } catch (SQLException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            DBUtil.closeAll(conn,pst,null);
        }

        return num;
    }

    @Override
    public List<Emp> getEmpByPage(int page, int limit, String ename) {
    
    
        Connection conn = DBUtil.getConn();
        List<Emp> list = new ArrayList<>();
        PreparedStatement pst = null;
        ResultSet rs = null;

        String sql = "select * from employee ";
        if(ename != null) {
    
    
            sql += " where ename like ?";
        }
        //mysql的分页语法  select * from table limit 起始序号,每页显示条数
        //每页显示五条,第一页的数据 select * from table limit 0,5
        //第二页的数据   select * from table limit 5,5
        sql += " limit ?,?";

        try {
    
    
            pst = conn.prepareStatement(sql);
            if(ename != null){
    
    
                pst.setString(1,"%" + ename + "%");
                pst.setInt(2,(page - 1) * limit);
                pst.setInt(3,limit);
            }else{
    
    
                pst.setInt(1,(page - 1) * limit);
                pst.setInt(2,limit);
            }

            rs = pst.executeQuery();

            while(rs.next()){
    
    
                Emp emp = new Emp();
                emp.setEmpno(rs.getInt("empno"));
                emp.setEname(rs.getString("ename"));
                emp.setJob(rs.getString("job"));
                emp.setHiredate(rs.getString("hiredate"));
                emp.setSex(rs.getString("sex"));
                list.add(emp);
            }

        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            DBUtil.closeAll(conn,pst,rs);
        }
        return list;
    }
}

业务逻辑接口与方法

业务逻辑接口类IEmpService

package com.wangbiao.emp.service;

import com.wangbiao.emp.model.Emp;

import java.util.List;

public interface IEmpService {
    
    
   // List<Emp> selectAll();

    int addEmp(Emp emp);

    List<Emp> selectByEname(String ename);

    int delByEmpno(String empnos);

    Emp getEmpByEmpno(String empno);

    int editEmp(Emp emp);

    List<Emp> getEmpByPage(int page,int limit,String ename);
}

业务逻辑接口方法实现类EmpServiceImpl

package com.wangbiao.emp.service.impl;

import com.wangbiao.emp.dao.IEmpDao;
import com.wangbiao.emp.dao.impl.EmpDaoImpl;
import com.wangbiao.emp.model.Emp;
import com.wangbiao.emp.service.IEmpService;

import java.util.List;

/**
 * @ClassName EmpServiceImpl
 * @Description TODO
 * @Author wangbiao
 * @Date 2021/1/8
 * @Version 1.0
 */
public class EmpServiceImpl implements IEmpService {
    
    
    private IEmpDao empDao = new EmpDaoImpl();

    /*@Override
    public List<Emp> selectAll() {
        return empDao.selectAllEmp();
    }*/

    @Override
    public int addEmp(Emp emp) {
    
    
        return empDao.addEmp(emp);
    }

    @Override
    public List<Emp> selectByEname(String ename) {
    
    
        return empDao.selectEmpByEname(ename);
    }

    @Override
    public int delByEmpno(String empnos) {
    
    
        //dao层需要的参数是int数组
        //我们需要将字符串empnos转换为int数组
        //利用,将字符串隔开,转换为字符串数组
        String[] strEmpno = empnos.split(",");
        int[] intEmpnos = new int[strEmpno.length];
        //将字符串转换为int
        for(int i=0; i<strEmpno.length; i++){
    
    
            intEmpnos[i] = Integer.parseInt(strEmpno[i]);
        }

        int num = empDao.deleteByEmpno(intEmpnos);
        return num;
    }

    @Override
    public Emp getEmpByEmpno(String empno) {
    
    
        //将String类型转换为int类型
        int empnoInt = Integer.parseInt(empno);
        return empDao.getEmpByEmpno(empnoInt);
    }

    @Override
    public int editEmp(Emp emp) {
    
    
        return empDao.editEmp(emp);
    }

    @Override
    public List<Emp> getEmpByPage(int page, int limit, String ename) {
    
    
        return empDao.getEmpByPage(page,limit,ename);
    }
}

GetAllEmpServlet

package com.wangbiao.emp.servlet;

import com.wangbiao.emp.model.Emp;
import com.wangbiao.emp.service.IEmpService;
import com.wangbiao.emp.service.impl.EmpServiceImpl;

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.List;

@WebServlet("/GetAllEmpServlet")
public class GetAllEmpServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //获取用户的查询条件
        //当我们从登录页面进入到该servlet时filter为null
        //如果点击查询按钮进入到该servlet时filter为前台填写的内容
        String filter = request.getParameter("filter");

        //我们规定每页显示五条数据
        //从登录进入默认显示第一页数据
        int page = 1;
        int limit = 5;

        //获取前台传递的页码数
        String pages = request.getParameter("pageIndex");
        //当从登录页面进入该servlet pages 为null
        //如果通过点击页码按钮进入到servlet,那么pages有具体值
        if(pages != null){
    
    
           page = Integer.parseInt(pages);
        }

        //前台需要展示页码的按钮,那么需要知道一共有多少页
        //我们需要获取总条数,然后除以每页显示条数

        IEmpService empService = new EmpServiceImpl();
        //不分页的查询
        List<Emp> list_all = empService.selectByEname(filter);
        //获取总条数
        int total = list_all.size();
        //计算总页数
        //int totalPage = 0;
        /*if(total % limit == 0){
            totalPage = total / limit;
        }else{
            totalPage = total / limit + 1;
        }*/
        //三目运算符
        int totalPage = total % limit == 0 ? total / limit : total / limit + 1;

        //根据分页条件进行分页查询
        List<Emp> list = empService.getEmpByPage(page,limit,filter);

        if(filter != null){
    
    
            //将查询条件回显
            request.setAttribute("filter",filter);
        }

        //将总页数返回到前台
        request.setAttribute("totalPage",totalPage);

        //把当前页面返回到前台
        request.setAttribute("currPage",page);

        //跳转到empList.jsp中,并将list集合响应给浏览器
        request.setAttribute("list",list);
        request.getRequestDispatcher("empList.jsp").forward(request,response);
    }
}

新增功能

新增页面addEmp.jsp的实现

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/1/9
  Time: 9:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>员工新增</title>
    <link rel="stylesheet" href="css/base.css">
    <link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
    <div style="float:right;">当前用户:${uname}</div>
    <div align="center">
        <h4>新增员工信息</h4>
        <form action="AddServlet" method="post">
            <table>
                <tr>
                    <td align="right">员工姓名:</td>
                    <td><input type="text" name="ename" size="16px"></td>
                </tr>
                <tr>
                    <td align="right">员工性别:</td>
                    <td>
                        <input type="radio" name="sex" value="" checked><input type="radio" name="sex" value=""></td>
                </tr>
                <tr>
                    <td align="right">员工工作:</td>
                    <td>
                        <select name="job">
                            <option value="coder">coder</option>
                            <option value="行政">行政</option>
                            <option value="销售">销售</option>
                            <option value="市场">市场</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td align="right">入职日期:</td>
                    <td><input type="date" name="hiredate"></td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" class="btn btn-primary" value="确定">
                        <input type="button" class="btn" value="取消" onclick="cancel()">
                    </td>
                </tr>
            </table>
        </form>
    </div>

    <%--获取后台传递来的msg提示信息--%>
    <%--隐藏域,页面中不显示,用它来接收后台传递的msg提示信息--%>
    <input id="msg" type="hidden" value="${msg}">

    <script>

        window.onload = function () {
     
     
            //展示提示信息
            var msg = document.getElementById("msg").value;
            if(msg != "" && msg != null){
     
     
                alert(msg);
            }

        }

        function cancel(){
     
     
            //跳转回到员工列表页面
            //真正要跳转的是后台的GetAllEmpServlet
            //直接修改浏览器访问路径即可
            window.location.href = "GetAllEmpServlet";

        }

    </script>

</body>
</html>

后台实现

注意1:以防赘述同时为了强调,以后所有方法将单独给出代码
注意2:所有数据库接口与方法已在数据库接口与方法中给出
注意3:所有业务逻辑层接口与方法已在业务逻辑接口与方法中给出

数据库接口方法addEmp声明

以下代码写在IEmpDao中,此后方法声明将以此方式给出。

    /**
     * 新增员工
     * @param emp 要保存的员工对象
     * @return  新增的条数
     */
    int addEmp(Emp emp);

数据库接口方法addEmp实现

下述方法写在EmpDaoImpl中,此后方法将以此方式给出。

    @Override
    public int addEmp(Emp emp) {
    
    
        Connection conn = DBUtil.getConn();
        int num = 0;
        PreparedStatement pst = null;

        try{
    
    
            String sql = "insert into employee (ename,job,hiredate,sex) values (?,?,?,?)";
            pst = conn.prepareStatement(sql);
            pst.setString(1,emp.getEname());
            pst.setString(2,emp.getJob());
            pst.setString(3,emp.getHiredate());
            pst.setString(4,emp.getSex());
            //执行sql语句
            num = pst.executeUpdate();

        }catch (SQLException e){
    
    
            e.printStackTrace();
        }finally {
    
    
            DBUtil.closeAll(conn,pst,null);
        }
        return num;
    }

业务逻辑addEmp声明

以下代码写在IEmpService中,此后业务逻辑层方法的声明将以此方式给出。

    int addEmp(Emp emp);

业务逻辑addEmp实现

在写业务逻辑层的方法之前,需要在EmpDaoImpl中创建一个IEmpDao对象。

    //创建dao层对象
    private IEmpDao empDao = new EmpDaoImpl();

以下代码写在EmpSerciceImpl中,此后业务逻辑层方法的实现将以此方式给出。

    @Override
    public int addEmp(Emp emp) {
    
    
        return empDao.addEmp(emp);
    }

AddServlet

package com.wangbiao.emp.servlet;

import com.wangbiao.emp.model.Emp;
import com.wangbiao.emp.service.IEmpService;
import com.wangbiao.emp.service.impl.EmpServiceImpl;

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("/AddServlet")
public class AddServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //获取用户填写的信息
        //处理编码字符集,防止中文乱码
        request.setCharacterEncoding("utf-8");

        String ename = request.getParameter("ename");
        String job = request.getParameter("job");
        String hiredate = request.getParameter("hiredate");
        String sex = request.getParameter("sex");

        //将以上信息传递到后台,保存到数据中
        //先将所有的信息封装为一个员工对象
        Emp emp = new Emp();
        emp.setEname(ename);
        emp.setJob(job);
        emp.setHiredate(hiredate);
        emp.setSex(sex);

        //往service传递数据时,以对象形式即可。
        IEmpService empService = new EmpServiceImpl();
        //调用service层时,需要将从前台获取的数据传递过去
        //同时接受service层的返回值
        int num = empService.addEmp(emp);

        if(num > 0){
    
    
            //新增成功
            //跳转到列表页面,展示最新的员工数据
            request.setAttribute("msg","新增成功");
            request.getRequestDispatcher("GetAllEmpServlet").forward(request,response);
        }else{
    
    
            //新增失败
            request.setAttribute("msg","服务器错误");
            request.getRequestDispatcher("addEmp.jsp").forward(request,response);
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

    }
}

查询功能

前台实现

在empList.jsp中加入一个查询输入框与查询按钮,通过查询按钮的点击事件获取信息。

员工姓名:<input type="text"  id="filter" name="filter" placeholder="请输入员工姓名" value="${filter}">
<input type="button" class="btn btn-primary" value="查询" onclick="query()">

其中query函数的实现如下:

        //查询功能
        function query(){
    
    
            //获取用户填写的值,并将其发送给后台服务器
            var filter = document.getElementById("filter").value;
            //通过js的方式请求后台
            window.location.href = "GetAllEmpServlet?filter="+filter;
        }

后台实现

项目的最终代码中的查询按钮实现的是分页查询功能,已在数据库的接口与方法中给出,以下给出单独的查询功能。

数据库接口方法 selectEmpByEname声明

    /**
     * 根据条件进行查询
     * @param ename 前台传递的查询条件
     * @return
     */
    List<Emp> selectEmpByEname(String ename);

数据库接口方法selectEmpByEname实现

    @Override
    public List<Emp> selectEmpByEname(String ename) {
    
    
        Connection conn = DBUtil.getConn();
        List<Emp> list = new ArrayList<>();
        PreparedStatement pst = null;
        ResultSet rs = null;


        //ename的值有两种情况
        //1、登录进来,没有传递ename值,ename是一个null
        //2、点击查询按钮,ename的值可能是具体的字符串也可以是空字符串""

        String sql = "select * from employee";
        if(ename != null) {
    
    
            sql += " where ename like ?";
        }
        try {
    
    
            pst = conn.prepareStatement(sql);
            if(ename != null) {
    
    
                pst.setString(1, "%" + ename + "%");
            }
            //执行sql
            rs = pst.executeQuery();

            while(rs.next()){
    
    
                //一个员工对象对应一条数据
                Emp emp = new Emp();
                emp.setEmpno(rs.getInt("empno"));
                emp.setEname(rs.getString("ename"));
                emp.setJob(rs.getString("job"));
                emp.setHiredate(rs.getString("hiredate"));
                emp.setSex(rs.getString("sex"));

                list.add(emp);
            }


        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            DBUtil.closeAll(conn,pst,rs);
        }


        return list;
    }

业务逻辑selectByEname声明

    List<Emp> selectByEname(String ename);

业务逻辑selectByEname实现

    @Override
    public List<Emp> selectByEname(String ename) {
    
    
        return empDao.selectEmpByEname(ename);
    }

GetAllEmpServlet

这里的GetAllServlet与项目最终的GetAllServlet不同,项目最终GetAllServlet具备分页功能(前面已经给出),这里的GetAllServlet只具备查询功能。

package com.wangbiao.emp.servlet;

import com.wangbiao.emp.model.Emp;
import com.wangbiao.emp.service.IEmpService;
import com.wangbiao.emp.service.impl.EmpServiceImpl;

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.List;

@WebServlet("/GetAllEmpServlet")
public class GetAllEmpServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //获取用户的查询条件
        //当我们从登录页面进入到该servlet时filter为null
        //如果点击查询按钮进入到该servlet时filter为前台填写的内容
        String filter = request.getParameter("filter");
        
        IEmpService empService = new EmpServiceImpl();
        //不分页的查询
        List<Emp> list = empService.selectByEname(filter);

        if(filter != null){
    
    
            //将查询条件回显
            request.setAttribute("filter",filter);
        }
        
        //跳转到empList.jsp中,并将list集合响应给浏览器
        request.setAttribute("list",list);
        request.getRequestDispatcher("empList.jsp").forward(request,response);
    }
}

复选功能

在empList页面中加入复选框,实现全选功能。其中全选加在属性一栏的开头,每一行的复选框以循环方式给出。

		<table style="width: 750px" class="table table-striped table-bordered table-hover">
            <tr>
                <td align="center"><input type="checkbox" id="chk_all" onclick="chkAll()">全选</td>
                <td align="center">序号</td>
                <td align="center">员工编号</td>
                <td align="center">员工姓名</td>
                <td align="center">员工工作</td>
                <td align="center">入职日期</td>
                <td align="center">员工性别</td>
            </tr>
            <%--使用JSTL的方式实现List的循环--%>
            <c:forEach items="${list}" var="emp" varStatus="vs">
                <tr>
                    <td align="center"><input type="checkbox" value="${emp.empno}" name="chk" onclick="chkItem()"></td>
                    <td align="center">${vs.index + 1}</td>
                    <td align="center">${emp.empno}</td>
                    <td align="center">${emp.ename}</td>
                    <td align="center">${emp.job}</td>
                    <td align="center">${emp.hiredate}</td>
                    <td align="center">${emp.sex}</td>
                </tr>
            </c:forEach>
        </table>

其中chkAll函数如下:

        //全选功能
        function chkAll() {
    
    
            //获取全选框的选中状态:true/false
            var isChk = document.getElementById("chk_all").checked;
            //获取每行的复选框
            var arrChk = document.getElementsByName("chk");
            //循环每行的复选框
            for(var i=0; i<arrChk.length; i++){
    
    
                //设置复选框的选中状态
                arrChk[i].checked = isChk;
            }
        }

chkItem函数如下:

        function chkItem() {
    
    
            //通过每行的复选框控制全选框
            //每选中一个复选框时,都要去判断其他的复选框有没有被选中
            //只要有一个复选框没有被选中,那么全选框就无需选中

            //每勾掉一个复选框时,无需关注其他复选框,全选框直接被勾掉即可
            var arrChk = document.getElementsByName("chk");

            //默认所有的复选框都被选中了
            var isAll = true;
            for(var i=0; i<arrChk.length; i++){
    
    
                //一旦有复选框未必勾选
                if(!arrChk[i].checked){
    
    
                    //全选框不能被选中
                    isAll = false;
                    //跳出循环,无需关注其他复选框
                    break;
                }
            }
            //通过isAll的值决定全选框是否被选中
            document.getElementById("chk_all").checked = isAll;
        }

猜你喜欢

转载自blog.csdn.net/weixin_43567146/article/details/112392501