JSP简单实现用户登录与注册功能

尚寂新
2022/11/13 18:45

本教程使用 IDEA Ultimate 实现,社区版需要其他方式的设置

创建项目

简要介绍。创建 JAVA EE 项目,选择 WEB 服务,将下载到的 Tomcat 的路径添加 Tomcat 服务器列表中,然后点击下一步,选择 Java EE 8。

IDEA新建项目
IDEA新建项目

添加 MySQL JDBC 驱动

点文件->项目结构->库,然后将 MySQL 驱动的 jar 包(mysql-connector-java-8.0.30.jar)添加进这个库里,来提供依赖,即可

mysql-connector-java.jar
mysql-connector-java.jar

本人分享的给 Java 项目用的 Connector 链接如下,提取码:np93
https://www.aliyundrive.com/s/m29bTBK612E

如果用此种方式补依赖,建议放在src/main/webapp/WEB-INF/libs/这个文件夹内。如果没有,可以在WEB-INF这个目录里面新建。

通过同样的方法,补齐jsp-api.jarservlet-api.jar这两个 jar 包,可以解决out.print()方法在编辑器内报错的问题。这两个文件位于 Tomcat 目录的 lib 文件夹内。如果要操作这个,一定不要误操作为移动/剪切。直接引用(挪到别的机器上症状会复发)或者是复制过来(复制没啥后遗症)即可。也可以任凭out.print()方法报错,不会影响实际的编译运行。

PS:拿 Maven 来补这个库应该也行,但没有尝试过,感兴趣的可以尝试一下

数据库建立相关

登录

假定输入页面为login.jsp,后端验证页面为login-auth.jsp,下面为login.jsp页面内至少应该有的内容,写在<body>标签内

<form method="post" action="./login-auth.jsp">
    <input type="text" placeholder="用户名" name="name" required>
    <input type="password" placeholder="密码" name="password" required>

    <button type="submit">登录</button>
</form>

login-auth.jsp的代码如下

<%@
        page import="java.util.*" import="java.sql.*" import="java.security.MessageDigest" language="java" pageEncoding="UTF-8"
%>
<%
    String url = "jdbc:mysql://服务器地址:3306/数据库名?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC";
    String username = "数据库用户名";
    String password= "数据库密码";

  String uname = request.getParameter("name");
  String upassword = request.getParameter("password");
  try {
    Class.forName("com.mysql.cj.jdbc.Driver");
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }

  try {
    Connection conn = DriverManager.getConnection(url, username, password);
    Statement stat = conn.createStatement();
    String sql = "select * from `mall_users` where `name` = ?";

    PreparedStatement preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setString(1,uname);

    ResultSet rs = preparedStatement.executeQuery();

    if (rs.next()) {
        if (upassword.equals(rs.getString("password"))) {
            out.print("登录成功");
            session.setAttribute("loginUser", uname); // 设置session保存登录状态
        } else {
            out.print("登录失败,密码错误");
        }
    } else {
        out.print("登录失败,用户不存在");
    }

    stat.close();
    conn.close();
  } catch (SQLException e) {
    e.printStackTrace();
    out.print("数据库连接错误");
  }
%>

注册

假定输入页面为register.jsp,后端验证页面为register.jsp,下面为register.jsp页面内至少应该有的内容,写在<body>标签内

<form method="post" action="./register-auth.jsp">
    <input type="text" placeholder="用户名" name="name" required>
    <input type="password" placeholder="密码" name="password" required>

    <button type="submit">注册</button>
</form>

register-auth.jsp的代码如下

<%@
        page import="java.util.*" import="java.sql.*" language="java" pageEncoding="UTF-8"
%>
<%
    String url = "jdbc:mysql://服务器地址:3306/数据库名?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC";
    String username = "数据库用户名";
    String password= "数据库密码";
boolean Rigisterable = false;
  String uname = request.getParameter("name");
  String upassword = request.getParameter("password");
  try {
    Class.forName("com.mysql.cj.jdbc.Driver");
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }

  try {
    Connection conn = DriverManager.getConnection(url, username, password);
    Statement stat = conn.createStatement();
    String sql = "select * from `mall_users` where `name` = ?";

    PreparedStatement preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setString(1,uname);

    ResultSet rs = preparedStatement.executeQuery();

    if (rs.next()) {
        out.print("注册失败,用户已存在");
    } else {
        Rigisterable = true;
    }
    preparedStatement.close();
    stat.close();
    conn.close();
  } catch (SQLException e) {
    e.printStackTrace();
    out.print("注册失败,用户存在性校验错误");
  }

  if (Rigisterable == true) {
      try{
        Connection conn2 = DriverManager.getConnection(url, username, password);
        Statement stat2 = conn2.createStatement();

        String sql2 = "insert into mall_users(name, password) values(?, ?)";
        PreparedStatement ps2 = conn2.prepareStatement(sql2);
        ps2.setString(1, uname);
        ps2.setString(2, upassword);
        ps2.executeUpdate();

        out.print("注册成功");

        ps2.close();
        stat2.close();
        conn2.close();
    } catch (SQLException e) {
        e.printStackTrace();
        out.print("注册失败,写表失败");
    }

  }
%>

备注:这里写的稍微有点屎山,但能跑。本文写作目的是为了帮助自班同学完成学校任务而写,但可以完成基本功能

不要问我为啥要明文存储密码。其实这里面我写了个用MD5存储的,为了减少学习的复杂性,便将其删除。

数据库表设计

数据库库名自己定义,表名代码中提供的为mall_user,这个也是可以自行更改的,包括表结构也可以更改,不过要同时修改查询语句

数据字典
数据字典

至少要存在这三个字段,因 InnoDB 要求必须要有主键,故 uid 必须要。

数据库管理指北

可以使用 NaviCat 或者是类似的软件进行建表连接

已有 0 条评论 (旧评论在前)
  1. 暂无评论 / 0 Comment
添加新评论 (Markdown Supported)
(ノ°ο°)ノ
未验证,请点击此处跳转到 Github 进行游客身份验证。