OA系统-员工的添加和查询-登录功能的实现

1.员工管理-完善添加员工-动态显示部门列表和员工上级

(1)页面中下拉框动态显示的原理是什么?
当我们点击添加员工时,不是先跳转到添加员工的界面,而是先跳转到一个servlet,先查询所有的部门信息和员工上级信息,携带这些信息请求转发到添加员工的界面,将查询到的信息填入到下拉选框中

2.员工管理-查询所有员工-后台实现

(1)简述查询所有员工的逻辑和页面的跳转?
当点击查询所有员工时,首先到servlet内查找处理的方法,在该方法中调用了业务层查询员工信息的方法,业务层又调用了数据库访问层的查询所有员工信息的方法,将结果返回到servlet中,servlet将查询到的信息存储进request对象中,请求转发跳转到empList.jsp界面中
(2)查询所有信息要从empployee,dept,position查询,利用了多表连接和自连接,请问如何编写这个sql?

select e.empid,e.realname,e.sex,e.emptype,e.hiredate,e.onduty,e.qq,e.phone,e.deptno,d.deptname,e.posid,p.pname,mgr.empid,mgr.realname
from employee e
join dept d
on e.deptno=d.deptno
join position p
on e.posid=p.posid
join employee mgr
on e.mgrid=mgr.empid

3.员工管理-查询所有员工-前台实现

(1)如何使用taglib指令导入jstl标签库?
先引入标签库:<%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
再使用使用标签
(2)简述查询所有员工前台界面的编写?
在显示查询到的员工的信息的表格中,使用循环遍历流转到前台的list集合,将数据打印输出到浏览器上

4.多条件查询员工-接收和记忆查询条件

(1)描述一种应用多条件查询的业务场景?
根据条件进行查询,如果满足条件则根据条件查询,如果所有条件为空或为空字符串则表示查询全部信息,否则有哪些条件满则要求就查询符合条件的信息
(2)如何完成查询条件的记忆功能?
当点击查询后,请求servlet,servlet获取请求信息后,将信息存储至request对象中,然后再在empList.jsp页面中使用EL表达式取出来。

5.员工管理-多条件查询员工-完整的查询操作

(1)简述整个查询逻辑。

