项目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()">
<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;
}