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

打印 上一主题 下一主题

主题 859|帖子 859|积分 2577

(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

  1. CREATE DATABASE IF NOT EXISTS spring_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  2. USE spring_db;
  3. CREATE TABLE user (
  4.                       id INT AUTO_INCREMENT PRIMARY KEY,
  5.                       username VARCHAR(50) NOT NULL UNIQUE,
  6.                       password VARCHAR(100) NOT NULL
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码
 2、创建第一个index.jsp页面

页面重要包罗注册以及登陆,很简单,直接放代码
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>欢迎</title>
  8.     <style>
  9.         /* 页面背景 */
  10.         body {
  11.             font-family: 'Arial', sans-serif;
  12.             margin: 0;
  13.             padding: 0;
  14.             background: url('https://wx3.sinaimg.cn/mw690/007doFNOgy1hf8lzl0rs2j323u16q7wh.jpg') no-repeat center center fixed;
  15.             background-size: cover;
  16.             display: flex;
  17.             justify-content: center;
  18.             align-items: center;
  19.             height: 100vh;
  20.             overflow: hidden;
  21.             animation: backgroundAnimation 10s infinite alternate;
  22.         }
  23.         /* 页面内容容器 */
  24.         .container {
  25.             text-align: center;
  26.             background-color: white;
  27.             padding: 40px;
  28.             border-radius: 12px;
  29.             box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); /* 阴影效果 */
  30.             background-color: rgba(255, 255, 255, 0.95); /* 背景半透明 */
  31.             width: 100%;
  32.             max-width: 500px;
  33.         }
  34.         /* 标题样式 */
  35.         h3 {
  36.             font-family: 'Comic Sans MS', cursive, sans-serif; /* 卡通风格字体 */
  37.             font-size: 28px;
  38.             color: #00BFFF; /* 天青色 */
  39.             margin-bottom: 20px;
  40.         }
  41.         /* 链接列表样式 */
  42.         ul {
  43.             list-style-type: none;
  44.             padding: 0;
  45.         }
  46.         li {
  47.             margin: 15px 0;
  48.         }
  49.         /* 链接按钮样式 */
  50.         a {
  51.             text-decoration: none;
  52.             padding: 12px 25px;
  53.             background-color: #607d8b; /* 莫兰迪蓝绿色 */
  54.             color: white;
  55.             font-size: 18px;
  56.             border-radius: 10px;
  57.             display: inline-block;
  58.             transition: background-color 0.3s ease, transform 0.2s ease;
  59.         }
  60.         a:hover {
  61.             background-color: #78909c;
  62.             transform: translateY(-2px);
  63.         }
  64.         a:active {
  65.             background-color: #546e7a;
  66.             transform: translateY(0);
  67.         }
  68.         /* 响应式设计 */
  69.         @media (max-width: 480px) {
  70.             .container {
  71.                 padding: 20px;
  72.                 width: 90%;
  73.             }
  74.             h3 {
  75.                 font-size: 24px;
  76.             }
  77.             a {
  78.                 font-size: 16px;
  79.                 padding: 10px 20px;
  80.             }
  81.         }
  82.     </style>
  83. </head>
  84. <body>
  85. <div class="container">
  86.     <h3>${username} 欢迎你的探索!</h3>
  87.     <ul>
  88.         <li><a href="index/login">登录</a></li>
  89.         <li><a href="index/register">获取ROY6账号</a></li>
  90.     </ul>
  91. </div>
  92. </body>
  93. </html>
复制代码
 3、注册页面 register.jsp页面

由index.jsp页面点击注册按钮跳转而来,重要实现注册功能。这里连接数据库,判断用户的合法性。注册乐成跳转success.jsp页面,失败跳转到error.jsp页面,已经注册过则继续停留在此页面,提示“注册失败,用户名已存在“。
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>注册</title>
  8.     <style>
  9.         body {
  10.             font-family: 'Arial', sans-serif;
  11.             margin: 0;
  12.             padding: 0;
  13.             background: url('https://wx4.sinaimg.cn/mw690/007btvx7ly1h7zumoa5l8j30u01mtgru.jpg') no-repeat center center fixed;
  14.             background-size: cover;
  15.             display: flex;
  16.             justify-content: center;
  17.             align-items: center;
  18.             height: 100vh;
  19.             overflow: hidden;
  20.             animation: backgroundAnimation 10s infinite alternate;
  21.         }
  22.         .container {
  23.             width: 100%;
  24.             max-width: 400px;
  25.             background-color: #ffffff;
  26.             padding: 30px;
  27.             border-radius: 12px;
  28.             box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
  29.             animation: fadeIn 0.8s ease-in-out;
  30.         }
  31.         @keyframes fadeIn {
  32.             from {
  33.                 opacity: 0;
  34.                 transform: translateY(-20px);
  35.             }
  36.             to {
  37.                 opacity: 1;
  38.                 transform: translateY(0);
  39.             }
  40.         }
  41.         h2 {
  42.             font-size: 28px;
  43.             color: #7a7975; /* 莫兰迪灰色 */
  44.             margin-bottom: 20px;
  45.             text-align: center;
  46.             font-family: 'Comic Sans MS', cursive;
  47.         }
  48.         .form-group {
  49.             margin-bottom: 20px;
  50.         }
  51.         .form-group label {
  52.             font-size: 16px;
  53.             color: #8A9A8E; /* 深莫兰迪灰褐色 */
  54.             margin-bottom: 5px;
  55.             display: block;
  56.             text-align: left;
  57.         }
  58.         .form-group input {
  59.             width: 100%;
  60.             padding: 12px;
  61.             font-size: 16px;
  62.             border: 1px solid #ddd;
  63.             border-radius: 8px;
  64.             box-sizing: border-box;
  65.             outline: none;
  66.             transition: all 0.3s ease;
  67.         }
  68.         .form-group input:focus {
  69.             border-color: #a6a398; /* 莫兰迪绿灰色 */
  70.             box-shadow: 0 0 10px rgba(166, 163, 152, 0.3);
  71.         }
  72.         .form-group p {
  73.             color: #c94e50; /* 柔和的莫兰迪红色 */
  74.             font-size: 14px;
  75.         }
  76.         .button-container {
  77.             display: flex;
  78.             gap: 10px;
  79.             justify-content: space-between;
  80.         }
  81.         .button-container button {
  82.             width: 48%;
  83.             padding: 12px;
  84.             font-size: 16px;
  85.             border-radius: 8px;
  86.             border: none;
  87.             cursor: pointer;
  88.             transition: all 0.3s ease;
  89.         }
  90.         .reset-button {
  91.             background-color: #d7d3cc; /* 莫兰迪浅灰色 */
  92.             color: #4f4d49; /* 深莫兰迪灰 */
  93.         }
  94.         .reset-button:hover {
  95.             background-color: #c8c4bb; /* 更深的莫兰迪灰 */
  96.         }
  97.         .submit-button {
  98.             background-color: #A8B3A5; /* 莫兰迪绿灰色 */
  99.             color: #ffffff;
  100.         }
  101.         .submit-button:hover {
  102.             background-color: #8f8c80; /* 更深的莫兰迪绿灰色 */
  103.         }
  104.         @media (max-width: 480px) {
  105.             .container {
  106.                 padding: 20px;
  107.             }
  108.             h2 {
  109.                 font-size: 24px;
  110.             }
  111.             .form-group label {
  112.                 font-size: 14px;
  113.             }
  114.             .form-group input {
  115.                 font-size: 14px;
  116.                 padding: 10px;
  117.             }
  118.             .button-container button {
  119.                 font-size: 14px;
  120.                 padding: 10px;
  121.             }
  122.         }
  123.     </style>
  124. </head>
  125. <body>
  126. <div class="container">
  127.     <h2>注册</h2>
  128.     <%
  129.         String error = (String) request.getAttribute("error");
  130.         if (error != null) {
  131.     %>
  132.     <div class="form-group">
  133.         <p><%= error %></p>
  134.     </div>
  135.     <%
  136.         }
  137.     %>
  138.     <form action="${pageContext.request.contextPath}/doRegister" method="post">
  139.         <div class="form-group">
  140.             <label for="registerUsername">用户名</label>
  141.             <input type="text" id="registerUsername" name="username" required>
  142.         </div>
  143.         <div class="form-group">
  144.             <label for="password">密码</label>
  145.             <input type="password" id="password" name="password" required>
  146.         </div>
  147.         <div class="form-group">
  148.             <label for="confirmPassword">确认密码</label>
  149.             <input type="password" id="confirmPassword" name="confirmPassword" required>
  150.         </div>
  151.         <div class="button-container">
  152.             <button type="reset" class="reset-button">重置</button>
  153.             <button type="submit" class="submit-button">注册</button>
  154.         </div>
  155.     </form>
  156. </div>
  157. </body>
  158. </html>
复制代码
 4、注册乐成success.jsp页面

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="zh">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>注册成功</title>
  8.     <style>
  9.         body {
  10.             font-family: 'Arial', sans-serif;
  11.             margin: 0;
  12.             padding: 0;
  13.             background: url('https://wx2.sinaimg.cn/mw690/006Gi90nly1h6p18g6sipj31h40u0791.jpg') no-repeat center center fixed;
  14.             background-size: cover;
  15.             display: flex;
  16.             justify-content: center;
  17.             align-items: center;
  18.             height: 100vh;
  19.             overflow: hidden;
  20.             animation: backgroundAnimation 10s infinite alternate;
  21.         }
  22.         .container {
  23.             background-color: white;
  24.             padding: 40px;
  25.             background-color: rgba(255, 255, 255, 0.95); /* 背景半透明 */
  26.             border-radius: 16px;
  27.             box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); /* 阴影效果 */
  28.             width: 100%;
  29.             max-width: 420px;
  30.             text-align: center;
  31.         }
  32.         h1 {
  33.             font-family: 'Comic Sans MS', cursive, sans-serif; /* 可爱的卡通字体 */
  34.             font-size: 36px;
  35.             color: #c58e72;
  36.             margin-bottom: 20px;
  37.             font-weight: 600;
  38.         }
  39.         p {
  40.             font-size: 18px;
  41.             color: #333;
  42.             margin-bottom: 30px;
  43.         }
  44.         a {
  45.             display: inline-block;
  46.             font-size: 18px;
  47.             color: white;
  48.             background-color: #607d8b; /* Morandi blue */
  49.             padding: 12px 24px;
  50.             text-decoration: none;
  51.             border-radius: 10px;
  52.             transition: background-color 0.3s ease, transform 0.2s ease;
  53.         }
  54.         a:hover {
  55.             background-color: #78909c;
  56.             transform: translateY(-2px);
  57.         }
  58.         a:active {
  59.             background-color: #546e7a;
  60.             transform: translateY(1px);
  61.         }
  62.     </style>
  63. </head>
  64. <body>
  65. <div class="container">
  66.     <h1>注册成功</h1>
  67.     <p>欢迎,您已成为ROY6新成员!</p>
  68.     <a href="${pageContext.request.contextPath}/login">前往探索ROY6商城</a>
  69. </div>
  70. </body>
  71. </html>
