使用JSP+Servlet+MySQL实现登录注册功能

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: Java从入门到精通
✨特色专栏: MySQL学习
🥭本文内容:使用JSP+Servlet+MySQL实现登录注册功能
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: Leo知识库,欢迎大家访问
公众号封面

1.前言

大家好,我是Leo哥🫣🫣🫣,前几天一个在大学的粉丝跟我说:Leo哥,我们最近要搞那个Java期末作业,要求是通过Javaweb知识点,使用JDBC,MySQL,JSP,Servlet等技术实现一个登录和注册功能,能不能出一期教程啊,老师啥也不教。听到这里我也是感触颇深,让我看到我之前的影子,当时老师也是啥都不教,就念个PPT,啥都要咱们自己琢磨。既然这样,咱们就出一期保姆级教程。后面也会出一些demo案例放到这个系列,第一期就先来点简单的开胃菜吧好了,话不多说让我们开始吧😎😎😎。

2.环境配置

首先Leo哥这里先声明一下本次教程的环境配置哈,大家可以跟我横向对比。

因为是比较基础的一篇,考虑到做期末作业,没有接触到Maven,所以我们这里就还是使用原生jar包的方式哈。

环境:

  • Intellij IDEA 2023
  • MySQL8.0
  • Tomcat 8.5
  • JDK8
  • JDBC
  • Navicat 16

3.项目创建

首先我会带大家从零创建一个JavaWeb项目,然后进行环境测试没问题之后,我们再继续往下进行。

打开IDEA,File — New — Project进行创建

image-20231201164521620

开始创建项目,这里我们直接进模块创建。

image-20231202145436087

查看我们的项目结构,并引入MySQL依赖

image-20231202152727940

添加Tomcat依赖

image-20231202152908233

配置Tomcat服务器

首先点击IDEA,最上面,点击Edit Configuration进行配置

image-20231202153040456

然后依次按照我图中点击即可。

image-20231202153216016

然后依次点击选择自己的Artifacts进行配置。

image-20231202153310730

首先第一步检查配置一下自己本地的Tomcat路径,没问题之后,然后选择我们项目的访问路径,最后点击apply。

image-20231202153419753

最后我们启动项目,如果能访问到默认的JSP页面,说明我们项目环境搭建成功了。

image-20231202154153352

欧克,我们环境搭建篇大功告成!!!

4.数据库准备

4.1 SQL建表语句

大家可通过自行创建SQL表

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL DEFAULT 'default',
  `password` varchar(50) NOT NULL DEFAULT '123456',
  `phone`  varchar(50) NOT NULL ,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

4.2 插入数据

INSERT INTO `user` VALUES (1, 'jack', '19978786751', '123456');
INSERT INTO `user` VALUES (2, 'tony', '19975067512', '123123');
INSERT INTO `user` VALUES (3, 'lisa', '19971286751', '123123');

5.编写后端代码

5.1 代码及项目结构总览

image-20231202162940482

5.2 编写实体类

package org.javatop.case01.domain;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-11-28 20:57
 * @description :
 */
public class User {
    private int id;

    private String username;

    private String password;


    private String phone;


    public User(int id, String username, String password,  String phone) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.phone = phone;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public User() {
    }


    public int getId() {
        return id;
    }

    public void setId(int 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 + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}

5.3 编写Dao接口

package org.javatop.case01.dao;

import org.javatop.case01.domain.User;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-11-28 20:59
 * @description :
 */
public interface UserDao {

    // 登录
    User login(String username, String password);

    // 注册
    Boolean register(User user);
}

5.4 编写Dao实现类

package org.javatop.case01.dao.impl;


import org.javatop.case01.dao.UserDao;
import org.javatop.case01.domain.User;
import org.javatop.case01.utils.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-11-28 21:01
 * @description :
 */
public class UserDaoImpl  implements UserDao {
    @Override
    public User login(String username, String password) {
        User user = null;
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            connection = JdbcUtil.getConnection();
            String sql = "select * from user where username = ? and password= ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, username);
            preparedStatement.setString(2, password);
            resultSet = preparedStatement.executeQuery();
            if(resultSet.next()){
                user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                user.setPhone(resultSet.getString("phone"));
                System.out.println("登录成功" + user.toString());
            } else {
                System.out.println("用户名或者密码错误");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.release(resultSet, preparedStatement, connection);
        }
        return user;
    }

