EmpProject综合案例

案例阶段一:环境搭建

1.创建数据库

create databas emp;

2.需要两张表

emp员工信息表和empmanager管理员表

create table emp(id int PRIMARY KEY  AUTO_INCREMENT,name varchar(20) not null,salary double not null,age int not null
);
create table  empmanager(username varchar(20) not null,password varchar(20) not null
);

3.插入一些测试数据

insert into  emp(name, salary, age)value('tom',2000,16);
insert into  emp(name, salary, age)value('jerry',2500,14);
insert into  emp(name, salary, age)value('dog',1900,18);insert into  empmanager(username, password) value ('admin','123456')

4.创建Web项目分层目录

com.qf.emp.controller 调用业务逻辑Servlet

com.qf.emp.jsp 打印显示页面Servlet

com.qf.emp.dao 数据访问层

com.qf.emp.dao.impl 数据访问层实现类

com.qf.emp.entity 实体类

com.qf.emp.filter 过滤器类

com.qf.emp.service 业务逻辑层

com.qf.emp.service.impl 业务逻辑层实现类

com.qf.emp.utils 工具类

database.properties 数据库连接池配置文件

在WEB-INF目录下创建lib包,导入要使用jar

commons-dbutils-1.7.jar

druid-1.1.5.jar

mysql-connector-java-5.1.25-bin.jar

ValidateCode.jar

编写database.properties数据库资源文件

#jdbc连接驱动配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/emp
username=root
password=123456
#连接池配置 【连接池初始容量,最大连接数量, 最小空闲连接, 最大等待时长】
initialSize=10
maxActive=20
minIdle=5
maxWait=3000

案例阶段二:代码编写

1.编写DBUtils工具类

ps:utils包下

