在B站上学了Springboot,想尝试开发巩固知识,但是由于完整的项目太大,对知识的掌握要求也高,因此在朋友的建议下,做了一个以Springboot为后端的登陆。虽然效果简陋,但是大致明白前后端如何交互的。记录如下:

1.准备数据库

springboot用户多次登陆 springboot登录流程_java


这里使用的是MySQL数据库,并在test库下建立了user表,表中有两个字段,name和password。

2.导入相关依赖

我们大致会用到MySQL依赖,druid连接池依赖,mybatis依赖,lombok依赖,thymeleaf依赖。

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>  //MySQL驱动
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>  //连接数据库时,使用的连接池
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>  //mybatis依赖
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>    //主要是为了使用lombok中的@Data注解,可以自动生成get、set
        </dependency>
        <dependency>
            <groupId>com.github.spt-oss</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>  //html页面使用
            <version>2.0.7.0</version>
        </dependency>

3.创建实体类

上述工作完成后,就是创建对应数据库表的实体类。
可以用IDEA自动生成,也可以手动创建,总之就是创建一个实体类。这里用的是手动创建的方法。
在启动类的同级目录下创建entity包,并在其下创建User。

package com.hky.springboot_login_register.entity;

import lombok.Data;

@Data   //这里使用了lombok中的@Data注解,这个注解可以自动为User方法生成get、set方法(生成的get、set并不出现在类中)。
public class User {

    private String username;

    private String password;
}

4.创建mapper接口

mybatis通过mapper访问数据库,因此在启动类同级目录下创建mapper包,并在其下面创建UserMapper接口。

package com.hky.springboot_login_register.mapper;

import com.hky.springboot_login_register.entity.User;

public interface UserMapper { //接口中定义了三个方法

    User find(String username,String password);  //根据账号密码去数据库查,查到了返回User对象,查不到返回null

    int register(String username,String password); //注册。MySQL insert操作时,如果是自增ID,插入成功返回ID,不是自增ID的话返回一个int数。

    User is_exist(String username);  //判断用户是否存在,存在返回User对象。

}

5.配置mapper

上述mapper接口写好之后,其中只是三个空方法,没有被具体写出来。
因此在resource目录下创建mapper包,并在其中创建UserMapper.xml文件对其进行配置,实现数据库的相关操作。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  //mybatis mapper.xml头文件可以去百度查

<mapper namespace="com.hky.springboot_login_register.mapper.UserMapper"> 
	//参数namespace:该配置文件配置的是哪个mapper接口,参数值是其所在的包
    <select id="find" resultType="User"> 
    //参数id表明该sql语句对应的是mapper接口中的哪个方法,其值是方法名。
    //参数resultTpye 表示结果是什么,这里设置为User,其结果是User实体。
        select * from user where username = #{username} and password = #{password}
    </select>

    <insert id="register">
        insert into user (username,password) values (#{username},#{password})
    </insert>

    <select id="is_exist" resultType="User">
        select username from user where username= #{username}
    </select>
</mapper>

6.配置yml文件

我们现在创建了数据库表,实体类,mapper接口,以及mapper.xml配置文件。
现在有几个问题:
1)程序不知道你写了mapper接口。
2)程序不知道你写了mapper的xml配置文件。
3)mapper.xml配置文件中 resultType= User 参数,mapper.xml文件不知道User是什么。
4)mapper.xml配置文件中的sql语句不知道去哪里执行。

问题1:在启动类中添加MapperScan(basepackage=“mapper接口所在的包”)

package com.hky.springboot_login_register;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "com.hky.springboot_login_register.mapper")
 //启动类就知道去哪里扫描mapper接口了
public class SpringbootLoginRegisterApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootLoginRegisterApplication.class, args);
    }

}

问题2和问题3:在配置文件yml中添加mybatis相关信息

