所需要的jar包:
commons-beanutils-1.9.3.jar 创建对象
commons-collections-3.2.2.jar 在创建查询报错ClassNotFoundException,需要导入的包
commons-logging-1.2.jar 日志包
druid-1.1.9.jar 德鲁伊
mysql-connector-java-5.1.47.jar mysql数据库包
jstl-1.2.jar jstl包
BaseDao
package com.wfg.util;
import org.apache.commons.beanutils.BeanUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class BaseDao {
/**
*
* @param sql 执行的增删改的sql语句
* @param parameters 对sql语句的? 进行赋值的一个object类型数组的数据
* @return 受影响的行数
*/
public int update (String sql, Object[] parameters) throws Exception {
//1.获取连接数据库的对象
Connection connection = JdbcUtil.getConnection();
//2.获取预处理的搬运工对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//3.获取参数元数据对象,获取参数的个数
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
//4.循环对?进行赋值。
/*
parameters != null 说明传进来的数组 不为空
Object[] objs = {"二蛋儿", 56};
String sql = "insert into person (name, age, info) values(?,?,?)"
*/
if (parameters != null && parameterCount == parameters.length) {
for (int i = 1; i <= parameterCount; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
}
//5.执行sql语句
int i = preparedStatement.executeUpdate();
//6.关闭资源
JdbcUtil.close(connection, preparedStatement);
return i;
}
/**
*
* @param sql 执行的查询的sql语句
* @param parameters 对sql语句的?进行赋值的参数
* @param cls 查询出来的数据要赋值给一个对象,通过Class来获取对象
* @param <T>
* @return
*/
public <T> List<T> query (String sql, Object[] parameters, Class<T> cls) throws Exception {
//1.获取数据库的连接对象
Connection connection = JdbcUtil.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//2.预处理搬运工对象
preparedStatement = connection.prepareStatement(sql);
//3.去出来sql语句De参数?
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
//4.对?进行赋值
if(parameters != null && parameterCount == parameters.length) {
for (int i = 1; i <= parameterCount; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
}
//5.执行sql语句
resultSet = preparedStatement.executeQuery();
//6.声明一个空的集合
List<T> list = new ArrayList<>();
//7.获取结果集元数据对象
ResultSetMetaData metaData = resultSet.getMetaData();
//8.获取列(字段)的个数
int columnCount = metaData.getColumnCount();
//9.遍历结果集数据
while (resultSet.next()) {//控制是行
//10.通过传入的第三个参数 Person.class
//Person perosn = new Person();
T t = cls.getConstructor(null).newInstance(null);
for (int i = 1; i <= columnCount; i++) {//控制是列
//11.获取列的名字
String columnName = metaData.getColumnName(i);
//System.out.println(columnName);
//12.通过字段获取字段下面的数据
Object value = resultSet.getObject(columnName);
//System.out.println(value);
//13.取出来的数据赋值给一个对象
//以下写死了,咋办?想办法创建出来一个对象 通过反射创建
//这个方法需要三个参数,第一个参数 哪个对象
//第二个参数 实体类中属性 借助于表中字段的名字来对实体类中的属性进行赋值
//第三个参数 刚好取出来的值
BeanUtils.setProperty(t, columnName, value);
//t这个对象已经有值的!!
//第一次的for循环结束
}
//14.将每次while循环取出来的数据添加集合中
list.add(t);
}
//15.关闭资源
JdbcUtil.close(connection, preparedStatement, resultSet);
return list.size() != 0 ? list : null;
}
}
druid
package com.wfg.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class JdbcUtil{
public static DataSource dataSource = null;
static {
Properties properties = new Properties();
try {
properties.load(JdbcUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection () {
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close (Connection connection, PreparedStatement prst) {
try {
connection.close();
prst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close (Connection connection, PreparedStatement prst, ResultSet rs) {
try {
connection.close();
prst.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
配置文件
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/java2215emp?useSSL=false username=root password=root initialSize=5 maxActive=20 maxWait=2000
dao层
员工
package com.wfg.dao; import com.wfg.pojo.Emp; import com.wfg.util.BaseDao; import java.util.List; public class EmpDao extends BaseDao { public static EmpDao empDao; public EmpDao () { } public static synchronized EmpDao getInstance() { if (empDao == null) { empDao = new EmpDao(); } return empDao; } //登陆功能:select * from empmanager where username = ? public List<Emp> selectEmpAll (Object[] objects) throws Exception { String sql = "select * from emp limit ?,?"; List<Emp> emps = super.query(sql, objects, Emp.class); return emps; } /* * 添加员工 * * */ public int addemp (Object[] objects) throws Exception { String sql = "insert into emp (name,age,salary,info) values(?, ?, ?,?)"; return super.update(sql,objects); } /* * 删除数据 * * */ public int delemp (Object[] objects) throws Exception { String sql = "delete from emp where id = ?"; return super.update(sql,objects); } /* * * 查询一条数据,用作修改 * */ public List<Emp> selectEmpOne (Object[] objects) throws Exception { String sql = "select * from emp where id = ?"; return super.query(sql, objects,Emp.class); } /* * 修改数据 * * */ public int UpdateEmp (Object[] objects) throws Exception { String sql ="update emp set name=?, age=?, salary=?, info=? where id=?"; return super.update(sql, objects); } /* * 查询所有数据,目的是为了获取总条数 * */ public int selectEmpSize () throws Exception { String sql = "select * from emp"; List<Emp> query = super.query(sql, null, Emp.class); return query.size(); } }
管理员
package com.wfg.dao; import com.wfg.pojo.EmpManager; import com.wfg.util.BaseDao; import java.util.List; //处理管理员登陆的 public class EmpManagerDao extends BaseDao { public static EmpManagerDao empManagerDao; public EmpManagerDao () { } public static synchronized EmpManagerDao getInstance() { if (empManagerDao == null) { empManagerDao = new EmpManagerDao(); } return empManagerDao; } //登陆功能:select * from empmanager where username = ? /** * * @param objects 前端发送过来的数据 * @return 通过username查询出来的数据,是一个集合 * @throws Exception */ public List<EmpManager> selectMeanger (Object[] objects) throws Exception { String sql = "select * from empmanager where username = ?"; List<EmpManager> empManagers = super.query(sql, objects, EmpManager.class); return empManagers; } }
实体类
package com.wfg.pojo; public class Emp { private Integer id; private String name; private Integer age; private Double salary; private String info; public Emp() { } public Emp(Integer id, String name, Integer age, Double salary, String info) { this.id = id; this.name = name; this.age = age; this.salary = salary; this.info = info; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } @Override public String toString() { return "emp{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", salary=" + salary + ", info='" + info + '\'' + '}'; } }
package com.wfg.pojo; public class EmpManager { private Integer id; private String username; private String password; public EmpManager() { } public EmpManager(Integer id, String username, String password) { this.id = id; this.username = username; this.password = password; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Empmanager{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
注册页面
package com.wfg.servlet;
import com.wfg.dao.EmpManagerDao;
import com.wfg.pojo.EmpManager;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet(name = "LoginServlet", value = "/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//2.获取前端发送过来的数据
String user = request.getParameter("user");
String password = request.getParameter("password");
System.out.println(user + ":" + password);
//3.获取到前端数据后,连接数据库,执行查询的sql语句
//前端数据和数据库做对比
Object[] objs = {user};
try {
List<EmpManager> empManagers = EmpManagerDao.getInstance().selectMeanger(objs);
if (empManagers != null) {
EmpManager empManager = empManagers.get(0);
//用户存在需要判断密码
if (empManager.getPassword().equals(password)) {
//密码正确
//存值到session里面
HttpSession session = request.getSession();
//设置过期时间
session.setMaxInactiveInterval(60*60);
//设置键值 在另外一个页面通过session将用户取出来
session.setAttribute("user", user);
//跳转到主页面
response.sendRedirect("IndexServlet");
} else {
//密码不正确
PrintWriter writer = response.getWriter();
writer.print("<script>alert('密码不正确');window.location='login.html'</script>");
}
} else {
//用户不存在
PrintWriter writer = response.getWriter();
writer.print("<script>alert('没有此用户');window.location='login.html'</script>");
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
主页面
package com.wfg.servlet;
import com.wfg.dao.EmpDao;
import com.wfg.pojo.Emp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet(name = "IndexServlet", value = "/IndexServlet")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
//获取emp表中的所有数据
List<Emp> emps = null;
//分页 每页数量是3
int pagesize = 3;
//pageNo 是通过url传过来的
//第一次请求IndexServlet的时候没有带参数
String pageNo = request.getParameter("pageNo");
if (pageNo == null) {
pageNo = "1";
}
//获取总条数
int dataCount = 0;
try {
dataCount = EmpDao.getInstance().selectEmpSize();
} catch (Exception e) {
e.printStackTrace();
}
int pageCount = 0;//总页数的变量
if (dataCount % pagesize == 0) {
pageCount = dataCount / pagesize;
} else {
pageCount = dataCount / pagesize + 1;
}
Integer pNo = Integer.valueOf(pageNo);
Object[] objects = {(pNo - 1) * pagesize,pagesize};
try {
emps = EmpDao.getInstance().selectEmpAll(objects);
System.out.println("是否是个集合:" + emps);
} catch (Exception e) {
e.printStackTrace();
}
//将页面写到jsp
request.setAttribute("pNo", pNo);
request.setAttribute("pageCount", pageCount);
request.setAttribute("emps",emps);
request.getRequestDispatcher("emps.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
退出登陆
package com.wfg.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "LogoutServlet", value = "/LogoutServlet")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
if (session != null) {
session.invalidate();
}
response.sendRedirect("login.html");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
添加员工
package com.wfg.servlet;
import com.wfg.dao.EmpDao;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "AddServlet", value = "/AddServlet")
public class AddServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取添加员工页面的数据
String name = request.getParameter("name");
String age = request.getParameter("age");
String salary = request.getParameter("salary");
String info = request.getParameter("info");
//连接数据库,将数据存到数据库
//age 数据库int类型,前端数据库是int类型
Integer age1 = Integer.valueOf(age);
Double salary1 = Double.valueOf(salary);
Object[] objects = {name,age1,salary1,info};
try {
int i = EmpDao.getInstance().addemp(objects);
//如果添加成功回到主页面
response.sendRedirect("IndexServlet");
} catch (Exception e) {
response.sendRedirect("addEmp.html");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
删除员工
package com.wfg.servlet;
import com.wfg.dao.EmpDao;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "DeleteServlet", value = "/DeleteServlet")
public class DeleteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收前端发送过来的ID
String id = request.getParameter("id");
//delete from emp id = ? id在数据库中是int类型的数据
Integer id1 = Integer.valueOf(id);
Object[] objects = {id1};
try {
int delemp = EmpDao.getInstance().delemp(objects);
//删除成功后
response.sendRedirect("IndexServlet");
} catch (Exception e) {
response.sendRedirect("IndexServlet");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
修改
package com.wfg.servlet;
import com.wfg.dao.EmpDao;
import com.wfg.pojo.Emp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet(name = "UpdateServlet", value = "/UpdateServlet")
public class UpdateServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取前端发送的信息
String id = request.getParameter("id");
//需要借助这个id获取当前的这条数据展示出来
Integer id1 = Integer.valueOf(id);
//一点击修改按钮,先给一个展示的一条数据,就是你原来的那条数据
//查询数据
//查询数据,查一条数据
Object[] objects = {id};
Emp emp = null;
try {
List<Emp> emps = EmpDao.getInstance().selectEmpOne(objects);
//emps是一个集合
emp = emps.get(0);
} catch (Exception e) {
e.printStackTrace();
}
//开始将emp对象的值写到input输入框中
//展示到html上面
// PrintWriter writer = response.getWriter();
// writer.println("<div align='center'>");
//
// //ShowUpdateServlet 这个是接受修改之后的数据的servlet
// //去连接数据库,然后再去修改数据库中的数据
// //
// writer.println("<form action='ShowUpdateServlet?id="+emp.getId()+"' method='post'>");
// writer.println("姓名:<input type='text' name='name' value='"+ emp.getName() +"'><br>");
// writer.println("年龄:<input type='text' name='age' value='"+ emp.getAge() +"'><br>");
// writer.println("薪资:<input type='text' name='salary' value='"+ emp.getSalary() +"'><br>");
// writer.println("信息:<input type='text' name='info' value='"+ emp.getInfo() +"'><br>");
// writer.println("<input type=\"submit\" value=\"提交修改\">");
// writer.println("</form>");
// writer.println("</div>");
request.setAttribute("emp",emp);
request.getRequestDispatcher("update.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.wfg.servlet;
import com.wfg.dao.EmpDao;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "ShowUpdateServlet", value = "/ShowUpdateServlet")
public class ShowUpdateServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取修改之后的表单数据
//获取前端传过来的ID数据
String id = request.getParameter("id");
Integer id1 = Integer.valueOf(id);
String name = request.getParameter("name");
String age = request.getParameter("age");
Integer age1 = Integer.valueOf(age);
String salary = request.getParameter("salary");
Double salary1 = Double.valueOf(salary);
String info = request.getParameter("info");
Object[] objects = {name, age1, salary1, info, id1};
try {
int i = EmpDao.getInstance().UpdateEmp(objects);
//修改之后回到主页面
response.sendRedirect("IndexServlet");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
过滤器
package com.wfg.filter;
import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebFilter("/*")
public class CharcaterFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//拦截所有资源,在拦截所有资源之前,先写请求乱码和响应乱码的解决方案
//先执行过滤,再执行servlet
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request, response);
}
}
package com.wfg.filter;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//思路 有session和没有session的两种情况
/*
* 有session 登陆过了,放行
* 没有session 没有登陆 拦截,跳转到登陆页面
* */
HttpServletRequest request1 = (HttpServletRequest) request;
HttpServletResponse response1 = (HttpServletResponse) response;
HttpSession session = request1.getSession(false);
System.out.println("session打印:" + session);
//如果session为null,就证明没有登陆,直接跳转到login.jsp
String requestURI = request1.getRequestURI();
System.out.println(requestURI);//是URL的一部分
// day51
if (requestURI.endsWith("/login.jsp") || requestURI.endsWith("LoginServlet")) {
chain.doFilter(request,response);
} else if (session == null || session.getAttribute("user") == null) {
//不能放行,让其跳转到login.jsp
response1.sendRedirect("login.jsp");
} else if (session.getAttribute("user") != null) {
chain.doFilter(request,response);
}
}
}
jsp文件
添加
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/10/31
Time: 14:24
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div align="center">
<form action="AddServlet" method="post">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
薪资:<input type="text" name="salary"><br>
信息: <input type="text" name="info"><br>
<input type="submit" value="添加">
<input type="reset" value="重置">
</form>
</div>
</body>
</html>
注册页面
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/10/31
Time: 14:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--管理员登陆页面-->
<!--数据提交给LoginServlet,让LoginServlet去连接数据库
看是否能连接成功
-->
<form action="LoginServlet" method="post">
<input type="text" name="user"><br>
<input type="password" name="password"><br>
<input type="submit" value="登陆">
</form>
</body>
</html>
修改页面
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/10/31
Time: 14:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div>
<form action='ShowUpdateServlet?id=${emp.id}' method='post'>
姓名:<input type="text" name="name" value="${emp.name}"><br>
年龄:<input type="text" name="age" value="${emp.age}"><br>
薪资:<input type="text" name="salary" value="${emp.salary}"><br>
信息:<input type="text" name="info" value="${emp.info}"><br>
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
主页jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/10/31
Time: 11:22
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</title>
</head>
<body>
<%-- 只要Java中进行setAttribute("键","值")
在jsp文件中都能取出来
--%>
<div align="right">${user}</div>
<div><a href="addEmp.jsp">添加员工</a></div>
<div><a href="login.jsp"></a></div>
<table border="8" bordercolor="blue" align="center" width="80%">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>薪资</th>
<th>信息</th>
<th colspan="2">操作</th>
</tr>
<%-- 循环取数据 --%>
<c:forEach var="emp" items="${emps}">
<tr>
<td>${emp.id}</td>
<td>${emp.name}</td>
<td>${emp.age}</td>
<td>${emp.salary}</td>
<td>${emp.info}</td>
<td><a href="DeleteServlet?id=${emp.id}">删除</a></td>
<td><a href="UpdateServlet?id=${emp.id}">修改</a></td>
</tr>
</c:forEach>
</table>
<%-- 前端页面 --%>
<div align="center">
<a href="IndexServlet?pageNo=1">首页</a>
<c:if test="${pNo > 1}">
<a href="IndexServlet?pageNo=${pNo - 1}">上一页</a>
</c:if>
<c:if test="${pNo <= 1}">
<a href="IndexServlet?pageNo=${pNo - 1}" style="pointer-events: none;">上一页</a>
</c:if>
<c:if test="${pNo < pageCount}">
<a href="IndexServlet?pageNo=${pNo + 1}">下一页</a>
</c:if>
<c:if test="${pNo > pageCount}">
<a href="IndexServlet?pageNo=${pNo + 1}" style="pointer-events: none;">下一页 </a>
</c:if>
<a href="IndexServlet?pageNo=${pageCount}">尾页</a>
</div>
</body>
</html>