复制代码
5、注册失败error.jsp页面

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>注册失败</title>
  8.     <style>
  9.         /* 设置背景色 */
  10.         body {
  11.             font-family: Arial, sans-serif;
  12.             background-color: #f8d7da; /* 轻微红色背景,表示失败 */
  13.             margin: 0;
  14.             height: 100vh;
  15.             display: flex;
  16.             justify-content: center;
  17.             align-items: center;
  18.         }
  19.         .container {
  20.             text-align: center;
  21.             background-color: white;
  22.             padding: 30px 50px;
  23.             border-radius: 10px;
  24.             box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
  25.             width: 100%;
  26.             max-width: 400px;
  27.         }
  28.         h1 {
  29.             font-size: 24px;
  30.             color: #721c24; /* 错误提示的红色 */
  31.             margin-bottom: 20px;
  32.         }
  33.         p {
  34.             font-size: 18px;
  35.             color: #721c24;
  36.             margin-bottom: 30px;
  37.         }
  38.         a {
  39.             text-decoration: none;
  40.             padding: 12px 20px;
  41.             background-color: #4CAF50;
  42.             color: white;
  43.             font-size: 16px;
  44.             font-weight: bold;
  45.             border-radius: 6px;
  46.             display: inline-block;
  47.             transition: background-color 0.3s ease, transform 0.2s ease;
  48.         }
  49.         a:hover {
  50.             background-color: #45a049;
  51.             transform: translateY(-2px);
  52.         }
  53.         a:active {
  54.             transform: translateY(0);
  55.         }
  56.     </style>
  57. </head>
  58. <body>
  59. <div class="container">
  60.     <h1>注册失败</h1>
  61.     <p>抱歉,您的注册未能成功。请重试</p>
  62.     <a href="${pageContext.request.contextPath}/register">返回注册页面</a>
  63. </div>
  64. </body>
  65. </html>
