使用JSP+Servlet+MySQL实现登录注册功能【详细代码】

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。
1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员…
2、这几年,我整理了很多IT技术相关的教程给大家,爱生活、爱分享。
3、如果您觉得文章有用,请收藏,转发,评论,并关注我,谢谢!
博客导航跳转(请收藏):邵奈一的技术博客导航
| 公众号 | 微信 | CSDN | 掘金 | 51CTO | 简书 | 微博 |


0x00 教程内容

  1. 准备数据库表
  2. 初始化工程
  3. 编写后端代码
  4. 编写前端代码

0x01 准备数据库表

1. 创建数据库并创建表

自行创建一个数据库,然后创建一张user表:

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
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',
  `role` int(10) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

role字段说明:
0:管理员
1:普通用户
默认注册的时候,是只能注册成普通用户。

2. 插入三条数据
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'lisa', '123123', '0');
INSERT INTO `user` VALUES ('2', 'tony', '123123', '1');
INSERT INTO `user` VALUES ('3', 'tom', '123123', '1');

0x02 初始化工程

1. 新建一个JavaWeb项目

(1)添加自己的 Tomcat 进来,选择 Web Application ,同时,如果没有选择创建 web.xml 文件的话,记得勾选一下:
在这里插入图片描述

2. 初始化工程目录

(1)在WEB-INF文件夹下,创建一个lib文件夹,将MySQL驱动复制进入:
在这里插入图片描述
(2)设置MySQL驱动为需要加载的驱动:
在这里插入图片描述

3. 新建好包结构

(1)我的包结构如下,直接在 src 文件夹里创建即可:

└─com
    └─java
        ├─dao
        │  └─impl
        ├─domain
        ├─servlet
        └─utils

0x03 编写后端代码

1. 代码及项目结构总览

在这里插入图片描述

2. 编写实体类
package com.java.domain;

import java.util.Objects;

/**
 * @Author shaonaiyi@163.com
 * @Date 2022/3/6 11:03
 * @Description 用户实体类
 */
public class User {

    // 用户id
    private int id;
    // 用户名
    private String username;
    // 密码
    private String password;
    // 用户角色(0:管理员;1:普通用户)
    private int role;

    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;
    }

    public int getRole() {
        return role;
    }

    public void setRole(int role) {
        this.role = role;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
                role == user.role &&
                Objects.equals(username, user.username) &&
                Objects.equals(password, user.password);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, username, password, role);
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", role=" + role +
                '}';
    }
}
3. 编写Dao层接口
package com.java.dao;

import com.java.domain.User;

/**
 * @Author shaonaiyi@163.com
 * @Date 2022/3/6 14:32
 * @Description 用户dao层接口
 */
public interface UserDao {

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

    // 注册
    Boolean register(User user);

}
4. 编写数据库连接工具类
package com.java.utils;
import java.sql.*;
/**
 * @Author shaonaiyi@163.com
 * @Date 2022/3/6 12:40
 * @Description 数据库连接工具类
 */
public class JdbcUtil {

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

        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaweb","root", "123456");

        return connection;

    }

    /**
     * 2、释放资源
     * @param resultSet
     * @param statement
     * @param 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();
            }
        }
    }

//    public static void main(String[] args) throws Exception {
//        Connection connection = JdbcUtil.getConnection();
//        System.out.println(connection);
//    }

}
5. 编写Dao层接口实现类
package com.java.dao.impl;

import com.java.dao.UserDao;
import com.java.domain.User;
import com.java.utils.JdbcUtil;

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

/**
 * @Author shaonaiyi@163.com
 * @Date 2022/3/6 14:32
 * @Description 用户dao层实现类
 */
public class UserDaoImpl implements UserDao {

    /**
     * 登录
     * @param username 用户名
     * @param password 密码
     * @return 用户对象
     */
    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.setRole(resultSet.getInt("role"));
                System.out.println("登录成功" + user.toString());
            } else {
                System.out.println("用户名或者密码错误");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.release(resultSet, preparedStatement, connection);
        }
        return user;
    }

    /**
     * 注册
     * @param user 用户对象
     */
    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;
    }
}
6. 修改web.xml文件

(1)设置欢迎首页

    <!--设置启动首页为login.jsp-->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

(2)设置登陆和注册Servlet

    <!--设置servlet-->
    <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>com.java.servlet.LoginServlet</servlet-class>
    </servlet>
    <!--设置servlet的url-->
    <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    <!--设置servlet-->
    <servlet>
        <servlet-name>registerServlet</servlet-name>
        <servlet-class>com.java.servlet.RegisterServlet</servlet-class>
    </servlet>
    <!--设置servlet的url-->
    <servlet-mapping>
        <servlet-name>registerServlet</servlet-name>
        <url-pattern>/register</url-pattern>
    </servlet-mapping>
7. 编写LoginServlet代码
package com.java.servlet;