    @Override
    public Boolean register(User user) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        int result = 0;

        try {
            connection = JdbcUtil.getConnection();
            String sql = "insert into user(username, password) values (?, ?);";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, user.getUsername());
            preparedStatement.setString(2, user.getPassword());
            result = preparedStatement.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.release(resultSet, preparedStatement, connection);
        }
        // 三目表达式,result等1则人会true,否则返回false
        return result == 1 ? true:false;
    }
}

5.5 实现Servlet

1.LoginServlet
package org.javatop.case01.controller;

import org.javatop.case01.dao.UserDao;
import org.javatop.case01.dao.impl.UserDaoImpl;
import org.javatop.case01.domain.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-12-02 14:34
 * @description :
 */
@WebServlet(name = "/login")
public class LoginServlet extends HttpServlet {

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


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

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        // 获取前端页面传过来的值
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 执行查询数据库逻辑
        UserDao userDao = new UserDaoImpl();
        User user = userDao.login(username, password);

        // 如果根据用户名和密码能查得到值
        if (user != null) {
            request.setAttribute("user", user);
            request.getRequestDispatcher("/success.jsp").forward(request, response);
        } else {    // 用户名或者密码错误执行以下代码
            request.setAttribute("message", "用户名或者密码错误");
            request.getRequestDispatcher("/defeat.jsp").forward(request, response);
        }
    }
}
2.RegisterServlet
package org.javatop.case01.controller;

import org.javatop.case01.dao.UserDao;
import org.javatop.case01.dao.impl.UserDaoImpl;
import org.javatop.case01.domain.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-12-02 16:28
 * @description : 注册接口
 */
@WebServlet(name = "/register")
public class RegisterServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPut(req, resp);
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        String username = req.getParameter("username");
        String password = req.getParameter("password");

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        UserDao userDao = new UserDaoImpl();
        if (userDao.register(user)) {
            System.out.println("注册成功");
            // 注册成功,跳转登录页面
            req.getRequestDispatcher("register-success.jsp").forward(req,resp);
        } else {
            System.out.println("注册失败");
            req.setAttribute("message", "注册失败");
            req.getRequestDispatcher("register.jsp").forward(req,resp);
        }

    }
}

5.6 编写数据库连接工具类

package org.javatop.case01.utils;

import java.sql.*;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-11-28 20:59
 * @description : 数据库连接工具类
 */
public class JdbcUtil {

    /**
     * 1、获取Connection
     * @return Connection
     * @throws Exception
     */
    public static Connection getConnection() throws Exception {

        Class.forName("com.mysql.cj.jdbc.Driver");
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root", "root");

    }