复制代码
6、登录login.jsp页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>登录</title>
  8.     <style>
  9.         /* 页面基础样式 */
  10.         body {
  11.             font-family: 'Arial', sans-serif;
  12.             margin: 0;
  13.             padding: 0;
  14.             background: url('https://wx4.sinaimg.cn/mw690/007btvx7ly1h7zumt0ty2j31hc0u0wkx.jpg') no-repeat center center fixed;
  15.             background-size: cover;
  16.             display: flex;
  17.             justify-content: center;
  18.             align-items: center;
  19.             height: 100vh;
  20.             overflow: hidden;
  21.             animation: backgroundAnimation 10s infinite alternate;
  22.         }
  23.         .container {
  24.             width: 100%;
  25.             max-width: 400px;
  26.             padding: 40px;
  27.             background-color: rgba(255, 255, 255, 0.95); /* 背景半透明 */
  28.             border-radius: 12px;
  29.             box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); /* 阴影效果 */
  30.             text-align: center;
  31.             animation: fadeIn 1s ease-in-out;
  32.         }
  33.         /* 标题样式:使用莫兰迪色系 */
  34.         h2 {
  35.             font-size: 30px;
  36.             color: #A8B3A5; /* 莫兰迪绿 */
  37.             font-weight: 600;
  38.             margin-bottom: 30px;
  39.             letter-spacing: 1px;
  40.             font-family: 'Georgia', serif;
  41.         }
  42.         /* 表单样式 */
  43.         form {
  44.             display: flex;
  45.             flex-direction: column;
  46.             gap: 20px;
  47.         }
  48.         .form-group {
  49.             display: flex;
  50.             flex-direction: column;
  51.             align-items: flex-start;
  52.         }
  53.         .form-group label {
  54.             margin-bottom: 8px;
  55.             font-weight: bold;
  56.             color: #6D7D6E; /* 莫兰迪灰绿 */
  57.         }
  58.         .form-group input {
  59.             width: 100%;
  60.             padding: 12px;
  61.             border: 1px solid #ddd;
  62.             border-radius: 8px;
  63.             font-size: 16px;
  64.             transition: border-color 0.3s ease, box-shadow 0.3s ease;
  65.         }
  66.         /* 输入框聚焦效果 */
  67.         .form-group input:focus {
  68.             border-color: #A8B3A5; /* 莫兰迪绿 */
  69.             outline: none;
  70.             box-shadow: 0 0 8px rgba(169, 179, 165, 0.6);
  71.         }
  72.         /* 按钮样式 */
  73.         .form-group button {
  74.             padding: 12px 20px;
  75.             border: none;
  76.             border-radius: 6px;
  77.             background-color: #A8B3A5; /* 莫兰迪绿 */
  78.             color: white;
  79.             font-size: 16px;
  80.             font-weight: bold;
  81.             cursor: pointer;
  82.             transition: background-color 0.3s ease, transform 0.2s ease;
  83.         }
  84.         .form-group button:hover {
  85.             background-color: #8A9A8E; /* 更深的莫兰迪绿 */
  86.             transform: translateY(-3px);
  87.         }
  88.         .form-group button:active {
  89.             transform: translateY(0);
  90.         }
  91.         /* 提交按钮 */
  92.         .submit-button {
  93.             background-color: #A8B3A5;
  94.         }
  95.         .submit-button:hover {
  96.             background-color: #8A9A8E;
  97.         }
  98.         /* 动画效果 */
  99.         @keyframes fadeIn {
  100.             from {
  101.                 opacity: 0;
  102.                 transform: translateY(-20px);
  103.             }
  104.             to {
  105.                 opacity: 1;
  106.                 transform: translateY(0);
  107.             }
  108.         }
  109.         /* 响应式设计 */
  110.         @media (max-width: 480px) {
  111.             .container {
  112.                 padding: 20px;
  113.             }
  114.             .form-group input {
  115.                 padding: 10px;
  116.             }
  117.             .form-group button {
  118.                 padding: 12px 16px;
  119.             }
  120.             h2 {
  121.                 font-size: 26px;
  122.             }
  123.         }
  124.     </style>
  125. </head>
  126. <body>
  127. <div class="container">
  128.     <h2>登录</h2>
  129.     <form action="${pageContext.request.contextPath}/doLogin" method="post">
  130.         <div class="form-group">
  131.             <label for="username">用户名</label>
  132.             <input type="text" id="username" name="username" required>
  133.         </div>
  134.         <div class="form-group">
  135.             <label for="password">密码</label>
  136.             <input type="password" id="password" name="password" required>
  137.         </div>
  138.         <div class="form-group">
  139.             <button type="submit" class="submit-button">登录</button>
  140.         </div>
  141.     </form>
  142. </div>
  143. </body>
  144. </html>
