JavaEE 实现 登录+注册(采用注解方式链接数据库)

(Spring MVC的Controller练习)

工具:Tomcat 10.0.23,MySQL,JDK18

一、运行效果展示

点击运行Tomcat首先进入index.jsp页面

若已有账号点击登录即可进行登录,这里先点击“获取ROY6账号”去注册,进入register.jsp页面

注册成功后跳转到success.jsp页面,此时数据库中user表会增加一条用户信息

点击“前往探索ROY6商城此时,此时为login.jsp页面

输入已经注册过的账号,登录,进入welcome.jsp页面

这里我简单的写了两个小功能,就不进行展示了,本文主要展示登录注册功能。

下面进入详细操作步骤,请慢慢食用代码!

二、项目代码

先查看项目结构图:

红色框出部分为本次实验用到代码

 

1、建立数据库,建表

首先创建数据库spring_db,然后建立所需要的用户表user

CREATE DATABASE IF NOT EXISTS spring_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

USE spring_db;

CREATE TABLE user (
                      id INT AUTO_INCREMENT PRIMARY KEY,
                      username VARCHAR(50) NOT NULL UNIQUE,
                      password VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 2、创建第一个index.jsp页面

页面主要包含注册以及登陆,很简单,直接放代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>欢迎</title>
    <style>
        /* 页面背景 */
        body {
            font-family: 'Arial', sans-serif;
            margin: 0;
            padding: 0;
            background: url('https://wx3.sinaimg.cn/mw690/007doFNOgy1hf8lzl0rs2j323u16q7wh.jpg') no-repeat center center fixed;
            background-size: cover;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            overflow: hidden;
            animation: backgroundAnimation 10s infinite alternate;
        }

        /* 页面内容容器 */
        .container {
            text-align: center;
            background-color: white;
            padding: 40px;
            border-radius: 12px;
            box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); /* 阴影效果 */
            background-color: rgba(255, 255, 255, 0.95); /* 背景半透明 */
            width: 100%;
            max-width: 500px;
        }

        /* 标题样式 */
        h3 {
            font-family: 'Comic Sans MS', cursive, sans-serif; /* 卡通风格字体 */
            font-size: 28px;
            color: #00BFFF; /* 天青色 */
            margin-bottom: 20px;
        }

        /* 链接列表样式 */
        ul {
            list-style-type: none;
            padding: 0;
        }

        li {
            margin: 15px 0;
        }

        /* 链接按钮样式 */
        a {
            text-decoration: none;
            padding: 12px 25px;
            background-color: #607d8b; /* 莫兰迪蓝绿色 */
            color: white;
            font-size: 18px;
            border-radius: 10px;
            display: inline-block;
            transition: background-color 0.3s ease, transform 0.2s ease;
        }

        a:hover {
            background-color: #78909c;
            transform: translateY(-2px);
        }

        a:active {
            background-color: #546e7a;
            transform: translateY(0);
        }

        /* 响应式设计 */
        @media (max-width: 480px) {
            .container {
                padding: 20px;
                width: 90%;
            }

            h3 {
                font-size: 24px;
            }

            a {
                font-size: 16px;
                padding: 10px 20px;
            }
        }
    </style>
</head>
<body>

<div class="container">
    <h3>${username} 欢迎你的探索!</h3>
    <ul>
        <li><a href="index/login">登录</a></li>
        <li><a href="index/register">获取ROY6账号</a></li>
    </ul>
</div>

</body>
</html>

 3、注册页面 register.jsp页面

