在B站上学了Springboot,想尝试开发巩固知识,但是由于完整的项目太大,对知识的掌握要求也高,因此在朋友的建议下,做了一个以Springboot为后端的登陆。虽然效果简陋,但是大致明白前后端如何交互的。记录如下:
1.准备数据库
这里使用的是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.运行