复制代码
7、欢迎welcome.jsp页面

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>欢迎来到ROY6商城</title>
  8.     <style>
  9.         body {
  10.             font-family: 'Arial', sans-serif;
  11.             margin: 0;
  12.             padding: 0;
  13.             background: url('https://wx4.sinaimg.cn/mw690/007doFNOgy1hf8lzljzodj323u16qqv5.jpg') no-repeat center center fixed;
  14.             background-size: cover;
  15.             display: flex;
  16.             justify-content: center;
  17.             align-items: center;
  18.             height: 100vh;
  19.             overflow: hidden;
  20.         }
  21.         .container {
  22.             text-align: center;
  23.             background-color: rgba(255, 255, 255, 0.9);
  24.             padding: 30px 40px;
  25.             border-radius: 15px;
  26.             box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);
  27.             width: 100%;
  28.             max-width: 500px;
  29.             animation: fadeIn 1s ease-in-out;
  30.             position: relative;
  31.             z-index: 1;
  32.         }
  33.         h1 {
  34.             font-size: 30px;
  35.             color: #444;
  36.             margin-bottom: 20px;
  37.             font-family: 'Comic Sans MS', cursive;
  38.         }
  39.         p {
  40.             font-size: 18px;
  41.             color: #666;
  42.             margin-bottom: 20px;
  43.         }
  44.         a {
  45.             display: inline-block;
  46.             text-decoration: none;
  47.             padding: 12px 25px;
  48.             margin: 10px 0;
  49.             background-color: #A8B3A5; /* 修改为莫兰迪绿色 */
  50.             color: white;
  51.             font-size: 16px;
  52.             border-radius: 8px;
  53.             transition: background-color 0.3s ease, transform 0.2s ease;
  54.             box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  55.         }
  56.         a:hover {
  57.             background-color: #8A9A8E; /* 悬停时更深的莫兰迪绿色 */
  58.             transform: translateY(-3px);
  59.         }
  60.         a:active {
  61.             transform: translateY(0);
  62.         }
  63.         @keyframes fadeIn {
  64.             from {
  65.                 opacity: 0;
  66.                 transform: translateY(-20px);
  67.             }
  68.             to {
  69.                 opacity: 1;
  70.                 transform: translateY(0);
  71.             }
  72.         }
  73.         /* 新增样式:绝对定位文本 */
  74.         .text-overlay {
  75.             position: absolute;
  76.             top: 10%;
  77.             left: 50%;
  78.             transform: translateX(-50%);
  79.             background-color: rgba(255, 255, 255, 0.7);
  80.             padding: 20px;
  81.             border-radius: 15px;
  82.             text-align: center;
  83.             font-size: 17px;
  84.             color: #444;
  85.             width: 80%;
  86.             max-width: 600px;
  87.             box-shadow: 0 8px 15px rgba(0, 0, 0, 0.3);
  88.             animation: fadeIn 1s ease-in-out;
  89.         }
  90.         @media (max-width: 480px) {
  91.             .container {
  92.                 padding: 20px;
  93.                 width: 90%;
  94.             }
  95.             h1 {
  96.                 font-size: 24px;
  97.             }
  98.             p {
  99.                 font-size: 16px;
  100.             }
  101.             a {
  102.                 font-size: 14px;
  103.             }
  104.             .text-overlay {
  105.                 font-size: 16px;
  106.                 width: 90%;
  107.             }
  108.         }
  109.     </style>
  110. </head>
  111. <body>
  112. <!-- 新增的文字容器 -->
  113. <div class="text-overlay">
  114.     ROY6住在一个未知的BAOBAO森林里,<br>
  115.     它们喜欢音乐、舞蹈,还喜欢用自己被赋予的神秘力量,帮助地球上的人们。<br>
  116.     如果你忽然感到幸福,不再孤单,那是因为ROY6来到了你身边!<br>
  117.     在日常生活中,当你想要获得小小的幸运时,就请呼叫ROY6吧!
  118. </div>
  119. <div class="container">
  120.     <h1>${username} 欢迎来到ROY6!</h1>
  121.     <p>请选择您想进行的操作:</p>
  122.     <a href="${pageContext.request.contextPath}/add">新增Roy6商品</a>
  123.     <a href="${pageContext.request.contextPath}/list">查看Roy6商品</a>
  124. </div>
  125. </body>
  126. </html>
