【JavaWeb】手把手教你做一个用户登录注册案例(一)

简介: 【JavaWeb】手把手教你做一个用户登录注册案例(一)

1、 需求分析


1.1 需求说明:


完成用户登录功能,如果用户勾选“记住用户” ,则下次访问登录页面自动填充用户名密码

完成注册功能,并实现验证码功能


a19a706e137500a8245a01ce231db0a4_1629442826981.png


1.2 目录结构:


2e3b816dec8c9ffb253918333659952d_image-20220922181238205.png


1.3 代码清单:


百度网盘链接:https://pan.baidu.com/s/124D-c9kuqrQU9YtF5fkoaA

提取码:395r


945215f7b4cd4dbb80e59a61b30ef450_image-20220922181839695.png


2、用户登录功能


2.1 需求分析:


3ee26a8999598c094f8a2c5bd8491df7_1629443152010.png


用户登录成功后,跳转到列表页面,并在页面上展示当前登录的用户名称

用户登录失败后,跳转回登录页面,并在页面上展示对应的错误信息


2.2 实现流程分析


50a8a544a331ad385890f4f163c3637f_8c66cd698913bb3fefd29db20ff1fcae.png


前端通过表单发送请求和数据给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">&nbsp;&nbsp;&nbsp;
            <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 启动,访问测试


进入登录页面,输入错误的用户名或密码


662d796c9bfe0cd28d40ec8b00c82d47_875c398d0cebbb529e870e69bb60f0c6.png


输入正确的用户和密码信息


f8ea55f0c95978cc15542906ab335c52_92f2d7e0e305b71005da868b3e7df665.png


小结


在LoginServlet中,将登录成功的用户数据存入session中,方法在列表页面中获取当前登录用户信息进行展示

在LoginServlet中,将登录失败的错误信息存入到request中,如果存入到session中就会出现这次会话的所有请求都有登录失败的错误信息,这个是不需要的,所以不用存入到session中

相关文章
|
21天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
177 37
|
21天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
5天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
22 2
|
22天前
|
SQL JSON JavaScript
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
Vue 指令、生命周期、this和$、vue脚手架进行模块化开发/ElementUI框架、综合案例,element商品列表展示增删改查
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
|
2月前
|
人工智能 Java 定位技术
人工智能ChatGPT 体验案例:使用ChatGPT实现java扫雷小游戏
这篇文章通过一个使用ChatGPT实现的Java扫雷小游戏案例,展示了ChatGPT在编程领域的应用能力。文章中包含了扫雷游戏的Java代码实现,代码中初始化了雷区地图,随机放置雷,计算每个格子周围雷的数量,并提供了一个简单的文本界面与用户交互进行游戏。游戏通过控制台输入接受玩家的指令,并给出相应的反馈。
人工智能ChatGPT 体验案例:使用ChatGPT实现java扫雷小游戏
|
2月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
Java并发编程案例分析:死锁的检测与解决
25 2
|
2月前
|
安全 Java API
精通 Java 后台开发:案例分析与实践
精通 Java 后台开发:案例分析与实践
37 2
|
2月前
|
Java
Java枚举使用的基本案例
这篇文章是关于Java枚举的基本使用,通过一个指令下发的代码案例,展示了如何定义枚举、使用枚举以及如何通过枚举实现指令的匹配和处理。
|
2月前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
2月前
|
Java
Java Bean 注册对象
Java Bean 注册对象
14 0
下一篇
无影云桌面