package com.qf.emp.utils;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.pool.DruidPooledConnection;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 DbUtils {private DbUtils(){}//数据库连接池对象private  static DruidDataSource ds;//事务的控制 ThreadLocalprivate  static  final  ThreadLocal<Connection> THREAD_LOCAL = new ThreadLocal<>();//使用静态代码块对文件进行进行加载static {//1.创建properties文件Properties properties = new Properties();//创建字节流对象读取数据【建议通过反射】InputStream resourceAsStream = DbUtils.class.getResourceAsStream("/database.properties");//加载文件try {properties.load(resourceAsStream);//获取连接池对象ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取Connection对象*/public static Connection getConnection(){//1.通过ThreadLocal来获取Connection对象Connection connection = THREAD_LOCAL.get();try {if(connection == null){//通过连接池获获取Connection对象connection = ds.getConnection();//存储到ThradLocal中THREAD_LOCAL.set(connection);}} catch (SQLException e) {e.printStackTrace();}return  connection;}/*** 开启事务**/public static void begin(){Connection connection = null;try {connection = getConnection();connection.setAutoCommit(false);} catch (SQLException e) {e.printStackTrace();}}/*** 提交事务*/public static  void commit(){Connection connection = null;try {connection = getConnection();connection.commit();//提交} catch (SQLException e) {e.printStackTrace();}finally {closeAll(connection,null,null);}}/*** 回滚*/ public static void rollback(){Connection connection = null;try {connection = getConnection();connection.rollback();//回滚} catch (SQLException e) {e.printStackTrace();}finally {closeAll(connection,null,null);}}/*** 统一资源释放*/public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){try{if(resultSet != null){resultSet.close();}if(statement != null){statement.close();}if(connection != null){connection.close();THREAD_LOCAL.remove();}}catch (Exception e){e.printStackTrace();}}}

2.实现具体功能

2.1实现管理员登录功能
2.1.1在entity包下创建实体类EmpManager类
package com.qf.emp.entity;public class EmpManager {//因为要做实体映射[ORM],所以类名和属性名尽量和表名和列名一致private String username;private String password;public EmpManager() {}public EmpManager(String username, String password) {this.username = username;this.password = password;}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;}@Overridepublic String toString() {return "EmpManager{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
2.2编写dao数据层
2.2.1编写EmpManagerDao接口,此接口完成登录查询
package com.qf.emp.dao;import com.qf.emp.entity.EmpManager;//管理员登录接口
public interface EmpManagerDao {//查询用户名public EmpManager select(String name);
}
2.2.2编写接口实现类EmpManagerDaoImpl
package com.qf.emp.dao.impl;import com.qf.emp.dao.EmpManagerDao;
import com.qf.emp.entity.EmpManager;
import com.qf.emp.utils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;import java.sql.SQLException;public class EmpManagerDaoImpl implements EmpManagerDao {//通过DBUtil类中提供的QueryRunner对象来进行查询private QueryRunner queryRunner = new QueryRunner();@Overridepublic EmpManager select(String name) {try {EmpManager empManager = queryRunner.query(DbUtils.getConnection(),"select * from empmanager where username = ?",new BeanHandler<EmpManager>(EmpManager.class), name);return empManager;} catch (SQLException e) {e.printStackTrace();}return null;}
}
2.3service业务层实现
2.3.1 创建EmpManagerService接口提供登录方法
package com.qf.emp.service;import com.qf.emp.entity.EmpManager;public interface EmpManagerService {//登录方法public EmpManager login(String username,String password);
}
2.3.2实现EmpManagerService接口EmpManagerServiceImpl
package com.qf.emp.service.impl;import com.qf.emp.dao.EmpManagerDao;
import com.qf.emp.dao.impl.EmpManagerDaoImpl;
import com.qf.emp.entity.EmpManager;
import com.qf.emp.service.EmpManagerService;
import com.qf.emp.utils.DbUtils;import java.util.Objects;public class EmpManagerServiceImpl implements EmpManagerService {//获取访问数据层的对象private EmpManagerDao empManagerDao = new EmpManagerDaoImpl();@Overridepublic EmpManager login(String username, String password) {//定义一个变量用来存储查找到的EmpManager对象EmpManager em = null;try {DbUtils.begin();//通过数据访问层对象获取EmpManager对象EmpManager empManager = empManagerDao.select(username);//判断对象是否存在并判断密码是否正确if(Objects.nonNull(empManager)){if(empManager.getPassword().equals(password)){em = empManager;}}DbUtils.commit();} catch (Exception e) {//回滚DbUtils.rollback();e.printStackTrace();}return  em;}
}
2.4对登录Servlet进行处理
2.4.1在Controller包下,创建EmpManagerLoginController
package com.qf.emp.controller;import com.qf.emp.entity.EmpManager;
import com.qf.emp.service.EmpManagerService;
import com.qf.emp.service.impl.EmpManagerServiceImpl;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 javax.servlet.http.HttpSession;
import java.io.IOException;
//这里这样写路径的目的是为了以后区分操作,即管理员都写manager路径
@WebServlet(name = "EmpManagerLoginController",value="/manager/EmpManagerLoginController")
public class EmpManagerLoginController 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 {//1.收参数String  username = request.getParameter("username");String password = request.getParameter("password");String inputVCode = request.getParameter("inputVCode");//2.校验验证码的值String codes = (String)request.getSession().getAttribute("codes");if(!inputVCode.isEmpty() && inputVCode.equalsIgnoreCase(codes)){//此时就开始处理业务逻辑EmpManagerService empManagerService = new EmpManagerServiceImpl();EmpManager empManager = empManagerService.login(username, password);if(empManager != null){//登录成功,存当前对象到Session作用域中,以便后续使用HttpSession session = request.getSession();session.setAttribute("empManager",empManager);//跳转到查询所有的信息的界面}else{//登录失败重定向到登录界面response.sendRedirect(request.getContextPath()+"/login.html");}}else{//验证码错误重定向到登录界面response.sendRedirect(request.getContextPath()+"/login.html"); }}
}
2.4.2在Controller包下,创建创建验证码的Servlet
package com.qf.emp.controller;import cn.dsna.util.images.ValidateCode;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 javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet(name = "CreateCodeServlet",value="/createCode")
public class CreateCodeServlet 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 {//生成验证码ValidateCode vc = new ValidateCode(200,30,4,10);//获取生成验证码的值String code = vc.getCode();//存储到Session让EmpManagerLoginController使用HttpSession session = request.getSession();session.setAttribute("codes",code);//2.响应客户端vc.write(response.getOutputStream());}
}
2.4.3在Controller包下,创建查询所有结果的Servlet
package com.qf.emp.controller;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(name = "ShowAllEmpController",value="/manager/safe/showAllEmpController")
public class ShowAllEmpController 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 {//先做一个提示,后续补全System.out.println("登录成功,查询所有!");}
}

回头在EmpManagerLoginController类中补全跳转

 //跳转到查询所有的信息的界面
response.sendRedirect(request.getContextPath()+"/manager/safe/showAllEmpController");
2.5.完成登录界面进行验证
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录界面</title>
</head>
<body>
<div><form action="/empproject/manager/EmpManagerLoginController" method="post">用户名:<input type="text" name="username"/><br/>密码:<input type="password" name="password"/><br/>验证码:<input type="text" name="inputVcode"/><img src="//empproject/createCode/createCode"><br/><input type="submit" value = "登录"></form>
</div></body>
</html>

3.1查询所有员工功能

3.1.1在entity包下创建emp实体类进行使用
package com.qf.emp.entity;
//emp实体类
public class Emp {private int id;private String name;private double salary;private int age;public Emp() {}public Emp(int id, String name, double salary, int age) {this.id = id;this.name = name;this.salary = salary;this.age = age;}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 double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String  toString() {return "Emp{" +"id=" + id +", name='" + name + '\'' +", salary=" + salary +", age=" + age +'}';}
}
3.2在Dao包下创建EmpDao 进行查询方法编写
package com.qf.emp.dao;import com.qf.emp.entity.Emp;import java.util.List;public interface EmpDao {public List<Emp> selectAll();
}
3.3在编写EmpDao的实现类EmpDaoImpl
package com.qf.emp.dao.impl;import com.qf.emp.dao.EmpDao;
import com.qf.emp.entity.Emp;import com.qf.emp.utils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;import java.sql.SQLException;
import java.util.List;public class EmpDaoImpl implements EmpDao {private QueryRunner queryRunner = new QueryRunner();@Overridepublic List<Emp> selectAll() {try {List<Emp> emps = queryRunner.query(DbUtils.getConnection(), "select * from emp", new BeanListHandler<Emp>(Emp.class));return  emps;} catch (SQLException e) {e.printStackTrace();}return null;}
}
3.3编写业务层逻辑处理查询emp业务,创建EmpService
package com.qf.emp.service;import com.qf.emp.entity.Emp;import java.util.List;public interface EmpService {public List<Emp> showAllEmp();
}
3.4编写EmpService的实现EmpServiceImpl
package com.qf.emp.service.impl;import com.qf.emp.dao.EmpDao;
import com.qf.emp.dao.impl.EmpDaoImpl;
import com.qf.emp.entity.Emp;
import com.qf.emp.service.EmpService;
import com.qf.emp.utils.DbUtils;
import jdk.nashorn.internal.ir.CallNode;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;public class EmpServiceImpl implements EmpService {private EmpDao empDao = new EmpDaoImpl();@Overridepublic List<Emp> showAllEmp() {List<Emp> emps = new ArrayList<>();try {DbUtils.begin();List<Emp> temps = empDao.selectAll();if (Objects.nonNull(temps)) {emps = temps;}DbUtils.commit();} catch (Exception e) {DbUtils.rollback();e.printStackTrace();}return  emps;}
}
3.5修改Controller包下ShowAllEmpController逻辑
package com.qf.emp.controller;import com.qf.emp.entity.Emp;
import com.qf.emp.service.EmpService;
import com.qf.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(name = "ShowAllEmpController",value="/manager/safe/showAllEmpController")
public class ShowAllEmpController 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 {EmpService empService = new EmpServiceImpl();List<Emp> list = empService.showAllEmp();request.setAttribute("emps",list);//通过请求转换,将数据转发另外一个Servlet进行处理[页面Servlet]request.getRequestDispatcher("/manager/safe/showAllEmpJSP").forward(request,response);}
}

ps:只有登录之后才对后台进行访问,所以我们需要对当前访问进行权限限制

3.6在Filter包创建Filter类进行权限限制
package com.qf.emp.filter;import com.qf.emp.entity.EmpManager;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Objects;@WebFilter(value="/manager/safe/*")
public class CheckFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse)resp;//通过Session获取存储的登录对象HttpSession session = request.getSession();EmpManager empManager = (EmpManager)session.getAttribute("empManager");if(Objects.nonNull(empManager)){//登录过//就传递chain.doFilter(req, resp);}else{response.sendRedirect(request.getContextPath()+"/login.html");}}public void init(FilterConfig config) throws ServletException {}}

在当前报下提供编码统一处理

package com.qf.emp.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter(value="/manager/*")
public class EncodingFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");chain.doFilter(req, resp);}public void init(FilterConfig config) throws ServletException {}}
3.7在JSP包下创建显示查询所有结果页面

ps:JSP就是页面版本Servlet

package com.qf.emp.jsp;import com.qf.emp.entity.Emp;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.io.PrintWriter;
import java.util.List;@WebServlet(name = "ShowAllEmpJSP",value ="/manager/safe/showAllEmpJSP")
public class ShowAllEmpJSP 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 {//1.全新页面写法//1.获取集合数据进行展示List<Emp> emps = (List<Emp>)request.getAttribute("emps");PrintWriter out = response.getWriter();out.println("<html>");out.println("   <head>");out.println("       <meta charset='UTF-8'>");out.println("           <title>查询所有员工信息页面</title>");out.println("   </head>");out.println("   <body>");out.println("       <table border='1'>");out.println("        <tr>");out.println("           <td>编号</td>");out.println("           <td>姓名</td>");out.println("           <td>工资</td>");out.println("           <td>年龄</td>");out.println("           <td colspan='2'>操作</td>");out.println("         </tr>");for(Emp emp:emps) {out.println("               <tr>");out.println("               <td>"+emp.getId()+"</td>");out.println("               <td>"+emp.getName()+"</td>");out.println("               <td>"+emp.getSalary()+"</td>");out.println("               <td>"+emp.getAge()+"</td>");out.println("               <td>删除</td>");out.println("               <td>修改</td>");out.println("               </tr>");}out.println("          </table>");out.println("          </body>");out.println("          </html>");}
}

作业:完成删除和修改操作

2-37.1 EmpProject综合案例相关推荐

  1. 【PySpark】综合案例实战:处理加州房屋信息,构建线性回归模型

    通过之前的学习,我们对 Spark 各种 API 的基本用法有了一定的了解,还通过统计词频的实例掌握了如何从零开始写一个 Spark 程序.那么现在,让我们从一个真实的数据集出发,看看如何用 Spar ...

  2. 开源项目综合案例https://blog.csdn.net/m0_37700275/article/details/78783049

    开源项目综合案例 置顶 2017年12月12日 16:16:17 杨充 阅读数:473 版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/m0_37700275 ...

  3. 自定义模块+python面向对象+综合案例

    一.模块 1.自定义模块 1.1import模块 代码演示: moduleDemo01.py def fun1():print("fun~~~~111") def fun2():p ...

  4. 事件+综合案例(卧龙首页+省份城市二级关联)

    一. 事件 1.鼠标事件 1.1表单onsubmit事件 作用:当表单的内容不符合要求的时候,阻止表单提交,在实际应用中,会给用户提示 代码演示: <!DOCTYPE html> < ...

  5. 32.全网最详细trap讲解,trap语法格式,信号和用途,最常用的信号,trap常用的命令,ctrl + c,信号屏蔽和恢复,trap -,debug,exit,return示例,三个综合案例

    文章目录 语法详解 trap格式 信号和用途 最常用的信号 trap常用的命令 示例 ctrl + c 示例 信号屏蔽和恢复 trap - 示例 debug示例 exit示例 return示例 综合案 ...

  6. 2020-7-17 Java综合案例练习

    2020-7-17 Java综合案例练习 一.选择 执行下面代码后,哪几个结论是正确的 (B) A. f[0] B. f[0] = 0.0 C. 编译失败 D. 在运行时抛出异常 执行下面代码后,哪几 ...

  7. HTML:综合案例,体育新闻基本架构。

    <!--一个小的综合案例:--><!DOCTYPE html> <html lang="en"> <head><meta ch ...

  8. 2021年大数据Hive(十二):Hive综合案例!!!

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive综合案例 一.需求描述 二.项目表的字段 三.进 ...

  9. CSS 背景(background)(背景颜色color、背景图片image、背景平铺repeat、背景位置position、背景附着、背景简写、背景透明、链接导航栏综合案例)

    1. 背景颜色(color) background-color:颜色值; 默认的值是 transparent 透明的 示例代码: <!DOCTYPE html> <html lang ...

最新文章

  1. 1282. Game Tree
  2. 遍历系统的所有ObjectType和TypeIndex
  3. 浅谈数据分析中的“暗物质”
  4. 网络安全系列之三十五 缓冲区溢出
  5. 如何在内存序列化中使用Java深克隆对象
  6. android多个闹钟实现,Android编程实现PendingIntent控制多个闹钟的方法
  7. 双系统(win8.1+ubuntu14.04)删除win下分区导致grub rescue解决方案
  8. J03-Java IO流总结三 《 FileInputStream和FileOutputStream 》
  9. mysql in过大_项目中常用的 19 条 MySQL 优化
  10. ios 打印 详细错误日志_iOS打印Debug日志的方式
  11. 新建iOS工程如何给所有类名添加前缀
  12. 2021年9月再次更新-日立电梯,艾默生变频器维修图纸,原理图
  13. 运维基础知识总结(环境搭建篇)
  14. lpt监控安装_LPT说明书
  15. win11怎么隐藏任务栏图标?
  16. python 基于模板生成ppt_【Python3】通过模板实现PPT的自动生成
  17. 绘画技巧:怎样才能画好拟人化兽人?
  18. 云服务器win系统入站规则,云服务器win系统入站规则
  19. 计算机学院运动会解说词,学院运动会入场解说词
  20. 遥感场景识别数据集(场景分类)

热门文章

  1. RobotFramework(一)基本介绍
  2. java必学之Redis中的数据结构
  3. windows7 runas命令
  4. 30万“被消失”的视障用户,如何在淘宝剁手盖楼?
  5. Windows Docs
  6. 如何将一个向量投影到一个平面上_MIT—线性代数笔记15 子空间投影
  7. 沧小海详解面试的必答题——I2C协议
  8. 【附源码】Java计算机毕业设计郑州市智慧农贸市场管理系统(程序+LW+部署)
  9. python 分数化简_C++、Java、Python中都是怎么精确表达分数的?
  10. 亲身经历:中型企业ERP选型全纪录