复制代码
8、相关配置

(1)web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  4.          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5.          version="4.0">
  6.     <servlet>
  7.         <servlet-name>springmvc</servlet-name>
  8.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9.         <init-param>
  10.             <param-name>contextConfigLocation</param-name>
  11.             <param-value>classpath:applicationContext.xml</param-value>
  12.         </init-param>
  13.         <load-on-startup>1</load-on-startup>
  14.     </servlet>
  15.     <servlet-mapping>
  16.         <servlet-name>springmvc</servlet-name>
  17.         <url-pattern>/</url-pattern>
  18.     </servlet-mapping>
  19. </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模板中。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        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">
  6.     <!-- Enable Spring MVC components and default configuration -->
  7.     <mvc:annotation-driven />
  8.     <!-- Scan for components (controllers, services, repositories) in the specified package -->
  9.     <context:component-scan base-package="com.example.demo" />
  10.     <context:component-scan base-package="com.example.demo.controller"/>
  11.     <!-- 视图解析器 -->
  12.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
  13.         <!-- 前缀 -->
  14.         <property name="prefix" value="/WEB-INF/views/" />
  15.         <!-- 后缀 -->
  16.         <property name="suffix" value=".jsp" />
  17.     </bean>
  18.     <!-- DataSource configuration for connecting to MySQL database -->
  19.     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  20.         <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
  21.         <property name="url" value="jdbc:mysql://localhost:3306/spring_db?useUnicode=true characterEncoding=UTF-8 useSSL=false serverTimezone=UTC" />
  22.         <property name="username" value="root" />
  23.         <property name="password" value="这里写你的数据库密码" />
  24.     </bean>
  25.     <!-- JdbcTemplate bean for database operations -->
  26.     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  27.         <property name="dataSource" ref="dataSource" />
  28.     </bean>
  29.     <bean id="txManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  30.         <property name="dataSource" ref="dataSource"/>
  31.     </bean>
  32.     <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
  33.             <property name="transactionManager" ref="txManage"/>
  34.     </bean>
  35.     <bean id="resourceHttpRequestHandler" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler">
  36.         <property name="locations">
  37.             <list>
  38.                 <value>classpath:/static/</value>
  39.             </list>
  40.         </property>
  41.     </bean>
  42. </beans>
