1、 需求分析
1.1 需求说明:
完成用户登录功能,如果用户勾选“记住用户” ,则下次访问登录页面自动填充用户名密码
完成注册功能,并实现验证码功能
1.2 目录结构:
1.3 代码清单:
百度网盘链接:https://pan.baidu.com/s/124D-c9kuqrQU9YtF5fkoaA
提取码:395r
2、用户登录功能
2.1 需求分析:
用户登录成功后,跳转到列表页面,并在页面上展示当前登录的用户名称
用户登录失败后,跳转回登录页面,并在页面上展示对应的错误信息
2.2 实现流程分析
前端通过表单发送请求和数据给Web层的LoginServlet
在LoginServlet中接收请求和数据(用户名和密码)
LoginServlet接收到请求和数据后,调用Service层完成根据用户名和密码查询用户对象
在Service层需要编写UserService类,在类中实现login方法,方法中调用Dao层的UserMapper
在UserMapper接口中,声明一个根据用户名和密码查询用户信息的方法
Dao层把数据查询出来以后,将返回数据封装到User对象,将对象交给Service层
Service层将数据返回给Web层
Web层获取到User对象后,判断User对象,如果为Null,则将错误信息响应给登录页面,如果不为Null,则跳转到列表页面,并把当前登录用户的信息存入Session携带到列表页面。
2.3 具体实现
2.3.1 完成Dao层的代码编写
UserMapper.java放到com.sun.mapper包下:
public interface UserMapper { /** * 根据用户名和密码查询用户对象 * @param username * @param password * @return */ @Select("select * from tb_user where username = #{username} and password = #{password}") User select(@Param("username") String username,@Param("password") String password); /** * 根据用户名查询用户对象 * @param username * @return */ @Select("select * from tb_user where username = #{username}") User selectByUsername(String username); /** * 添加用户 * @param user */ @Insert("insert into tb_user values(null,#{username},#{password})") void add(User user); }
将User.java放到com.sun.pojo包下:
public class User { private Integer id; private String username; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } 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; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
将UserMapper.xml放入到resources/com/sun/mapper目录下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.sun.mapper.UserMapper"> </mapper>
2.3.2 完成Service层的代码编写
在com.sun.service包下,创建UserService类 public class UserService { // 1.使用工具类获取SqlSessionFactory SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory(); /** * 登录方法 * @param username * @param password * @return */ public User login(String username,String password){ // 2. 获取SqlSession SqlSession sqlSession = factory.openSession(); // 3. 获取UserMapper UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 4. 调用方法 User user = mapper.select(username, password); // 释放资源 sqlSession.close(); return user; } }
2.3.3 完成页面和Web层的代码编写
将代码清单中的 静态页面拷贝到项目的webapp目录下: 将login.html内容修改成login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> <link href="css/login.css" rel="stylesheet"> </head> <body> <div id="loginDiv" style="height: 350px"> <form action="/brand-demo/loginServlet" method="post" id="form"> <h1 id="loginMsg">LOGIN IN</h1> <div id="errorMsg">用户名或密码不正确</div> <p>Username:<input id="username" name="username" type="text"></p> <p>Password:<input id="password" name="password" type="password"></p> <p>Remember:<input id="remember" name="remember" type="checkbox"></p> <div id="subDiv"> <input type="submit" class="button" value="login up"> <input type="reset" class="button" value="reset"> <a href="register.html">没有账号?</a> </div> </form> </div> </body> </html>
创建LoginServlet类
@WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { private UserService service = new UserService(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 获取用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); //2. 调用service查询 User user = service.login(username, password); //3. 判断 if(user != null){ //登录成功,跳转到登录成功界面 //将登陆成功后的user对象,存储到session HttpSession session = request.getSession(); session.setAttribute("user",user); String contextPath = request.getContextPath(); response.sendRedirect(contextPath+"/selectAllServlet"); }else { // 登录失败 // 存储错误信息到request request.setAttribute("login_msg","用户名或密码错误"); // 跳转到login.jsp request.getRequestDispatcher("/login.jsp").forward(request,response); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
在brand.jsp中<body>标签下添加欢迎当前用户的提示信息:
<h1>${user.username},欢迎您</h1>
修改login.jsp,将错误信息使用EL表达式来获取
修改前内容:<div id="errorMsg">用户名或密码不正确</div> 修改后内容:<div id="errorMsg">${login_msg}</div>
2.3.4 启动,访问测试
进入登录页面,输入错误的用户名或密码
输入正确的用户和密码信息
小结
在LoginServlet中,将登录成功的用户数据存入session中,方法在列表页面中获取当前登录用户信息进行展示
在LoginServlet中,将登录失败的错误信息存入到request中,如果存入到session中就会出现这次会话的所有请求都有登录失败的错误信息,这个是不需要的,所以不用存入到session中