mybatis:
  mapper-locations: classpath:mapper/*.xml  //这里写上mapper.xml配置文件的目录
  type-aliases-package: com.hky.springboot_login_register.entity //这里指定resultType对应的实体所在的位置
  configuration:
    map-underscore-to-camel-case: true //驼峰映射
server:
  port: 8080   //端口

问题4:在配置文件yml中添加数据库相关信息

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver //数据库驱动
    url: jdbc:mysql://192.168.1.105/test?serverTimezone=UTC //url 一定要带上serverTimezone=UTC 指定时区为东八区
    username: XXX
    password: YYY
    type: com.alibaba.druid.pool.DruidDataSource //指定德鲁伊连接池

7.编写html页面

上述6步走完之后,已经可以去数据库中读取信息了,下面就是编写一些简单的页面方便测试。
Springboot默认去resource下的templates下寻找html页面(也可以通过更改参数去别的地方寻找)。

创建了三个页面:login.html登陆页面、register.html注册页面、success.html登陆成功页面。
页面很简陋没有用JS,CSS等修饰,只是为了实现效果展示。

login.html登陆界面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>主页面</title>
    <script th:inline="javascript">
        function is_exist(form) {   //判断输入是否合法
            if (form.username.value == ""){
                alert("请输入账号");
                return false;
            }
            if (form.password.value == ""){
                alert("请输入密码");
                return false;
            }
            return true;
        }
    </script>
</head>

<body onload="tag()">
    <div>
        <form action="/login" method="post" name="login_form" onsubmit="return is_exist(this)">
        //form表单中 action参数:提交时向哪个页面提交
            <p><input type="text" placeholder="请输入您的账号" name="username" id="name"></p>
            <p><input type="password" placeholder="请输入您的密码" name="password" id="pas"></p>
            <button type="submit">登陆</button>
        </form>
    </div>
    <div>
            <button type="button"   onclick = "window.location.href = 'register'">注册</button>
    </div>
    <h1 th:text="${msg}" th:if="${not#strings.isEmpty(msg)}"></h1>
</body>
</html>

register.html 注册界面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <script th:inline="javascript">
        function is_empty(form) {  //判断输入合法性
            if(form.username.value == "" || form.password_1.value == "" || form.password_2.value == ""){
                alert("请输入完整信息");
                return false;
            }
            if(form.password_1.value !== form.password_2.value){
                alert("两次密码不一致");
                return false;
            }
            return true;
        }
    </script>
</head>
<body>
    <div>
        <form action="/add" method="post" name="register_form" onsubmit="return is_empty(this)">
            <p><input type="text" name="username" placeholder="请输入账号"></p>
            <p><input type="password" name="password_1" placeholder="请输入密码"></p>
            <p><input type="password" name="password_2" placeholder="请再次输入密码,两次输入密码需一致"></p>
            <button type="submit">提交</button>
        </form>
    </div>
    <h1 th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></h1>
</body>
</html>

8. 编写controller

根据1-6我们已经可以实现数据的读取,通过7我们有了页面,想实现登陆就是将1-6和7进行组合。
页面和后端交互需要通过controller。
在启动类同级目录下创建controller包,并在其下创建LoginController和RegisterController。

登陆的controller

package com.hky.springboot_login_register.controller;

import com.hky.springboot_login_register.entity.User;
import com.hky.springboot_login_register.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Controller  //该注解表示return 的是一个页面,而RestController表示return的是一个字符串
public class LoginController {

    @Autowired
    private UserMapper mapper; //将mapper注入

    @PostMapping(value = "/login") //这里接受html页面中提交的请求。form表单中action="/login",所以这里value = "/login"
    public String login(HttpServletRequest request,Map<String,Object> map){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User result = new User();
        result = mapper.find(username,password);
        if (result != null){
            return "success";  //由于添加了@Controller注解,所以这里登陆成功返回的其实是success.html页面
        }
        else {
            map.put("msg","账号密码错误");
            return "login";  //登陆失败返回登陆页面
        }
    }
    @GetMapping("/login")
    public String Tologin(){  //这里是显示页面的映射
        return "login";
    }
}

注册的controller

package com.hky.springboot_login_register.controller;

import com.hky.springboot_login_register.entity.User;
import com.hky.springboot_login_register.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Controller
public class RegisterController {

    @Autowired
    private UserMapper mapper;

    @PostMapping(value = "/add") // 同理,获得页面form action="/add"的提交请求
    public String register(HttpServletRequest request, Model model){
        String username = request.getParameter("username");
        String password = request.getParameter("password_1");
        User user = new User();
        user = mapper.is_exist(username);
        if (user != null){
            model.addAttribute("msg","账号已存在");
            return "register";
        }
        else {
            mapper.register(username,password);
            return "login";
        }
    }
    @GetMapping("/register")
    public String Toregister(){
        return "register";
    }
}

9.运行

springboot用户多次登陆 springboot登录流程_springboot用户多次登陆_02