复制代码
9、后端代码

(1)编写Controller层

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

  1. package com.example.demo.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. @Controller
  6. @RequestMapping("/index")
  7. public class IndexController {
  8.     @RequestMapping(value = "/login",method = RequestMethod.GET)
  9.     public String login(){
  10.         return "login";
  11.     }
  12.     @RequestMapping("/register")
  13.     public String register(){
  14.         return "register";
  15.     }
  16. }
复制代码
创建IndexController类,用于实现用户登录注册操纵。
UserController.java

  1. package com.example.demo.controller;
  2. import com.example.demo.service.UserService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PostMapping;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import org.springframework.web.servlet.ModelAndView;
  9. @Controller
  10. public class UserController {
  11.     @Autowired
  12.     private UserService userService;
  13.     @GetMapping("/login")
  14.     public String showLoginForm() {
  15.         return "login";
  16.     }
  17.     @PostMapping("/doLogin")
  18.     public ModelAndView login(@RequestParam("username") String username, @RequestParam("password") String password){
  19.         ModelAndView modelAndView = new ModelAndView();
  20.         String result = userService.Login(username,password);
  21.         if("success".equals(result)){
  22.             modelAndView.addObject("username",username);
  23.             modelAndView.setViewName("welcome"); //设置视图为welcome.jsp
  24.         }else{
  25.             modelAndView.addObject("error",true);
  26.             modelAndView.setViewName("login");
  27.         }
  28.         return modelAndView;
  29.     }
  30.     @GetMapping("/register")
  31.     public String showRegisterForm(){
  32.         return "register";
  33.     }
  34.     @PostMapping("/doRegister")
  35.     public ModelAndView Register(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("confirmPassword") String confirmPassword) {
  36.         ModelAndView modelAndView = new ModelAndView();
  37.         if (!confirmPassword.equals(password)) {
  38.             modelAndView.addObject("error", "两次密码不一致");
  39.             modelAndView.setViewName("register");  // 返回注册页面
  40.             return modelAndView;
  41.         }
  42.         try {
  43.             userService.Register(username, password);
  44.             modelAndView.setViewName("success"); // 注册成功后跳转到success.jsp页面
  45.             modelAndView.addObject("username", username);
  46.         } catch (IllegalArgumentException e) {
  47.             modelAndView.addObject("error", "注册失败,用户名已存在");
  48.             modelAndView.setViewName("register"); // 注册失败,仍然在注册页面
  49.         }
  50.         return modelAndView;
  51.     }
  52. }
