1.逻辑分析
1)校验验证码
2)根据用户名和密码获取用户信息
3)封装数据
4)调用service查询数据库
5)根据用户名和密码判断该用户是否存在
6)判断用户是否激活
7)判断用户登录成功与否
8)响应数据到客户端
9)用户退出,消除session
2.代码实现
2.1 servlet层代码
1)login() 用户登录;
//1.校验验证码,此处封装为一个验证码校验的方法,直接调用
checkCode(request, response);
//2.根据用户名和密码获取用户信息
Map<String, String[]> map = request.getParameterMap();
//3.封装数据
User user = new User();
BeanUtils.populate(user, map);
//4.调用service完成查询
User u = service.login(user);
ResultInfo info = new ResultInfo();
//5.u是否存在
if (u == null) {
//用户不存在
info.setFlag(false);
info.setErrorMsg("用户名或密码错误!");
}
//6.用户是否激活
else if (!"Y".equals(u.getStatus())) {
//用户未激活
info.setFlag(false);
info.setErrorMsg("该用户尚未激活!");
}
//7.判断登录成功
else if ("Y".equals(u.getStatus())) {
//登录成功
info.setFlag(true);
request.getSession().setAttribute("user", u); //设置session,用作之后在页面上回显用户姓名
}
//8.响应数据
writeValue(info, response); //此处封装一个序列化json并响应到客户端的方法
2)findOne()异步查询,回显用户姓名;
//1.从session中获取登录用户
Object user = request.getSession().getAttribute("user");
//2.将user写回客户端
writeValue(user, response);
3)exit()用户退出;
//销毁session
request.getSession().invalidate(); //此处关键
//跳转到登录页面
response.sendRedirect(request.getContextPath() + "/login.html"); //重定向到登录页面
2.2 service层代码
1)login()返回用户user;
return userDao.findByUsernameAndPassword(user.getUsername(),user.getPassword());
2.3 dao层代码
1)findByUsernameAndPassword()根据用户名和密码查询;
User user = null;
try {
//1.定义sql
String sql = "select * from tab_user where username = ? and password = ? ";
//2.执行sql
user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username,password);
} catch (Exception e) {
}
return user;
2.4 web层代码
1)header.html中用js完成Ajax发送,返回用户名;
<script>
$(function () {
//发送ajax请求,返回用户名
$.get("user/findOne",{},function (data) {
//返回user信息
var msg = "欢迎回来,"+data.name;
$("#span_username").html(msg);
});
}
</script>
3.个人心得
//关于异步请求,发送ajax请求;
例: $.get(“user/findOne”,{},function (data) {});
1){}:客户端请求的参数;
2)“user/findOne”:访问服务器的URL;
3)function (data):回调函数,data:响应到客户端的数据;
4.后续完成UserServlet优化
//TODO…