    /**
     * 2、释放资源
     * @param resultSet resultSet
     * @param statement statement
     * @param connection connection
     */
    public static void release(ResultSet resultSet, Statement statement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

6.编写前端代码

这里为了演示效果我实现了两个简单的登录注册页面

image-20231202201827183

image-20231202201849306

6.1 登录页面

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/11/28
  Time: 20:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <title>Login Page</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="form-container">
    <h2>登录</h2>
    <form action="/login" method="post">
        <input type="text" placeholder="Username" name="username" required>
        <input type="password" placeholder="Password" name="password" required>
        <button type="submit">Login</button>
        <a href="register.jsp">去注册</a>
    </form>
</div>
</body>
</html>

6.2 注册页面

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/11/28
  Time: 20:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <title>Login Page</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="form-container">
    <h2>注册</h2>
    <form action="/register" method="post">
        <input type="text" placeholder="Username" name="username" required>
        <input type="password" placeholder="Password" name="password" required>
        <button type="submit">注册</button>
    </form>
</div>
</body>
</html>

6.3 登录错误页面

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/11/28
  Time: 21:10
  To change this template use File | Settings | File Templates.
--%>
<%--<%@ page contentType="text/html;charset=UTF-8" language="java"%>--%>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html lang="en">
<head>
    <title>登录失败</title>
</head>
<body>
<h1>登录失败!</h1>
<font color="red">
    <%
        if(request.getAttribute("message")!= null){
            response.setContentType("text/html;charset=UTF-8");
            out.print(request.getAttribute("message"));
        }
    %>
</font>
<br>
<a href="login.jsp">重新登录</a>
</body>
</html>

6.4 登录成功页面

<%@ page import="org.javatop.case01.domain.User" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/11/28
  Time: 21:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html lang="en">
<head>
    <title>登录成功</title>
</head>
<body>
<h1>登录成功!</h1>
<br>
<font color="red">
    <%
        User user = (User)request.getAttribute("user");
        String username = user.getUsername();
    %>
    欢迎您:
    <%
        out.print(username);
    %>
</font>

</body>
</html>

6.5 注册成功页面

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/11/28
  Time: 21:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>ccccccccccccccccc
    <title>注册成功</title>
</head>
<body>
<h1>注册成功!</h1>
<br>
<a href="login.jsp">跳转登录</a>
<a href="register.jsp">继续注册</a>
</body>

7.总结

本篇教程内容比较长,适合初学者学习,但是也需要有一点基础,比如环境的配置,但如果你稍微有点基础,操作一下这篇文章是非常不错的,特别是代码。

8.最后总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

公众号封面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/210911.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows11 hosts文件没权限修改

1 win➕R 2 输入 cmd 3 同时按三个键 ctrl➕shift➕enter打开管理员权限 4 输入notepad回车,在记事本里直接点击文件-打开&#xff0c;选择路径:C:\Windows\System32\drivers\etc&#xff0c;继续选择所有文件&#xff0c;然后打开hosts文件 5 修改完之后&#xff0c;c…

科研学习|论文解读——Open government research over a decade: A systematic review

Open government research over a decade: A systematic review 十年来的开放政府研究&#xff1a;一个系统性综述 摘要 在过去十年中&#xff0c;对开放政府的学术研究蓬勃发展。然而&#xff0c;对开放政府的全面审查是有限的。这一研究空白不仅阻碍了我们对开放政府整体知…

【C语言:数据在内存中的存储】

文章目录 1.整数在内存中的存储1.1整数在内存中的存储1.2整型提升 2.大小端字节序2.1什么是大小端2.2为什么有大小端之分 3.整数在内存中的存储相关题目题目一题目二题目三题目四题目五题目六题目七 4.浮点数在内存中的存储4.1浮点数存的过程4.2浮点数取得过程 在这之前呢&…

深度学习之基于yolov3学生课堂行为及专注力检测预警监督系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习技术在学生课堂行为及专注力检测预警监督系统的应用是一项极具挑战性和创新性的研究领域。利用YOLOv3&…

C++解析xml示例

C解析xml示例 1. Xml文档介绍1.1 特点及作用1.2 Xml优点1.2.1 良好的可拓展性1.2.2 内容与形式分离 1.3 Xml组成1.3.1 Xml声明1.3.2 根元素1.3.3 元素1.3.4 属性1.3.5 实体1.3.6 注释 2 C解析Xml2.1 tinyXml2类库2.2 关键接口2.2.1 LoadFile2.2.2 RootElement2.2.3 FirstChildE…

计算机网络扫盲(2)——网络边缘

一、概述 在计算机网络得到术语中&#xff0c;我们把与因特网相连的计算机或其他设备称为端系统&#xff08;或者主机&#xff09;&#xff0c;如下图所示&#xff0c;因为它们位于因特网的边缘&#xff0c;所以被称为端系统。因特网的端系统包括了桌面计算机&#xff…

Linux的权限(一)

目录 权限的本质 Linux权限的概念 如何创建与删除普通用户 创建普通用户&#xff1a; 设置用户密码&#xff1a; 删除普通用户&#xff1a; 删除与该用户关联的主目录和邮件目录 &#xff1a; su指令 sudo指令 Linux权限管理 Linux中文件访问者有三种“人” Linux…

HashMap源码全面解析

注&#xff1a;本篇文章是在JDK1.8版本源码进行分析。 一、概述 HashMap 是基于哈希表的 Map接口的实现&#xff0c;是以 key-value 存储形式存在&#xff0c;即主要用来存储键值对。 HashMap的类图&#xff1a; HashMap继承抽象类AbstractMap&#xff0c;实现了Map、Clonea…

深度学习:什么是知识蒸馏(Knowledge Distillation)

1 概况 1.1 定义 知识蒸馏&#xff08;Knowledge Distillation&#xff09;是一种深度学习技术&#xff0c;旨在将一个复杂模型&#xff08;通常称为“教师模型”&#xff09;的知识转移到一个更简单、更小的模型&#xff08;称为“学生模型”&#xff09;中。这一技术由Hint…

基于SpringBoot蜗牛兼职网的设计与实现

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;蜗牛兼职网当然也不能排除在外。蜗牛兼职网是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c…

面试就是这么简单,offer拿到手软(一)—— 常见非技术问题回答思路

面试系列&#xff1a; 面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 文章目录 一、前言二、常见面试问题回答思路问…

算法通关村第四关—栈的经典算法问题(白银)

emsp;emsp;栈的经典算法问题 一、括号匹配问题 emsp;首先看题目要求&#xff0c;LeetCode20.给定一个只包括’(‘&#xff0c;)’&#xff0c;‘{&#xff0c;’&#xff0c;[&#xff0c;]的字符串s&#xff0c;,判断字符串是否有效。有效字符串需满足&#xff1a; 1.左括号…

python绘制箱线图boxplot——用于多组数据的比较, 异常值检测

python绘制箱线图boxplot——用于多组数据的比较, 异常值检测 介绍箱线图方法简介箱线图适用范围seaborn.boxplot箱图外观设置异常值marker形状、填充色、轮廓设置完整代码 如下matplotlib.pyplot常见参数介绍 本文系统详解利用python中seaborn.boxplot绘制箱图boxplot。seab…

Linux系统安装Docker-根据官方教程教程(以Ubuntu为例)

Linux系统安装Docker-根据官方教程教程&#xff08;以Ubuntu为例&#xff09; 1. 背景介绍2. 环境配置2.1 软件环境要求2.2 软件下载2.3 文档地址2.3 必备命令工具下载 3. 安装Docker3.1 使用root用户操作后续命令3.2 卸载可能存在的旧版本 4. 安装Docker4.1 更新依赖包4.2 配置…

npm ERR! notarget No matching version found for @eslint/eslintrc@^2.1.4.

文章目录 Intro解决流程总结前置信息了解npm 镜像源三个要用到的npm命令 官方源确认查看当前镜像源的详情解决&#xff1a; 切换镜像源后重试重新操作 事后感受 Intro 事由是今天我在用 create-react-app 新建一个用于测试的前端项目。 然后就出现以下报错&#xff1a; wuyuj…

RHCSA学习笔记(RHEL8) - Part2.RH134

Chapter Ⅰ 提高命令行生产率 SHELL脚本 #/bin/bash声明使用的shell翻译器 for循环 for VAR in LIST doCOMMAND1COMMAND2 done实验1&#xff1a;显示host1-5 #! /bin/bash for host in host{1..5} doecho $host done实验2&#xff1a;显示包含kernel的软件包安装时间 #! /…

【鸿蒙应用ArkTS开发系列】-自定义底部菜单列表弹窗

文章目录 前言创建Demo工程创建dialog 文件夹创建ListMenu 接口创建自定义弹窗 ListMenuDialog使用自定义弹窗 打包测试效果演示默认效果菜单带图标效果设置文本颜色效果不同文本颜色效果无标题效果 前言 上一篇文章中我们实现了选择图片、选择文件、拍照的功能 。 链接在这里…

【网络协议】聊聊网络ReadTimeout和ConnectTimeout

在实际的开发中&#xff0c;网络超时是一个比较常见的问题&#xff0c;比如说针对支付系统&#xff0c;超时就需要进行和三方人员进行核对订单状态&#xff0c;是否人工介入处理。 但其实在设计网络框架的时候&#xff0c;一般都有两个超时参数 连接超时参数 ConnectTimeout&am…

阻抗匹配电阻原理及其应用

一、匹配电阻的作用 1、阻抗匹配 当信号频率比较高&#xff0c;上升沿比较陡时&#xff0c;电子信号经过阻抗不同的地方时也会产设反射。 PCB的单线阻抗一般会设计成50Ω&#xff0c;发射端阻抗一般是17到40&#xff0c;而接收端一般是MOS管的输入&#xff0c;阻抗是比较大的…

Python 高性能 web 框架 - FastApi 全面指南

原文&#xff1a;Python 高性能 web 框架 - FastApi 全面指南 - 知乎 一、简介 FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Python 3.6 并基于标准的 Python 类型提示。 它具有如下这些优点&#xff1a; 快速&…