JavaWeb:登录注册功能实现

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: JavaWeb 登录注册是一种常见的网站开发功能,使用 Java 编程语言和 Web 技术来实现用户注册和登录功能

1、用户登录

1.1、环境准备

创建SQL

-- 创建数据库
CREATE DATABASE request_test;
USE request_test;

-- 创建用户表
CREATE TABLE tb_user(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) UNIQUE,
    `password` VARCHAR(32)
)DEFAULT CHARSET=utf8;

-- 添加数据
INSERT INTO tb_user(username,`password`) VALUES('zhangsan','123'),('lisi','234');

SELECT * FROM tb_user;

新建web项目并在pom.xml添加依赖

<dependencies> 
    <dependency> 
        <groupId>javax.servlet</groupId>  
        <artifactId>javax.servlet-api</artifactId>  
        <version>3.1.0</version>  
        <scope>provided</scope> 
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
    <!--MyBatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>
    <!--MySQL驱动 可以适应mysql8和mysql5-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
</dependencies>

配置mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration  
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <!--在控制台显示SQL语句-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--开启驼峰命名自动映射数据库的_命名-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--配置所有的别名-->
    <typeAliases>
        <package name="com.demo.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--配置连接池需要的参数-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/request_test?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="com.demo.mapper"/>

    </mappers>
</configuration>

创建POJO类

public class User {
   
   
    private Integer id;
    private String username;
    private String password;
    ...省略get和set方法
}

在com.demo.mapper包下创建UserMapper接口

public interface UserMapper {
   
   
}

创建工具类

// 这是MyBatis的工具类,简化MyBatis代码
public class MyBatisUtils {
   
   
    private static SqlSessionFactory sqlSessionFactory;
    // 我们只需要一个SqlSessionFactory,在静态代码块中创建SqlSessionFactory
    static {
   
   
        try {
   
   
            // 编写代码让MyBatis跑起来,执行SQL语句
            String resource = "mybatis-config.xml";
            // 加载核心配置文件
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 得到SqlSession工厂,赋值给成员变量
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
   
   
            e.printStackTrace();
        }
    }

    // 返回SqlSessionFactory
    public static SqlSessionFactory getSqlSessionFactory() {
   
   
        return sqlSessionFactory;
    }

    // 返回SqlSession
    public static SqlSession openSqlSession() {
   
   
        return sqlSessionFactory.openSession();
    }

    public static SqlSession openSqlSession(boolean autoCommit) {
   
   
        return sqlSessionFactory.openSession(autoCommit);
    }
}

前端登录页面

<!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">
    <form action="loginServlet" method="post" id="form">
        <h1 id="loginMsg">登录</h1>
        <p>用户名:<input id="username" name="username" type="text"></p>

        <p>密码:<input id="password" name="password" type="password"></p>

        <div id="subDiv">
            <input type="submit" class="button" value="登录">
            <input type="reset" class="button" value="重置">&nbsp;&nbsp;&nbsp;
            <a href="register.html">没有账号?点击注册</a>
        </div>
    </form>
</div>

</body>
</html>

1.2、需求分析

image-20240118202324174

流程说明

1、用户在登录页面输入用户名和密码,提交请求给LoginServlet

2、在LoginServlet中接收请求和数据用户名和密码

3、在LoginServlt中通过Mybatis实现调用UserMapper来根据用户名和密码查询数据库表

4、将查询的结果封装到User对象中进行返回

5、在LoginServlet中判断返回的User对象是否为null

6、如果为nul,说明根据用户名和密码没有查询到用户,则登录失败,返回"登录失败"数据给前端

7、如果不为null,则说明用户存在并且密码正确,则登录成功,返回"登录成功"数据给前端

1.3、代码实现

在UserMapper接口中提供一个根据用户名和密码查询用户对象的方法

@Select("select  * from tb_user where username = #{username} and password = #{password}")
User select(@Param("username") String username,@Param("password") String password);