EmpServlet:
public void findEmp(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
		//获取请求信息
		String empid = req.getParameter("empid");
		int deptno = Integer.parseInt(req.getParameter("deptno"));
		int onduty = Integer.parseInt(req.getParameter("onduty"));
		String shiredate = req.getParameter("hiredate");
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		Date hiredate = null;
		if(shiredate!=null && "".equals(shiredate)){
			try {
				hiredate = df.parse(shiredate);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		
		//处理请求信息
		EmpService es = new EmpServiceImpl();
		List<Employee> list = es.findEmp(empid,deptno,onduty,hiredate);
		// 获取所有部门信息
		DeptService ds = new DeptServiceImpl();
		List<Dept> deptList = ds.findAll();
		req.setAttribute("deptList", deptList);
		// 响应处理结果
		req.setAttribute("empid", empid);
		req.setAttribute("deptno", deptno);
		req.setAttribute("onduty", onduty);
		req.setAttribute("shiredate", shiredate);
		req.setAttribute("list", list);
		req.getRequestDispatcher("/system/empList.jsp").forward(req, resp);

	}
EmpService:
List<Employee> findEmp(String empid, int deptno, int onduty, Date hiredate);
EmpServiceImpl:
public List<Employee> findEmp(String empid, int deptno, int onduty,
			Date hiredate) {
		
		return ed.findEmp(empid, deptno,onduty,hiredate);
	}
EmpDao:
List<Employee> findEmp(String empid, int deptno, int onduty, Date hiredate);
EmpDaoImpl:
public List<Employee> findEmp(String empid2, int deptno2, int onduty2,
			Date hiredate2) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Employee> list = null;
		try {
			conn = DBUtil.getConnection();
			StringBuffer sql = new StringBuffer("select e.empid,e.realname,e.sex,e.emptype,e.hiredate,e.onduty,e.qq,e.phone,"
			+" e.deptno,d.deptname,e.posid,p.pname,mgr.empid,mgr.realname"
			+" from employee e"
			+" join dept d"
			+" on e.deptno=d.deptno"
			+" join position p"
			+" on e.posid=p.posid"
			+" join employee mgr"
			+" on e.mgrid=mgr.empid"
			+" where 1=1");
			if(empid2!=null && !"".equals(empid2)){
				sql.append(" and e.empid like '%"+empid2+"%'");
			}
			if(deptno2!=0){
				sql.append(" and e.deptno="+deptno2);
			}
			sql.append(" and e.onduty="+onduty2);
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
			if(hiredate2!=null){
				String hiredate = df.format(hiredate2);
				sql.append(" and to_char(e.hiredate,'yyyy-mm-dd')>="+hiredate);
			}
			ps = conn.prepareStatement(sql.toString());
			list = new ArrayList<>();
			rs = ps.executeQuery();
			while(rs.next()){
				Employee emp = new Employee();
				emp.setEmpid(rs.getString("empid"));
				emp.setRealname(rs.getString("realname"));
				emp.setSex(rs.getString("sex"));
				emp.setEmptype(rs.getInt("emptype"));
				emp.setHiredate(rs.getDate("hiredate"));
				emp.setOnduty(rs.getInt("onduty"));
				emp.setQq(rs.getString("qq"));
				emp.setPhone(rs.getString("phone"));			
				int deptno = rs.getInt("deptno");
				String deptname = rs.getString("deptname");
				Dept dept = new Dept();
				dept.setDeptno(deptno);
				dept.setDeptname(deptname);
				emp.setDept(dept);			
				int posid = rs.getInt("posid");
				String pname = rs.getString("pname");
				Position position  = new Position();
				position.setPosid(posid);
				position.setPname(pname);
				emp.setPosition(position);			
				String empid = rs.getString(13);
				String realname = rs.getString(14);
				Employee mgr = new Employee();
				mgr.setEmpid(empid);
				mgr.setRealname(realname);
				emp.setMgr(mgr);
				list.add(emp);
			}		
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

(2)如何完成后台的查询条件的sql的拼接。

StringBuffer sql = new StringBuffer("select e.empid,e.realname,e.sex,e.emptype,e.hiredate,e.onduty,e.qq,e.phone,"
			+" e.deptno,d.deptname,e.posid,p.pname,mgr.empid,mgr.realname"
			+" from employee e"
			+" join dept d"
			+" on e.deptno=d.deptno"
			+" join position p"
			+" on e.posid=p.posid"
			+" join employee mgr"
			+" on e.mgrid=mgr.empid"
			+" where 1=1");
			if(empid2!=null && !"".equals(empid2)){
				sql.append(" and e.empid like '%"+empid2+"%'");
			}
			if(deptno2!=0){
				sql.append(" and e.deptno="+deptno2);
			}
			sql.append(" and e.onduty="+onduty2);
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
			if(hiredate2!=null){
				String hiredate = df.format(hiredate2);
				sql.append(" and to_char(e.hiredate,'yyyy-mm-dd')>="+hiredate);
			}

6.员工管理-删除员工以及删除策略考量

(1)简述删除员工的逻辑
在jsp页面中,点击删除,触发单击事件,弹出确认弹框,确认后向相应servlet发送请求,在发送请求的同时携带empid,empid通过el表达式获取。Servlet调用相应service,service调用dao层进行数据库操作。之后再将数据原路返回到servlet,使用重定向请求查询所有员工信息
(2)在删除员工成功后,页面跳转后条件页面上会带出来刚才删过的员工的编号,这个问题就是一个代码bug,那么这个问题怎么解决呢?
使用重定向进行页面跳转

7.员工管理-更新员工-预更新操作的后台代码

(1)简述更新操作的逻辑?
点击修改,发送请求(附带empid),根据empid查询该员工信息,并显示在修改页面,在servlet中获取修改页面的数据,封装成对象作为参数传给相应service,再传给dao进行处理。之后将结果返回,成功则发送请求查询所有,否则跳转到修改页面

8.员工管理-更新员工-预更新操作前台数据回显

(1)如何将员工数据回显到empUpdate.jsp页面
根据empid查询出某个员工的信息,将信息存进request中,在请求转发流转到empUpdate.jsp中,在页面中使用el和jstl读取数据并显示

<body>
		<div class="place">
			<span>位置:</span>
			<ul class="placeul">
				<li><a href="#">人事管理</a></li>
				<li><a href="#">修改员工信息</a></li>
			</ul>
		</div>
		<div class="formbody">
			<div class="formtitle"><span>基本信息</span></div>
			<form action="emp?method=update" method="post">
			<ul class="forminfo">
				<li>
					<label>用户名</label>
					<input name="empid" type="text" class="dfinput" value="${emp.empid }" readonly="readonly"/><i>必须唯一,也可以根据真实姓名自动生成</i></li>
				<li>
					<li>
						<label>真实姓名</label>
						<input name="realname" type="text" class="dfinput" value="${emp.realname }"/><i></i></li>
					<li>
						<label>性别</label><cite>
						<c:if test="${emp.sex == '男' }">
							<input name="sex" type="radio" value="男" checked="checked" />男&nbsp;&nbsp;&nbsp;&nbsp;
							<input name="sex" type="radio" value="女" />女<i>也可以根据身份证号自动获取</i></cite>					
						</c:if>
						<c:if test="${emp.sex == '女' }">
							<input name="sex" type="radio" value="男"  />男&nbsp;&nbsp;&nbsp;&nbsp;
							<input name="sex" type="radio" value="女" checked="checked"/>女<i>也可以根据身份证号自动获取</i></cite>					
						</c:if>
						<c:if test="${ empty emp.sex}">
							<input name="sex" type="radio" value="男" checked="checked" />男&nbsp;&nbsp;&nbsp;&nbsp;
							<input name="sex" type="radio" value="女" />女<i>也可以根据身份证号自动获取</i></cite>					
						</c:if>
					</li>
					<li>
						<label>出生日期</label>
						<input name="birthdate" type="text" value="<fmt:formatDate value="${emp.birthdate }" type="date"  dateStyle="default"/>" class="dfinput" /><i>也可以根据身份证号自动获取</i></li>
					<li>
					<li>
						<label>入职时间</label>
						<input name="hiredate" type="text" value="<fmt:formatDate value="${emp.hiredate }" type="date"  dateStyle="default"/>" class="dfinput" /><i></i></li>
					
					<li>
						<label>离职时间</label>
						<input name="leavedate" type="text" value="<fmt:formatDate value="${emp.leavedate }" type="date"  dateStyle="default"/>" class="dfinput" /><i></i></li>
					<li>
						<label>是否在职</label><cite>
						<c:if test="${emp.onduty == 1 }">
							<input name="onduty" type="radio" value="1" checked="checked" />是&nbsp;&nbsp;&nbsp;&nbsp;
							<input name="onduty" type="radio" value="0" />否</cite>	
						</c:if>
						<c:if test="${emp.onduty == 0 }">
							<input name="onduty" type="radio" value="1" />是&nbsp;&nbsp;&nbsp;&nbsp;
							<input name="onduty" type="radio" value="0" checked="checked" />否</cite>						
						</c:if>
					</li>
					<li>
							<label>员工类型</label><cite>
							<c:if test="${emp.emptype == 1 }">
								<input name="emptype" type="radio" value="1" checked="checked" />基层员工&nbsp;&nbsp;&nbsp;&nbsp;
								<input name="emptype" type="radio" value="2" />各级管理人员</cite>							
							</c:if>
							<c:if test="${emp.emptype == 2 }">
								<input name="emptype" type="radio" value="1"  />基层员工&nbsp;&nbsp;&nbsp;&nbsp;
								<input name="emptype" type="radio" value="2" checked="checked"/>各级管理人员</cite>							
							</c:if>
					</li>
					<li>
					<label>所属部门<b>*</b></label>
						<div class="vocation">
							<select class="select1" name="deptno">
								<c:forEach items="${deptList}" var="dept">
									<c:if test="${dept.deptno == emp.dept.deptno}">
										<option value="${dept.deptno }" selected="selected">${dept.deptname }</option>									
									</c:if>
									<c:if test="${dept.deptno!= emp.dept.deptno }">
										<option value="${dept.deptno }">${dept.deptname }</option>									
									</c:if>
								</c:forEach>
							</select>
						</div>
					</li>
					<li>
						<label>从事岗位<b>*</b></label>
						<div class="vocation">
							<select class="select1" name="posid">
								<c:forEach items="${pList }" var="p">
								<c:if test="${p.posid == emp.position.posid }">
									<option value="${p.posid }" selected="selected">${p.pname}</option>			
								</c:if>
								<c:if test="${p.posid != emp.position.posid }">
									<option value="${p.posid }">${p.pname}</option>			</c:if>
								</c:forEach>
							</select>
						</div>
					</li>
					<li>
						<label>直接上级<b>*</b></label>						
						<div class="vocation">
							<select class="select1" name="mgrid">
							<c:forEach items="${eList }" var="mgr">
								<c:if test="${mgr.empid == emp.mgr.empid }">
									<option value="${mgr.empid }" selected="selected">${mgr.realname}</option>							
								</c:if>
								<c:if test="${mgr.empid != emp.mgr.empid }">
									<option value="${mgr.empid }">${mgr.realname}</option>							
								</c:if>	
							</c:forEach>
							</select>							
						</div>
					&nbsp;&nbsp;<input name="" type="text" class="dfinput"  placeholder="也可以在此输入首字母帮助显示"/></li>
					</li>
					<li>
						<label>联系方式</label>
						<input name="phone" type="text" value="${emp.phone }" class="dfinput" />
					</li>
					<li>
						<label>QQ号</label>
						<input name="qq" type="text" value="${emp.qq }" class="dfinput" />
					</li>
					<li>
						<label>紧急联系人信息</label>
						<textarea name="emerContactPerson" cols="" rows="" class="textinput">${emp.emerContactPerson }</textarea>
					</li>
					<li>
						<label>身份证号</label>
						<input name="idcard" type="text" value="${emp.idcard }" class="dfinput" />
					</li>
					<li>
						<label>&nbsp;</label>
						<input name="" type="submit" class="btn" value="确认保存" />
					</li>
			</ul>
		</form>
		</div>
	</body>

9.员工管理-更新员工-完成更新操作

(1)在整个更新操作中,需要注意的事项是什么?
更新操作要注意总共分为两部分,首先查询出要修改的员工的信息,之后再修改该员工的信息
(2)到这里为止,我们已经完成了员工的增删改查操作,我们是否可以总结一下,写代码从前端到后端的流程呢?(再次理解MVC)
前端界面(视图层)调用相应servlet(控制层),servlet调用service(业务层),service调用dao层进行数据操作。从数据库查询出数据后,再原路返回,返回到servlet后,请求转发或者重定向到其他servlet或者相应页面

10.考勤管理-登录-实现登录操作.

(1)简述登陆功能的逻辑和页面的跳转。
用户输入用户名和密码,servlet将页面用户输入的数据获取,并作为参数传给service,service调用dao层,dao层将根据参数用户名和密码查询数据库中是否有符合条件的数据,有则通过可以登录,进入主页面,否则登陆失败,返回登录界面
(2)登陆成功进入到系统之后,页面上如何显示当前用户呢?
登陆成功时,将该用户的信息存进session中,页面上使用el表达式获取session中该员工信息,获取需要的数据,显示在正确的位置上

11.考勤管理-登录和注销-登录成功后显示不同导航菜单

(1)如何完成用户退出功能?
将session销毁后重定向到登录界面
(2)登陆系统后,不同的用户看到的菜单是不一样的,这个功能如何完成的呢?
在jsp页面中使用jstl表达式,通过emptype判断身份,从而显示不同页面
(3)登陆系统后,不同的用户看到的菜单是不一样的,思考是否有更好的技术能帮助我们完成这个事呢?可以自行查询资料。

12.考勤管理-登录-实现验证码

(1)平时经常遇到验证码功能,请问验证码的作用是什么?
是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能
(2)如何完成验证码功能,简述整个逻辑?
在randoServlet中将验证码图像生产并存进session中,在登录的servlet中,将session中的验证码获取,同时也获取页面中用户输入的验证码,将二者进行对比,一致则通过,进行剩余代码,否则直接返回到登录界面。在jsp页面中,点击验证码,触发单击事件,根据时间不同,产生新的验证码

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值