import com.java.dao.UserDao;
import com.java.dao.impl.UserDaoImpl;
import com.java.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 shaonaiyi@163.com
 * @Date 2022/3/6 12:40
 * @Description 登录Servlet
 */
@WebServlet(name = "/login")
public class LoginServlet extends HttpServlet {

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

    @Override
    protected void doPost(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");
        String role = req.getParameter("role");

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

        // 如果根据用户名和密码能查得到值
        if (user != null) {
            int roleDb = user.getRole();
            // 权限的选择跟数据库不匹配时,且不是管理员用户时,返回无权限
            if (roleDb != Integer.parseInt(role) && roleDb != 0) {
                req.setAttribute("message", "无权限登录");
                req.getRequestDispatcher("/defeat.jsp").forward(req,resp);
            } else {
                req.setAttribute("user", user);
                req.getRequestDispatcher("/success.jsp").forward(req,resp);
            }
        } else {    // 用户名或者密码错误执行以下代码
            req.setAttribute("message", "用户名或者密码错误");
            req.getRequestDispatcher("/defeat.jsp").forward(req,resp);
        }

    }
}
8. 编写RegisterServlet代码
package com.java.servlet;

import com.java.dao.UserDao;
import com.java.dao.impl.UserDaoImpl;
import com.java.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 shaonaiyi@163.com
 * @Date 2022/3/6 16:38
 * @Description 注册servlet
 */
@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");

        // id不需要传进来,角色默认注册是普通用户,无法注册管理员
        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);
        }

    }
}

至此,后端代码已经编写好了,还需要完成前端页面代码。

0x04 编写前端代码

1. 编写login.jsp代码
<%--
  Created by IntelliJ IDEA.
  User: shaonaiyi
  Date: 2022/3/6
  Time: 14:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录界面</title>
    <style type="text/css">
        body{
            background-position: center;
            background-repeat: no-repeat;
        }
    </style>
</head>
<body>
<div style="text-align:center;margin-top:120px">
    <h2>登录页面</h2>
    <form action="/login" method="post">
        <table style="margin-left:40%">
            <tr>
                <td>用户名:</td>
                <td><input type="text" size="21" name="username"/></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="text" size="21" name="password"/></td>
            </tr>
            <tr>
                <td>角色:</td>
                <td>
                    <input type="radio" name="role" value="0" checked="checked">管理员
                    <input type="radio" name="role" value="1">普通用户
                </td>
            </tr>
        </table>
        <input type="submit" value="登录"/>
        <input type="reset" value="重置"/>
    </form>
    <a href="register.jsp">跳转注册</a>
</div>
</body>
</html>
2. 编写success.jsp代码
<%@ page import="com.java.domain.User" %><%--
  Created by IntelliJ IDEA.
  User: shaonaiyi
  Date: 2022/3/6
  Time: 14:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<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>
3. 编写defeat.jsp代码
<%--
  Created by IntelliJ IDEA.
  User: shaonaiyi
  Date: 2022/3/6
  Time: 14:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录失败</title>
</head>
<body>
<h1>登录失败!</h1>
<font color="red">
    <%
        if(request.getAttribute("message")!= null){
            out.print(request.getAttribute("message"));
        }
    %>
</font>
<br>
<a href="login.jsp">重新登录</a>
</body>
</html>
4. 编写register.jsp代码
<%--
  Created by IntelliJ IDEA.
  User: shaonaiyi
  Date: 2022/3/6
  Time: 16:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册界面</title>
    <style type="text/css">
        body{
            background-repeat: no-repeat;
            background-position: center;
        }

    </style>
</head>
<body>
<div style="text-align:center;margin-top: 120px">
    <form action="/register" method="post">
        <table style="margin-left:40%">
            <h2>用户注册</h2>
            <tr>
                <td>用户名:</td>
                <td><input name="username" type="text" size="21"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input name="password" type="password" size="21"></td>
            </tr>
        </table>
        <input type="submit" value="注册">
        <input type="reset" value="重置">
    </form>
    <a href="login.jsp">跳转登录</a>
    </form>
</div>

</body>
</html>
5. 编写register-success.jsp代码
<%@ page import="com.java.domain.User" %><%--
  Created by IntelliJ IDEA.
  User: shaonaiyi
  Date: 2022/3/6
  Time: 14:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册成功</title>
</head>
<body>
<h1>注册成功!</h1>
<br>
<a href="login.jsp">跳转登录</a>
<a href="register.jsp">继续注册</a>
</body>
</html>

0xFF 总结

  1. 本篇教程内容比较长,适合初学者学习,但是也需要有一点基础,比如环境的配置,但如果你稍微有点基础,操作一下这篇文章是非常不错的,特别是代码。
  2. 关于JavaWeb其他文章参考:
    JavaWeb项目如何配置Servlet
    使用Eclipse打开IDEA写的JavaWeb项目【全网唯一教程】

邵奈一 原创不易,如转载请标明出处,教育是一生的事业。


  • 16
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值