由index.jsp页面点击注册按钮跳转而来,主要实现注册功能。这里连接数据库,判断用户的合法性。注册成功跳转success.jsp页面,失败跳转到error.jsp页面,已经注册过则继续停留在此页面,提示“注册失败,用户名已存在“。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            margin: 0;
            padding: 0;
            background: url('https://wx4.sinaimg.cn/mw690/007btvx7ly1h7zumoa5l8j30u01mtgru.jpg') no-repeat center center fixed;
            background-size: cover;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            overflow: hidden;
            animation: backgroundAnimation 10s infinite alternate;
        }

        .container {
            width: 100%;
            max-width: 400px;
            background-color: #ffffff;
            padding: 30px;
            border-radius: 12px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
            animation: fadeIn 0.8s ease-in-out;
        }

        @keyframes fadeIn {
            from {
                opacity: 0;
                transform: translateY(-20px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        h2 {
            font-size: 28px;
            color: #7a7975; /* 莫兰迪灰色 */
            margin-bottom: 20px;
            text-align: center;
            font-family: 'Comic Sans MS', cursive;
        }

        .form-group {
            margin-bottom: 20px;
        }

        .form-group label {
            font-size: 16px;
            color: #8A9A8E; /* 深莫兰迪灰褐色 */
            margin-bottom: 5px;
            display: block;
            text-align: left;
        }

        .form-group input {
            width: 100%;
            padding: 12px;
            font-size: 16px;
            border: 1px solid #ddd;
            border-radius: 8px;
            box-sizing: border-box;
            outline: none;
            transition: all 0.3s ease;
        }

        .form-group input:focus {
            border-color: #a6a398; /* 莫兰迪绿灰色 */
            box-shadow: 0 0 10px rgba(166, 163, 152, 0.3);
        }

        .form-group p {
            color: #c94e50; /* 柔和的莫兰迪红色 */
            font-size: 14px;
        }

        .button-container {
            display: flex;
            gap: 10px;
            justify-content: space-between;
        }

        .button-container button {
            width: 48%;
            padding: 12px;
            font-size: 16px;
            border-radius: 8px;
            border: none;
            cursor: pointer;
            transition: all 0.3s ease;
        }

        .reset-button {
            background-color: #d7d3cc; /* 莫兰迪浅灰色 */
            color: #4f4d49; /* 深莫兰迪灰 */
        }

        .reset-button:hover {
            background-color: #c8c4bb; /* 更深的莫兰迪灰 */
        }

        .submit-button {
            background-color: #A8B3A5; /* 莫兰迪绿灰色 */
            color: #ffffff;
        }

        .submit-button:hover {
            background-color: #8f8c80; /* 更深的莫兰迪绿灰色 */
        }

        @media (max-width: 480px) {
            .container {
                padding: 20px;
            }

            h2 {
                font-size: 24px;
            }

            .form-group label {
                font-size: 14px;
            }

            .form-group input {
                font-size: 14px;
                padding: 10px;
            }

            .button-container button {
                font-size: 14px;
                padding: 10px;
            }
        }
    </style>
</head>
<body>
<div class="container">
    <h2>注册</h2>
    <%
        String error = (String) request.getAttribute("error");
        if (error != null) {
    %>
    <div class="form-group">
        <p><%= error %></p>
    </div>
    <%
        }
    %>
    <form action="${pageContext.request.contextPath}/doRegister" method="post">
        <div class="form-group">
            <label for="registerUsername">用户名</label>
            <input type="text" id="registerUsername" name="username" required>
        </div>
        <div class="form-group">
            <label for="password">密码</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div class="form-group">
            <label for="confirmPassword">确认密码</label>
            <input type="password" id="confirmPassword" name="confirmPassword" required>
        </div>
        <div class="button-container">
            <button type="reset" class="reset-button">重置</button>
            <button type="submit" class="submit-button">注册</button>
        </div>
    </form>
</div>
</body>
</html>

 4、注册成功success.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册成功</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            margin: 0;
            padding: 0;
            background: url('https://wx2.sinaimg.cn/mw690/006Gi90nly1h6p18g6sipj31h40u0791.jpg') no-repeat center center fixed;
            background-size: cover;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            overflow: hidden;
            animation: backgroundAnimation 10s infinite alternate;
        }

        .container {
            background-color: white;
            padding: 40px;
            background-color: rgba(255, 255, 255, 0.95); /* 背景半透明 */
            border-radius: 16px;
            box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); /* 阴影效果 */
            width: 100%;
            max-width: 420px;
            text-align: center;
        }

        h1 {
            font-family: 'Comic Sans MS', cursive, sans-serif; /* 可爱的卡通字体 */
            font-size: 36px;
            color: #c58e72;
            margin-bottom: 20px;
            font-weight: 600;
        }

        p {
            font-size: 18px;
            color: #333;
            margin-bottom: 30px;
        }

        a {
            display: inline-block;
            font-size: 18px;
            color: white;
            background-color: #607d8b; /* Morandi blue */
            padding: 12px 24px;
            text-decoration: none;
            border-radius: 10px;
            transition: background-color 0.3s ease, transform 0.2s ease;
        }

        a:hover {
            background-color: #78909c;
            transform: translateY(-2px);
        }

        a:active {
            background-color: #546e7a;
            transform: translateY(1px);
        }
    </style>
</head>
<body>

<div class="container">
    <h1>注册成功</h1>
    <p>欢迎,您已成为ROY6新成员!</p>
    <a href="${pageContext.request.contextPath}/login">前往探索ROY6商城</a>
</div>

</body>
</html>

5、注册失败error.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册失败</title>
    <style>
        /* 设置背景色 */
        body {
            font-family: Arial, sans-serif;
            background-color: #f8d7da; /* 轻微红色背景,表示失败 */
            margin: 0;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .container {
            text-align: center;
            background-color: white;
            padding: 30px 50px;
            border-radius: 10px;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
            width: 100%;
            max-width: 400px;
        }

        h1 {
            font-size: 24px;
            color: #721c24; /* 错误提示的红色 */
            margin-bottom: 20px;
        }

        p {
            font-size: 18px;
            color: #721c24;
            margin-bottom: 30px;
        }

        a {
            text-decoration: none;
            padding: 12px 20px;
            background-color: #4CAF50;
            color: white;
            font-size: 16px;
            font-weight: bold;
            border-radius: 6px;
            display: inline-block;
            transition: background-color 0.3s ease, transform 0.2s ease;
        }

        a:hover {
            background-color: #45a049;
            transform: translateY(-2px);
        }

        a:active {
            transform: translateY(0);
        }
    </style>
</head>
<body>

<div class="container">
    <h1>注册失败</h1>
    <p>抱歉,您的注册未能成功。请重试</p>
    <a href="${pageContext.request.contextPath}/register">返回注册页面</a>
</div>
</body>
</html>

6、登录login.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录</title>
    <style>

        /* 页面基础样式 */
        body {
            font-family: 'Arial', sans-serif;
            margin: 0;
            padding: 0;
            background: url('https://wx4.sinaimg.cn/mw690/007btvx7ly1h7zumt0ty2j31hc0u0wkx.jpg') no-repeat center center fixed;
            background-size: cover;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            overflow: hidden;
            animation: backgroundAnimation 10s infinite alternate;
        }

        .container {
            width: 100%;
            max-width: 400px;
            padding: 40px;
            background-color: rgba(255, 255, 255, 0.95); /* 背景半透明 */
            border-radius: 12px;
            box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); /* 阴影效果 */
            text-align: center;
            animation: fadeIn 1s ease-in-out;
        }

        /* 标题样式:使用莫兰迪色系 */
        h2 {
            font-size: 30px;
            color: #A8B3A5; /* 莫兰迪绿 */
            font-weight: 600;
            margin-bottom: 30px;
            letter-spacing: 1px;
            font-family: 'Georgia', serif;
        }

        /* 表单样式 */
        form {
            display: flex;
            flex-direction: column;
            gap: 20px;
        }

        .form-group {
            display: flex;
            flex-direction: column;
            align-items: flex-start;
        }

        .form-group label {
            margin-bottom: 8px;
            font-weight: bold;
            color: #6D7D6E; /* 莫兰迪灰绿 */
        }

        .form-group input {
            width: 100%;
            padding: 12px;
            border: 1px solid #ddd;
            border-radius: 8px;
            font-size: 16px;
            transition: border-color 0.3s ease, box-shadow 0.3s ease;
        }

        /* 输入框聚焦效果 */
        .form-group input:focus {
            border-color: #A8B3A5; /* 莫兰迪绿 */
            outline: none;
            box-shadow: 0 0 8px rgba(169, 179, 165, 0.6);
        }

        /* 按钮样式 */
        .form-group button {
            padding: 12px 20px;
            border: none;
            border-radius: 6px;
            background-color: #A8B3A5; /* 莫兰迪绿 */
            color: white;
            font-size: 16px;
            font-weight: bold;
            cursor: pointer;
            transition: background-color 0.3s ease, transform 0.2s ease;
        }

        .form-group button:hover {
            background-color: #8A9A8E; /* 更深的莫兰迪绿 */
            transform: translateY(-3px);
        }

        .form-group button:active {
            transform: translateY(0);
        }

        /* 提交按钮 */
        .submit-button {
            background-color: #A8B3A5;
        }

        .submit-button:hover {
            background-color: #8A9A8E;
        }

        /* 动画效果 */
        @keyframes fadeIn {
            from {
                opacity: 0;
                transform: translateY(-20px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        /* 响应式设计 */
        @media (max-width: 480px) {
            .container {
                padding: 20px;
            }

            .form-group input {
                padding: 10px;
            }

            .form-group button {
                padding: 12px 16px;
            }

            h2 {
                font-size: 26px;
            }
        }
    </style>
</head>
<body>

<div class="container">
    <h2>登录</h2>
    <form action="${pageContext.request.contextPath}/doLogin" method="post">
        <div class="form-group">
            <label for="username">用户名</label>
            <input type="text" id="username" name="username" required>
        </div>
        <div class="form-group">
            <label for="password">密码</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div class="form-group">
            <button type="submit" class="submit-button">登录</button>
        </div>
    </form>
</div>

</body>
</html>

7、欢迎welcome.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>欢迎来到ROY6商城</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            margin: 0;
            padding: 0;
            background: url('https://wx4.sinaimg.cn/mw690/007doFNOgy1hf8lzljzodj323u16qqv5.jpg') no-repeat center center fixed;
            background-size: cover;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            overflow: hidden;
        }

        .container {
            text-align: center;
            background-color: rgba(255, 255, 255, 0.9);
            padding: 30px 40px;
            border-radius: 15px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);
            width: 100%;
            max-width: 500px;
            animation: fadeIn 1s ease-in-out;
            position: relative;
            z-index: 1;
        }

        h1 {
            font-size: 30px;
            color: #444;
            margin-bottom: 20px;
            font-family: 'Comic Sans MS', cursive;
        }

        p {
            font-size: 18px;
            color: #666;
            margin-bottom: 20px;
        }

        a {
            display: inline-block;
            text-decoration: none;
            padding: 12px 25px;
            margin: 10px 0;
            background-color: #A8B3A5; /* 修改为莫兰迪绿色 */
            color: white;
            font-size: 16px;
            border-radius: 8px;
            transition: background-color 0.3s ease, transform 0.2s ease;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }

        a:hover {
            background-color: #8A9A8E; /* 悬停时更深的莫兰迪绿色 */
            transform: translateY(-3px);
        }

        a:active {
            transform: translateY(0);
        }

        @keyframes fadeIn {
            from {
                opacity: 0;
                transform: translateY(-20px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        /* 新增样式:绝对定位文本 */
        .text-overlay {
            position: absolute;
            top: 10%;
            left: 50%;
            transform: translateX(-50%);
            background-color: rgba(255, 255, 255, 0.7);
            padding: 20px;
            border-radius: 15px;
            text-align: center;
            font-size: 17px;
            color: #444;
            width: 80%;
            max-width: 600px;
            box-shadow: 0 8px 15px rgba(0, 0, 0, 0.3);
            animation: fadeIn 1s ease-in-out;
        }

        @media (max-width: 480px) {
            .container {
                padding: 20px;
                width: 90%;
            }

            h1 {
                font-size: 24px;
            }

            p {
                font-size: 16px;
            }

            a {
                font-size: 14px;
            }

            .text-overlay {
                font-size: 16px;
                width: 90%;
            }
        }
    </style>
</head>
<body>
<!-- 新增的文字容器 -->
<div class="text-overlay">
    ROY6住在一个未知的BAOBAO森林里,<br>
    它们喜欢音乐、舞蹈,还喜欢用自己被赋予的神秘力量,帮助地球上的人们。<br>
    如果你忽然感到幸福,不再孤单,那是因为ROY6来到了你身边!<br>
    在日常生活中,当你想要获得小小的幸运时,就请呼叫ROY6吧!
</div>

<div class="container">
    <h1>${username} 欢迎来到ROY6!</h1>
    <p>请选择您想进行的操作:</p>
    <a href="${pageContext.request.contextPath}/add">新增Roy6商品</a>
    <a href="${pageContext.request.contextPath}/list">查看Roy6商品</a>
</div>
</body>
</html>

8、相关配置

(1)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

(2)lib包

这里因为我用的是 Tomcat10.0.23 的版本,所以使用了6.0的 jar 包,大家使用对应自己的就行,或者采用Maven配置

(3)spring配置(applicationContext.xml)

创建配置文件applicationContext.xml,在该文件中配置id为dataSource的数据源Bean和id为jdbcTemplate的JDBC模板Bean,并将数据源注入到JDBC模板中。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- Enable Spring MVC components and default configuration -->
    <mvc:annotation-driven />

    <!-- Scan for components (controllers, services, repositories) in the specified package -->
    <context:component-scan base-package="com.example.demo" />
    <context:component-scan base-package="com.example.demo.controller"/>

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/views/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- DataSource configuration for connecting to MySQL database -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/spring_db?useUnicode=true characterEncoding=UTF-8 useSSL=false serverTimezone=UTC" />
        <property name="username" value="root" />
        <property name="password" value="这里写你的数据库密码" />
    </bean>

    <!-- JdbcTemplate bean for database operations -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="txManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
            <property name="transactionManager" ref="txManage"/>
    </bean>

    <bean id="resourceHttpRequestHandler" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler">
        <property name="locations">
            <list>
                <value>classpath:/static/</value>
            </list>
        </property>
    </bean>
</beans>

9、后端代码

(1)编写Controller层

创建IndexController类,用于实现首页跳转登录注册操作。

IndexController.java
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/index")
public class IndexController {
    @RequestMapping(value = "/login",method = RequestMethod.GET)
    public String login(){
        return "login";
    }
    @RequestMapping("/register")
    public String register(){
        return "register";
    }
}

创建IndexController类,用于实现用户登录注册操作。

UserController.java
package com.example.demo.controller;

import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;


@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/login")

    public String showLoginForm() {
        return "login";
    }

    @PostMapping("/doLogin")
    public ModelAndView login(@RequestParam("username") String username, @RequestParam("password") String password){
        ModelAndView modelAndView = new ModelAndView();
        String result = userService.Login(username,password);
        if("success".equals(result)){
            modelAndView.addObject("username",username);
            modelAndView.setViewName("welcome"); //设置视图为welcome.jsp
        }else{
            modelAndView.addObject("error",true);
            modelAndView.setViewName("login");

        }
        return modelAndView;
    }


    @GetMapping("/register")
    public String showRegisterForm(){
        return "register";
    }

    @PostMapping("/doRegister")
    public ModelAndView Register(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("confirmPassword") String confirmPassword) {
        ModelAndView modelAndView = new ModelAndView();
        if (!confirmPassword.equals(password)) {
            modelAndView.addObject("error", "两次密码不一致");
            modelAndView.setViewName("register");  // 返回注册页面
            return modelAndView;
        }
        try {
            userService.Register(username, password);
            modelAndView.setViewName("success"); // 注册成功后跳转到success.jsp页面
            modelAndView.addObject("username", username);
        } catch (IllegalArgumentException e) {
            modelAndView.addObject("error", "注册失败,用户名已存在");
            modelAndView.setViewName("register"); // 注册失败,仍然在注册页面
        }
        return modelAndView;
    }

}

(2)编写Dao层方法

创建UsersDAO接口,在UsersDAO接口中声明查询所有用户信息和更新的方法。

UsersDAO.java
package com.example.demo.dao;

import com.example.demo.model.Users;

import java.util.List;

public interface UsersDAO {
    public int update(String sql, Object[] params);
    public List<Users> query(String sql, Object[] params);
}

(3)实现Dao层方法

创建UsersDAOImpl实现类,在UsersDAOImpl类中实现UsersDAO接口中的 update() 和 query() 方法。

UsersDAOImpl.java
package com.example.demo.dao;

import com.example.demo.model.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class UsersDAOImpl implements UsersDAO {  // 加上 implements UsersDAO

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int update(String sql, Object[] params) {
        return jdbcTemplate.update(sql, params);
    }

    @Override
    public List<Users> query(String sql, Object[] params) {
        RowMapper<Users> rowMapper = new BeanPropertyRowMapper<>(Users.class);
        return jdbcTemplate.query(sql, rowMapper, params);
    }
}

(4)编写实体类

创建Users类,在该类中定义username、password属性,以及属性对应的getter/setter方法。

Users.java
package com.example.demo.model;

public class Users {
    private String username;
    private String password;

    public String getName() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

(5)编写服务层接口

创建UserService接口,在UserService接口中声明登录和注册的方法。

UserService.java
package com.example.demo.service;

public interface UserService {
    public String Login(String username, String password);

    public void Register(String username, String password);
}

(6)实现服务层方法

创建UserServiceImpl实现类,在UserServiceImpl类中实现UserService接口中的 Login() 和 Register() 方法。

UserServiceImpl.java
package com.example.demo.service;

import com.example.demo.dao.UsersDAO;
import com.example.demo.model.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UsersDAO usersDAO;

    @Override
    public String Login(String username, String password) {
        // 使用占位符避免SQL注入
        String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
        List<Users> users = usersDAO.query(sql, new Object[]{username, password});
        if (!users.isEmpty()) {
            return "success";
        }
        return "login?error=true";
    }

    @Override
    public void Register(String username, String password) {
        String checkUserSql = "SELECT * FROM user WHERE username = ?";
        List<Users> existingUsers = usersDAO.query(checkUserSql, new Object[]{username});
        if (!existingUsers.isEmpty()) {
            throw new IllegalArgumentException("Username already exists");
        }
        String insertUserSql = "INSERT INTO user (username, password) VALUES (?, ?)";
        usersDAO.update(insertUserSql, new Object[]{username, password});
    }
}

10、 查看运行结果

运行结果当然在上边就展示了哈哈哈,会遇到同样喜欢Roy6家族的友友嘛~嘻嘻~

哈哈,到这里就结束了~

码字不易,别忘记 点赞收藏哦!

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

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

相关文章

V-rep机器人仿真软件学习笔记

常用的机器人仿真软件有哪些&#xff1f;为什么选择V-rep&#xff1f; 目前常用的机器人物理仿真软件有Gazebo、V-rep、Webots等&#xff0c;这三款都是开源软件&#xff0c;自己使用过前两种&#xff0c;Gazebo配合ROS使用功能十分强大&#xff0c;但是要在Linux系统下使用&am…

数据库中的增删改查操作、聚合函数、内置函数、分组查询

数据库中的增删改查操作、聚合函数、内置函数、分组查询 CRUD简介Create 新增语法示例单⾏数据全列插⼊单⾏数据指定列插⼊多⾏数据指定列插⼊ Retrieve 检索语法⽰例构造数据 Select全列查询指定列查询查询字段为表达式为查询结果指定别名语法⽰例 结果去重查询 Order by 排序…

Flink转换算子——flatMap/map/filter/keyby/reduce综合案例

需求: 对流数据中的单词进行统计&#xff0c;排除敏感词TMD【腾讯美团滴滴】 此处用到了一个windows版本的软件 netcat&#xff0c;具体用法&#xff0c;先解压&#xff0c;然后在路径中输入cmd,来到黑窗口。 官网地址&#xff1a;netcat 1.11 for Win32/Win64Netcat介绍及安装…

图算法 | 3、图分析与数据科学

图分析(Graph Analytics)在本质上是对图数据的处理与分析&#xff0c;其过程可以概括为图计算。 而图计算的范畴不仅包含数据的计算或分析&#xff0c;还包含元数据管理、模式管理、数据建模、数据清洗、转换、加载、治理、图分析与计算等一系列操作。 或许我们用大数据生命周…

鲸鱼机器人和乐高机器人的比较

鲸鱼机器人和乐高机器人各有其独特的优势和特点&#xff0c;家长在选择时可以根据孩子的年龄、兴趣、经济能力等因素进行综合考虑&#xff0c;选择最适合孩子的教育机器人产品。 优势 鲸鱼机器人 1&#xff09;价格亲民&#xff1a;鲸鱼机器人的产品价格相对乐高更为亲民&…

【Unity】 GamePlay开发:通用的检查点/成就/条件触发系统

特别适用于各种解谜关卡, 成就系统&#xff0c;任务系统&#xff0c;的 通用事件处理 CheckPointHandler.cs随便挂在场景中的某个物体上 (单例模式&#xff0c;场景中只要有一个&#xff09; 1) How To Use CheckPoint Events是一个列表&#xff0c;每个元素是一个组合事件&…

企业OA管理系统:Spring Boot技术实现与案例研究

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…

【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作

1.实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法&#xff0c;以及通过理论课学习与实验参考书的帮助&#xff0c;熟练掌握使用T-SQL语句和交互式方法对数据表进行插入数据、修改数据、删除数据等等的操作&#xff1b;作为后续实验的基础&#xff0c;根据实验要求重…

基于AXI PCIE IP的FPGA PCIE卡示意图

创作不易&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/csdn_gddf102384398/article/details/143926217 上图中&#xff0c;在FPGA PCIE卡示意图内&#xff0c;有2个AXI Master设备&#xff0c;即&#xff1a;PCIE到AXI4-Full-Master桥、AXI CDMA IP&#xff1…

Docker1:认识docker、在Linux中安装docker

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

java-排序算法汇总

排序算法&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09; 选择排序&#xff08;Selection Sort&#xff09; 插入排序&#xff08;Insertion Sort&#xff09; 快速排序&#xff08;Quick Sort&#xff09; 归并排序&#xff08;Merge Sort&#xff09; 堆排序&…

瑞佑液晶控制芯片RA6807系列介绍 (三)软件代码详解 Part.10(让PNG图片动起来)完结篇

RA6807是RA8876M的缩小版&#xff0c;具备RA8876M的所有功能&#xff0c;只将MCU控制接口进行缩减&#xff0c;仅保留SPI-3和I2C接口&#xff0c;其它功能基本相同。 该芯片最大可控制854x600的分辨率&#xff0c;内建64Mbits显存&#xff0c;多个图层&#xff0c;使用起来相当…

org.apache.log4j的日志记录级别和基础使用Demo

org.apache.log4j的日志记录级别和基础使用Demo&#xff0c;本次案例展示&#xff0c;使用是的maven项目&#xff0c;搭建的一个简单的爬虫案例。里面采用了大家熟悉的日志记录插件&#xff0c;log4j。来自apache公司的开源插件。 package com.qian.test;import org.apache.log…

深度学习实战人脸识别

文章目录 前言一、人脸识别一般过程二、人脸检测主流算法1. MTCNN2. RetinaFace3. CenterFace4. BlazeFace5. YOLO6. SSD7. CascadeCNN 三、人脸识别主流算法1.deepface2.FaceNet3.ArcFace4.VGGFace5.DeepID 四、人脸识别系统实现0.安装教程与资源说明1. 界面采用PyQt5框架2.人…

Qt 字符串、信号槽详解

目录 1.QT中字符串QString的使用 1.1.常见的函数 1.2.总结QT中跟字符&#xff0c;字符串有关的类 1.3.字符串列表StringList 2.信号与槽 1.作用 2.右键转到槽函数 3.关联信号与槽函数(让你的信号跟槽函数之间形成一一对应关系) 4.信号与槽的特点 3.总结 1.继承自QMainWin…

Vscode进行Java开发环境搭建

Vscode进行Java开发环境搭建 搭建Java开发环境(Windows)1.Jdk安装2.VsCode安装3.Java插件4.安装 Spring 插件5.安装 Mybatis 插件5.安装Maven环境6.Jrebel插件7.IntelliJ IDEA Keybindings8. 收尾 VS Code&#xff08;Visual Studio Code&#xff09;是由微软开发的一款免费、开…

响应式数据(v-on、v-if、v-show、v-for、v-bind、v-model、computed、watch)

目录 一、事件绑定指令v-on 二、条件渲染指令v-if 三、v-show 四、遍历指令v-for 1、遍历对象的值 2、遍历对象的值和键&#xff08;先值后键&#xff09; 3、遍历对象的值、键和索引 4、遍历数组的值和索引 五、属性动态化指令v-bind(单向) 【CSS样式的绑定&#…

设计模式之 命令模式

命令模式&#xff08;Command Pattern&#xff09;是行为型设计模式之一&#xff0c;它将请求&#xff08;或命令&#xff09;封装成一个对象&#xff0c;从而使用户能够将请求发送者与请求接收者解耦。通过命令模式&#xff0c;调用操作的对象与执行操作的对象不直接关联&…

微信小程序2-地图显示和地图标记

一、index修改页面&#xff0c;让页面能够显示地图和一个添加标记的按钮。 index.wxml <scroll-view class"scrollarea" scroll-y type"list"><view class"index_container"><map id"map" style"width: 100%; h…

使用eclipse构建SpringBoot项目

我这里用eclipse2018版本做演示&#xff0c;大家有需要的可以下载Eclipse Downloads | The Eclipse Foundation 1.打开eclipse&#xff0c;选择存放代码的位置 2.选择 file >> new >> project >> 选择springboot文件下的 spring starter project 2.这里选择N…