1. SpringBoot简介
SpringBoot是一个默认就集成了绝大部分常规开发时都使用的依赖、完成了绝大部分的常规配置、基于SpringMVC的框架。
SpringBoot的核心思想是约定大于配置,因为在传统的SSM项目中,创建项目后,需要自定义大量的配置,而不同的项目的配置却大同小异,甚至就是完全相同,所以,SpringBoot就直接完成了相关的配置,并要求使用者遵循配置值的约定,例如它将DispatcherServlet
的映射路径配置为/*
,则使用者就按照这个配置值使用即可,无须自已编写配置!
2. 使用SpringBoot开发用户注册登录
2.1. 创建SpringBoot项目
如果要创建SpringBoot项目,常规的创建方式有:
- 基于SpringBoot的父级项目来创建新的项目;
- 使用开发工具的创建向导来创建;
- 从Spring网站创建项目并导入到本地开发工具中。
本次使用以上介绍的第3种做法,首先,打开https://start.spring.io/
网站,在网页中主要确定几项:
- 所使用的SpringBoot版本;
- Group与Artifact,相当于在Eclipse中创建Maven项目时指定的Group Id和Artifact Id;
- 强烈建议不要修改默认生成的Package name,默认值就是由填写的Group和Artifact值决定的;
- 确定使用jar或war;
- 添加必要的依赖。
完成后,点击页面中的Generate按钮就可以开始生成项目并自动下载该项目!
解压下载得到的压缩包文件,将得到项目文件夹,为了便于管理项目,推荐将该文件夹移动到Workspace中,避免以后找不到这个项目了。
然后,在Eclipse中,通过Import > Existing Maven Projects导入项目,默认的项目结构并不完整,可以暂且不管,后续项目更新完成后就会恢复正常,导入项目后,项目会开始自动下载所需的依赖,这个过程中只需要保证能够连接到Maven服务器,确保能下载所依赖的jar包,然后,等待即可,如果项目没有开始自动下载,对项目点右键,选择Maven > Update Project更新即可。
建议使用4.11及以上版本的Eclipse,如果使用的是较低版本的Eclipse,在pom.xml文件中可能报错,这是因为较低版本的Eclipse中内置的Maven配置版本较低导致的,而较高版本的Eclipse中内置的Maven配置版本较高,就不会出错,并且,即使出错,也不影响正常的开发和运行。
2.2. 检查项目是否基本可用
展开项目中的src/test/java,其中,已经存在cn.tedu.sample
包,这个包的名称是创建项目时填写的Group和Artifact决定的,这个包的名称是不允许修改的,并且,项目中所有的单元测试类都必须放在这个包或其子包中!在包中已经存在SampleApplicationTests
类,类中有contextLoads()
方法,通过单元测试的方式,直接测试方法,如果能成功运行,则表示测试环境是正常的!
展开项目中的src/main/java,其中,已经存在cn.tedu.sample
包,这个包的名称是创建项目时填写的Group和Artifact决定的,这个包的名称是不允许修改的,并且,项目中所有的单元测试类都必须放在这个包或其子包中!在包中已经存在SampleApplication
类,它是项目的启动类,类中有main()
方法,这个main()
就是整个项目的启动方法。
2.3. 在项目中添加静态页面
在SpringBoot项目中,在src/main/resources下,默认就存在static文件夹,这个文件就是SpringBoot项目用于存放静态资源(网页文件、css文件、js文件、图片文件等)的文件夹!
所以,可以在static文件夹下创建index.html文件,内容可以自行设计,完成后,启动项目,在浏览器中输入http://localhost:8080/
即可访问。
因为SpringBoot框架内置了Tomcat,每个项目都有独立的Tomcat,在部署项目时,会将Context Path
设置为""
,即空字符串,所以,在SpringBoot的启动日志中也会有:
Tomcat started on port(s): 8080 (http) with context path ''
所以,最后,在执行访问时,URL的端口号右侧不需要添加项目名称!
另外,index.html是默认的资源名称,所以,如果需要访问的就是这个资源,则URL中也不必显式的指定资源名。
在SpringBoot项目中,在src/main/resources下默认即存在application.properties文件,这个文件是整个项目的配置文件,后续相关的配置都需要写在这个文件中!例如,可以在该文件中添加配置:
server.port=80
就可以把Tomcat的端口号改为80
,如果使用的是Windows操作系统,重新启动项目,通过http://localhost/
即可访问刚才的页面,因为80
端口是HTTP协议的默认端口,所以,当尝试提交HTTP请求时,如果没有显式的指定端口号,会视为尝试访问服务器的80
端口!如果使用的是Mac OS或Linux操作系统,这些操作系统对80端口的使用是非常严格的,需要自行在操作系统中进行相关配置后,才允许使用80端口!
注意:如果自行指定端口,推荐使用4位数甚至5位的端口号,因为2位数和3位数的许多端口号都被某些协议默认使用了,如果使用这些端口号,就会导致各服务产生冲突,某些服务将无法正常使用!
另外,如果在SpringBoot项目中,还会使用到Thymeleaf等模版技术,应该将模版页面放在src/main/resources/templates/文件夹下。
2.4. 使用控制器接收客户端提交的请求
在src/main/java下的cn.tedu.sample
包是SpringBoot项目默认组件扫描的根包,所以,在项目中创建的所有组件类(需要由Spring框架创建并管理的)必须放在这个包或其子包中!
在cn.tedu.sample
包中创建HelloController
控制器,在类的声明之前添加@Controller
注解,并在类中添加处理请求的方法,例如:
package cn.tedu.sample;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("hello")
@ResponseBody
public String showHello() {
return "SpringBoot框架真好用!!!";
}
}
编写完成后,重启项目,在浏览器中输入http://localhost:8080/hello
即可请求到以上控制器中的资源!
SpringBoot项目默认已经配置了DispatcherServlet
,并且,映射的路径是/*
,所以,在配置请求路径时,并不要求路径中的资源是以.do
作为后缀,同时,也就意味着当前项目中所有请求路径都会被SpringMVC框架所处理!
SpringBoot框架将所有内置的框架、开发环境中的编码已经全部设置为UTF-8
了,所以,在使用SpringBoot时,默认都是可以直接支持中文的!
在编写控制器时,还可以使用一些新的注解:
@RestController
:该注解可以用于替代此前使用的@Controller
,使用该注解后,当前控制器类中所有的方法默认都是响应正文,相当于每个方法之前都添加了@ResponseBody
,所以,可以简单的理解为@RestController = @Controller + @ResponseBody
;@GetMapping
:该注解相当于@RequestMapping(method=RequestMethod.GET)
;@PostMapping
:该注解相当于@RequestMapping(method=RequestMethod.POST)
;
以上注解并不是SpringBoot项目新增的,而是SpringMVC框架中本来就有的,但是,在传统的SpringMVC框架中,这些注解是不能直接使用的,需要另行配置,而SpringBoot默认已经完成了这些配置,所以,可以直接使用!
2.5. 配置数据库连接
在SpringBoot项目中,如果涉及数据库编程,需要自行添加数据库相关的依赖,虽然SpringBoot默认能集成绝大部分常规依赖,但是,它无法直接确定每个开发者使用的是哪种数据库、哪种数据库编程时使用的框架,所以,是需要自行添加的!
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
当SpringBoot项目添加了数据库相关的依赖后,启动项目时,就会自动尝试读取数据库连接的配置信息,如果没有配置信息,则启动项目会报错!
所以,需要在application.properties中添加配置:
spring.datasource.url=jdbc:mysql://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
添加以上配置后,就可以正常启动项目,但是,启动项目时,只会读取配置信息,并不会执行连接,所以,即使以上配置信息中存在错误的值,也不影响项目启动,同样,也不无法得知以上配置信息是否正确!
所以,接下来,需要尝试连接到数据库,以确认以上配置信息是否正确!可以在src/test/java中cn.tedu.sample
中的SampleApplicationTests
测试类编写并执行单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleApplicationTests {
@Test
public void contextLoads() {
}
@Autowired
private DataSource dataSource;
@Test
public void getConnection() throws SQLException {
System.err.println(dataSource.getConnection());
}
}
2.6. 实现注册相关的数据库编程
首先,需要创建用户数据类,用于封装用户数据的属性,所以,在src/main/java的cn.tedu.sample
包下创建User
类:
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
// 补充SET/GET方法,toString()方法
}
注册功能应该由2项数据操作所组成:先根据用户尝试注册的用户名查询数据,如果查询到某个结果,则表示该用户名已经被占用,不允许插入新的用户数据,如果查询不到结果,则该用户名没有被人占用,将用户尝试注册的信息插入到数据库中即可!所以,涉及操作分别是根据用户名查询用户数据和插入用户数据。
先cn.tedu.sample
包中创建UserMapper
接口,并在接口中添加抽象方法:
package cn.tedu.sample;
public interface UserMapper {
Integer addnew(User user);
User findByUsername(String username);
}
写完接口后,需要配置接口文件的位置,配置的做法可以是:
- 在接口的声明之前添加
@Mapper
注解,使用这种做法,就要求每一个接口都需要添加该注解; - 在启动类(
SampleApplication
)的声明之前,添加@MapperScan("接口所在的包")
注解,然后,所有接口都放在配置的包中即可!
一般推荐使用以上的第2种做法,例如:
@SpringBootApplication
@MapperScan("cn.tedu.sample")
public class SampleApplication {
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
接下来,就需要配置各抽象方法对应的SQL语句,首先,还是在src/main/resources下创建mappers文件夹,并在该文件中粘贴得到UserMapper.xml,用于配置SQL语句。
在UserMapper.xml中配置SQL语句:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="cn.tedu.sample.UserMapper">
<insert id="addnew" useGeneratedKeys="true" keyProperty="id">
INSERT INTO t_user (
username, password, age, phone, email
) VALUES (
#{username}, #{password}, #{age}, #{phone}, #{email}
)
</insert>
<select id="findByUsername" resultType="cn.tedu.sample.User">
SELECT * FROM t_user WHERE username=#{username}
</select>
</mapper>
在执行单元测试之前,还需要指定这些XML文件的位置,需要在application.properties中进行配置:
mybatis.mapper-locations=classpath:mappers/*.xml
最后,编写并执行单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleApplicationTests {
@Test
public void contextLoads() {
}
@Autowired
private DataSource dataSource;
@Autowired
private UserMapper userMapper;
@Test
public void addnew() {
User user = new User();
user.setUsername("lucy02");
user.setPassword("123456");
user.setAge(32);
user.setPhone("13900139002");
user.setEmail("lucy02@foxmail.com");
Integer rows = userMapper.addnew(user);
System.err.println("rows=" + rows);
System.err.println(user);
}
@Test
public void findByUsername() {
String username = "lucy";
User user = userMapper.findByUsername(username);
System.err.println(user);
}
@Test
public void getConnection() throws SQLException {
System.err.println(dataSource.getConnection());
}
}
至此,关于注册时涉及的数据库编程的相关功能就已经完成!
其实,还可以在抽象方法之前添加注解来配置SQL语句及相关内容,例如:
public interface UserMapper {
@Insert("INSERT INTO t_user (username, password, age, phone, email) VALUES (#{username}, #{password}, #{age}, #{phone}, #{email})")
Integer addnew(User user);
@Select("SELECT * FROM t_user WHERE username=#{username}")
User findByUsername(String username);
}
这种做法也不是SpringBoot集成MyBatis才可以做到的,直接使用MyBatis也可以实现,但是,需要额外的配置,而SpringBoot已经完成了相关的配置,所以,可以直接使用!
2.7. 开发处理注册的控制器
首先,需要创建封装返回结果的JsonResult
类,在类中声明需要响应到客户端的JSON数据中的属性:
public class JsonResult {
private Integer state;
}
建议新创建UserController
控制器类,在这个控制器类中处理请求:
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@RequestMapping("reg")
public JsonResult reg(User user) {
User result = userMapper.findByUsername(user.getUsername());
if (result == null) {
userMapper.addnew(user);
return new JsonResult(1);
} else {
return new JsonResult(2);
}
}
}
完成后,重新启动项目,在浏览器中访问http://localhost:8080/reg?username=david&password=1234
执行测试。
2.8. 前端页面
先从前序项目中复制reg.html和jQuery文件到static文件夹下。
为注册的表单设置ID值:
<form id="form-reg">
修改按钮:
<input type="button" onclick="reg()" value="注册" />
然后,引用jQuery文件,并编写代码以提交请求、处理结果:
<script type="text/javascript" src="jquery-3.4.1.min.js"></script>
<script type="text/javascript">
function reg() {
$.ajax({
"url":"/reg",
"data":$("#form-reg").serialize(),
"type":"post",
"dataType":"json",
"success":function (json) {
if (json.state == 1) {
alert("注册成功!");
} else {
alert("注册失败!您尝试注册的用户名已经被占用!");
}
}
});
}
</script>