1.6 员工身份识别模块

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>&nbsp;</p>
<p>系统口令:<input type="password" name="password" /></p>
<p>&nbsp;</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.java
1
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);//定义按ID查询员工信息的方法
}

代码第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.java
1
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 = ?"; //SQL语句
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行通过连接对象connprepareStatement方法来获得预处理对象pstm。代码第10行调用预处理对象pstmsetInt方法来设置参数,其参数值为员工的编号。
代码第11行通过预处理对象pstmexecuteQuery来执行査询,并将査询结果赋值给结果集对象rs。代码第12行通过判断结果集中是否包含员工信息,如果包含员工信息,则首先创建一个Employee实例对象,并调用其各方法来设置员工信息。代码第27行至29行通过调用DBConnection类的close方法来关闭预处理对象、预处理对象以及连接对象,从而释放系统资源,减少项目开销。

(3)EmployeeDAOFactory类

EmployeeDAOFactory类为DAO工厂类,通过调用该类的getEmployeeDAOInstance方法能返回一个EmployeeDAOImpl实现类实例。

/JavaPrj_1/src/com/sanqing/factory/EmployeeDAOFactory.java
1
2
3
4
5
public class EmployeeDAOFactory {
public static EmployeeDAO getEmployeeDAOInstance(){ //工厂方法,用来返回DAO实现类实例
return new EmployeeDAOImpl(); //返回DAO实现类实例
}
}

代码第2行定义了一个静态方法getEmployeeDAOInstance,其返回值为EmployeeDAO接口类型。代码第3行返回了一个EmployeeDAOImpl实现类的实例。
工厂类的好处在于,如果有多个DAO实现类,比如一个实现类用来操作MySQL数据库一个实现类用来操作SQLServer数据库,那么只需要修改工厂类中代码即可返回不同的实现类实例。对于其他代码中调用DAO的地方不需要进行任何修改,这种编程方式也叫面向接口编程的。

1.6.3 完成员工身份识别

要完成员工识别,需要添加一个员工身份识别类,该类为一个Servlet。通过接收员工提交的员工编号和系统口令来对员工身份进行识别。只有当员工编号和系统口令都正确的情况下,才允许员工进入系统,否则提示其重新识别。

/JavaPrj_12/src/com/sanqing/servlet/StatusRecognise.java
1
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(); //获得ServletContex
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();//获得DAO实现类实例
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);//将员工信息保存到session范围
response.sendRedirect("index.jsp");
return;
} else {
request.setAttribute("error", "系统口令不正确!");
dispatcher = servletContext.
getRequestDispatcher("/statusRecognise.jsp");
}
}
}
}
dispatcher.forward(request, response);//进行跳转
}

代码第5行和第6行调用requestgetParameter方法获得员工提交的员工编号和系统口令参数。代码第7行判断员工是否输入了员工编号,如果没有输入则在request范围添加错误提示信息,并设置跳转页面为员工身份识别表单页。代码第12行判断员工是否输入了系统口令,如果没有输入同样在request范围添加错误提示信息,并设置跳转页面为员工身份识别表单页。如果员工输入了员工编号和系统口令则再对员工编号进行査询,査询数据库中是否存在该员工编号对应的员工信息,如果不存在,则在request范围添加错误提示信息,并设置跳转页面为员工身份识别表单页
代码第26行通过判断员工输入的系统口令和数据库中保存的是否相同,如果相同则将该员工的所有信息保存到session范围中,同时设置跳转页面为系统首页;否则设置跳转页面为员工身份识别表单页。代码第39行通过dispatcher对象的forward方法来进行跳转,页面将跳转到指定的跳转页面。