1.6.1 员工身份识别表单
员工身份识别表单用来输入员工身份信息,包括员工编号和系统口令两个输入框,同时还包含一个提交按钮和一个重置按钮,分别用来提交表单和重置表单。
1 2 3 4 5 6 7 8 9 10 11
| <div id="shenfenshibie"> <font color="red">${requestScope.error }</font> <form action="StatusRecogniseAction" method="post"> <p>员工编号:<input type="text" name="employeeID" value="${param.employeeID}"/></p> <p> </p> <p>系统口令:<input type="password" name="password" /></p> <p> </p> <p><input type="submit" value="提交" /> <input type="reset" value="重置" /></p> </form> </div>
|
代码第2行使用EL
表达式输出request
范围的eror
信息,其中eror
中包含了员工识别时的所有错误信息,比如员工编号不存在,系统口令不正确等等。代码第4行添加了一个单行文本框,用来输入员工编号。代码第7行添加了一个密码输入框,用来输入系统口令
打开浏览器,在地址栏中输入htt:/Localhost:8080/JavaPrj_ 1/statusRecogniseJsp
,打开员工身份识别表单如图1-6所示
1.6.2 员工信息DAO层
要对员工身份进行识别,必须从数据库中查询该员工编号是否存在,系统口令是否一致,这时就需要使用JDBC
来操作数据库。本系统使用DAO
层封装JDBC
操作,从而简化开发步骤,并提供良好的扩展性。
DAO
层包括3个部分,分别是DAO
接口、DAO
实现类以及DAO
工厂类。下面将对这3个部分进行详细讲解。
(1)EmployeeDAO接口
EmployeeDAO
接口声明了所有的需要使用的操作,如添加员工信息、修改员工信息以及删除员工信息等等操作。
/JavaPrj_1/src/com/sanqing/dao/EmployeeDAO.java1 2 3 4 5 6 7
| public interface EmployeeDAO { public void addEmployee(Employee employee); public void updateEmployee(Employee employee); public void deleteEmployee(int employeeID); public List<Employee> findAllEmployee(); public Employee findEmployeeById(int employeeID); }
|
代码第2行声明了addEmployee
方法,该方法接收一个Employee
类型的参数,该参数中封装了需要添加的员工所有信息。代码第3行声明了updateEmployee
方法,该方法同样接收个Employee
类型的参数,用来封装需要更新的员工所有信息。代码第4行声明了deleteEmployee
方法,该方法接收一个int
类型的参数,该参数用来指定需要删除的员工的员工编号。
代码第5行声明了findAllEmployee
方法,该方法返回一个List
类型的集合,包含了所有的员工信息。代码第6行声明了findEmployeeByld
方法,该方法接收员工编号信息,并返回该员工编号对应的所有员工信息.
(2)EmployeeDAOImpl类
EmployeeDAOImpl
类实现了EmployeeDAO
接口,并实现了EmployeeDAO
接口中声明的所有方法。EmployeeDAOImpl
类通过调用JDBC
来完成所有的数据库操作
/JavaPrj_1/src/com/sanqing/daoImpl/EmployeeDAOImpl.java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public Employee findEmployeeById(int employeeID) { Connection conn = DBConnection.getConnection(); String findByIDSQL = "select * from " + "tb_employee where employeeID = ?"; PreparedStatement pstmt = null; ResultSet rs = null; Employee employee = null; try { pstmt = conn.prepareStatement(findByIDSQL); pstmt.setInt(1, employeeID); rs = pstmt.executeQuery(); if(rs.next()) { employee = new Employee(); employee.setEmployeeID(rs.getInt(1)); employee.setEmployeeName(rs.getString(2)); employee.setEmployeeSex(rs.getBoolean(3)); employee.setEmployeeBirth(rs.getDate(4)); employee.setEmployeePhone(rs.getString(5)); employee.setEmployeePlace(rs.getString(6)); employee.setJoinTime(rs.getDate(7)); employee.setPassword(rs.getString(8)); employee.setLead(rs.getBoolean(9)); } } catch (SQLException e) { e.printStackTrace(); } finally{ DBConnection.close(rs); DBConnection.close(pstmt); DBConnection.close(conn); } return employee; }
|
代码第2行调用DBConnection
类的getConnection
方法获得连接对象conn
。代码第3行定义了一个查询SQL
语句,该SOL
语句通过员工编号来查询该员工的所有信息。代码第9行通过连接对象conn
的prepareStatement
方法来获得预处理对象pstm
。代码第10行调用预处理对象pstm
的setInt
方法来设置参数,其参数值为员工的编号。
代码第11行通过预处理对象pstm
的executeQuery
来执行査询,并将査询结果赋值给结果集对象rs
。代码第12行通过判断结果集中是否包含员工信息,如果包含员工信息,则首先创建一个Employee
实例对象,并调用其各方法来设置员工信息。代码第27行至29行通过调用DBConnection
类的close
方法来关闭预处理对象、预处理对象以及连接对象,从而释放系统资源,减少项目开销。
(3)EmployeeDAOFactory类
EmployeeDAOFactory
类为DAO
工厂类,通过调用该类的getEmployeeDAOInstance
方法能返回一个EmployeeDAOImpl
实现类实例。
/JavaPrj_1/src/com/sanqing/factory/EmployeeDAOFactory.java1 2 3 4 5
| public class EmployeeDAOFactory { public static EmployeeDAO getEmployeeDAOInstance(){ return new EmployeeDAOImpl(); } }
|
代码第2行定义了一个静态方法getEmployeeDAOInstance
,其返回值为EmployeeDAO
接口类型。代码第3行返回了一个EmployeeDAOImpl
实现类的实例。
工厂类的好处在于,如果有多个DAO
实现类,比如一个实现类用来操作MySQL
数据库一个实现类用来操作SQLServer
数据库,那么只需要修改工厂类中代码即可返回不同的实现类实例。对于其他代码中调用DAO
的地方不需要进行任何修改,这种编程方式也叫面向接口编程的。
1.6.3 完成员工身份识别
要完成员工识别,需要添加一个员工身份识别类,该类为一个Servlet
。通过接收员工提交的员工编号和系统口令来对员工身份进行识别。只有当员工编号和系统口令都正确的情况下,才允许员工进入系统,否则提示其重新识别。
/JavaPrj_12/src/com/sanqing/servlet/StatusRecognise.java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext servletContext = getServletContext(); RequestDispatcher dispatcher = null; String employeeID = request.getParameter("employeeID"); String password = request.getParameter("password"); if(employeeID == null || "".equals(employeeID)) { request.setAttribute("error", "请输入员工编号!"); dispatcher = servletContext. getRequestDispatcher("/statusRecognise.jsp"); }else { if(password == null || "".equals(password)) { request.setAttribute("error", "请输入系统口令!"); dispatcher = servletContext. getRequestDispatcher("/statusRecognise.jsp"); }else { EmployeeDAO employeeDAO = EmployeeDAOFactory.getEmployeeDAOInstance(); Employee employee = employeeDAO. findEmployeeById(Integer.parseInt(employeeID)); if(employee == null) { request.setAttribute("error", "该员工编号不存在!"); dispatcher = servletContext. getRequestDispatcher("/statusRecognise.jsp"); } else { if(password.equals(employee.getPassword())) { request.getSession(). setAttribute("employee", employee); response.sendRedirect("index.jsp"); return; } else { request.setAttribute("error", "系统口令不正确!"); dispatcher = servletContext. getRequestDispatcher("/statusRecognise.jsp"); } } } } dispatcher.forward(request, response); }
|
代码第5行和第6行调用request
的getParameter
方法获得员工提交的员工编号和系统口令参数。代码第7行判断员工是否输入了员工编号,如果没有输入则在request
范围添加错误提示信息,并设置跳转页面为员工身份识别表单页。代码第12行判断员工是否输入了系统口令,如果没有输入同样在request
范围添加错误提示信息,并设置跳转页面为员工身份识别表单页。如果员工输入了员工编号和系统口令则再对员工编号进行査询,査询数据库中是否存在该员工编号对应的员工信息,如果不存在,则在request
范围添加错误提示信息,并设置跳转页面为员工身份识别表单页
代码第26行通过判断员工输入的系统口令和数据库中保存的是否相同,如果相同则将该员工的所有信息保存到session
范围中,同时设置跳转页面为系统首页;否则设置跳转页面为员工身份识别表单页。代码第39行通过dispatcher
对象的forward
方法来进行跳转,页面将跳转到指定的跳转页面。