复制代码
(2)编写Dao层方法

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

  1. package com.example.demo.dao;
  2. import com.example.demo.model.Users;
  3. import java.util.List;
  4. public interface UsersDAO {
  5.     public int update(String sql, Object[] params);
  6.     public List<Users> query(String sql, Object[] params);
  7. }
复制代码
(3)实现Dao层方法

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

  1. package com.example.demo.dao;
  2. import com.example.demo.model.Users;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  5. import org.springframework.jdbc.core.JdbcTemplate;
  6. import org.springframework.jdbc.core.RowMapper;
  7. import org.springframework.stereotype.Repository;
  8. import java.util.List;
  9. @Repository
  10. public class UsersDAOImpl implements UsersDAO {  // 加上 implements UsersDAO
  11.     @Autowired
  12.     private JdbcTemplate jdbcTemplate;
  13.     @Override
  14.     public int update(String sql, Object[] params) {
  15.         return jdbcTemplate.update(sql, params);
  16.     }
  17.     @Override
  18.     public List<Users> query(String sql, Object[] params) {
  19.         RowMapper<Users> rowMapper = new BeanPropertyRowMapper<>(Users.class);
  20.         return jdbcTemplate.query(sql, rowMapper, params);
  21.     }
  22. }
复制代码
(4)编写实体类

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

  1. package com.example.demo.model;
  2. public class Users {
  3.     private String username;
  4.     private String password;
  5.     public String getName() {
  6.         return username;
  7.     }
  8.     public void setUsername(String username) {
  9.         this.username = username;
  10.     }
  11.     public String getPassword() {
  12.         return password;
  13.     }
  14.     public void setPassword(String password) {
  15.         this.password = password;
  16.     }
  17. }
复制代码
(5)编写服务层接口

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

  1. package com.example.demo.service;
  2. public interface UserService {
  3.     public String Login(String username, String password);
  4.     public void Register(String username, String password);
  5. }
复制代码
(6)实现服务层方法

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

  1. package com.example.demo.service;
  2. import com.example.demo.dao.UsersDAO;
  3. import com.example.demo.model.Users;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import java.util.List;
  7. @Service
  8. public class UserServiceImpl implements UserService {
  9.     @Autowired
  10.     private UsersDAO usersDAO;
  11.     @Override
  12.     public String Login(String username, String password) {
  13.         // 使用占位符避免SQL注入
  14.         String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
  15.         List<Users> users = usersDAO.query(sql, new Object[]{username, password});
  16.         if (!users.isEmpty()) {
  17.             return "success";
  18.         }
  19.         return "login?error=true";
  20.     }
  21.     @Override
  22.     public void Register(String username, String password) {
  23.         String checkUserSql = "SELECT * FROM user WHERE username = ?";
  24.         List<Users> existingUsers = usersDAO.query(checkUserSql, new Object[]{username});
  25.         if (!existingUsers.isEmpty()) {
  26.             throw new IllegalArgumentException("Username already exists");
  27.         }
  28.         String insertUserSql = "INSERT INTO user (username, password) VALUES (?, ?)";
  29.         usersDAO.update(insertUserSql, new Object[]{username, password});
  30.     }
  31. }
复制代码
10、 查看运行效果

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

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表