创建LoginServlet.java

1、接受用户账号密码

2、使用UserMapper进行数据查询,返回User对象

3、判断User对象是否为null

​ 为null:登录失败

​ 不为null:登录成功

@WebServlet(value = "/loginServlet")
public class LoginServlet extends HttpServlet {
   
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        //解决POST中文乱码问题
        request.setCharacterEncoding("UTF-8");
        //解决输入流中文乱码问题
        response.setContentType("text/html;charset=utf-8");

        // 接收用户名密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 用户查询
        SqlSession sqlSession = MyBatisUtils.openSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.select(username, password);

        if (user != null){
   
   
            response.getWriter().write(username + "登录成功");
        } else {
   
   
           response.getWriter().write(username + "登录失败");
        }
        sqlSession.close();

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        doGet(request,response);

    }
}

进行登录测试

image-20240118210658907

2、用户注册实现

2.1、环境准备

前端注册页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎注册</title>
    <link href="css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="login.html">登录</a>
    </div>
    <form id="reg-form" action="registerServlet" method="post">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <input name="username" type="text" id="username">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <input name="password" type="password" id="password">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>


        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>
</body>
</html>

2.2、需求分析

image-20240118211043524

流程说明

1、用户在注册页面输入用户名和密码,提交请求给RegisterServlet

2、在RegisterServlet中接收请求和数据[用户名和密码]

3、在RegisterServlet中通过Mybatis实现调用UserMapper来根据用户名查询数据库表

4、将查询的结果封装到User对象中进行返回

5、在RegisterServlet中判断返回的User对象是否为null

6、如果为nul,说明根据用户名可用,则调用UserMapper来实现添加用户

7、如果不为null,则说明用户不可以,返回"用户名已存在"数据给前端

2.3、代码实现

编写UserMapper提供根据用户名查询用户数据方法和添加用户方法

public interface UserMapper {
   
   
    @Select("select  * from tb_user where username = #{username} and password = #{password}")
    User select(@Param("username") String username,@Param("password") String password);

    @Insert("insert into request_test.tb_user values (null,#{username},#{password})")
    void insertUser(@Param("username") String username,@Param("password") String password);

    @Select("select  * from tb_user where username = #{username}")
    User selectByUsername(@Param("username") String username);
}

创建RegisterServlet类

@WebServlet(value = "/registerServlet")
public class RegisterServlet extends HttpServlet {
   
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        //解决POST中文乱码问题
        request.setCharacterEncoding("UTF-8");
        //解决输入流中文乱码问题
        response.setContentType("text/html;charset=utf-8");

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+" "+password);
        SqlSession sqlSession = MyBatisUtils.openSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.selectByUsername(username);

        if (user == null){
   
   
            mapper.insertUser(username, password);
            sqlSession.commit();
            response.getWriter().write("注册成功");
        } else {
   
   
            response.getWriter().write("用户名已经存在");
        }

        sqlSession.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        request.setCharacterEncoding("UTF-8");
        doGet(request,response);
    }
}
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
6月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
134 0
Java Stream API 的强大功能
|
7月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
514 211
|
7月前
|
前端开发 JavaScript Java
Java 项目实战城市公园信息管理系统开发流程与实用功能实现指南
本系统基于Java开发,采用Spring Boot后端框架与Vue.js前端框架,结合MySQL数据库,构建了一个高效的城市公园信息管理系统。系统包含管理员、用户和保洁人员三大模块,涵盖用户管理、园区信息查询、订票预约、服务管理等功能,提升公园管理效率与服务质量。
221 6
|
7月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
367 2
|
7月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
7月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
802 64
|
8月前
|
Java API
深入解析Java API中Object类的功能
了解和合理运用 Object类的这些方法,对于编写可靠和高效的Java应用程序至关重要。它们构成了Java对象行为的基础,影响着对象的创建、识别、表达和并发控制。
157 0
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
277 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1