SpringBoot是一个默认就集成了绝大部分常规开发时都使用的依赖、完成了绝大部分的常规配置、基于SpringMVC的框架。
SpringBoot的核心思想是约定大于配置,因为在传统的SSM项目中,创建项目后,需要自定义大量的配置,而不同的项目的配置却大同小异,甚至就是完全相同,所以,SpringBoot就直接完成了相关的配置,并要求使用者遵循配置值的约定,例如它将DispatcherServlet
的映射路径配置为/*
,则使用者就按照这个配置值使用即可,无须自已编写配置!
如果要创建SpringBoot项目,常规的创建方式有:
本次使用以上介绍的第3种做法,首先,打开https://start.spring.io/
网站,在网页中主要确定几项:
完成后,点击页面中的Generate按钮就可以开始生成项目并自动下载该项目!
解压下载得到的压缩包文件,将得到项目文件夹,为了便于管理项目,推荐将该文件夹移动到Workspace中。
然后,在Eclipse中,通过Import > Existing Maven Projects导入项目,默认的项目结构并不完整,可以暂且不管,后续项目更新完成后就会恢复正常,导入项目后,项目会开始自动下载所需的依赖,这个过程中只需要保证能够连接到Maven服务器,确保能下载所依赖的jar包,然后,等待即可,如果项目没有开始自动下载,对项目点右键,选择Maven > Update Project更新即可。
建议使用4.11及以上版本的Eclipse,如果使用的是较低版本的Eclipse,在pom.xml文件中可能报错,这是因为较低版本的Eclipse中内置的Maven配置版本较低导致的,而较高版本的Eclipse中内置的Maven配置版本较高,就不会出错,并且,即使出错,也不影响正常的开发和运行。
展开项目中的src/test/java,其中,已经存在cn.demo.sample
包,这个包的名称是创建项目时填写的Group和Artifact决定的,这个包的名称是不允许修改的,并且,项目中所有的单元测试类都必须放在这个包或其子包中!在包中已经存在SampleApplicationTests
类,类中有contextLoads()
方法,通过单元测试的方式,直接测试方法,如果能成功运行,则表示测试环境是正常的!
展开项目中的src/main/java,其中,已经存在cn.demo.sample
包,这个包的名称是创建项目时填写的Group和Artifact决定的,这个包的名称是不允许修改的,并且,项目中所有的单元测试类都必须放在这个包或其子包中!在包中已经存在SampleApplication
类,它是项目的启动类,类中有main()
方法,这个main()
就是整个项目的启动方法。
在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端口!
另外,如果在SpringBoot项目中,还会使用到Thymeleaf等模版技术,应该将模版页面放在**src/main/resources/templates/**文件夹下。
在src/main/java下的cn.demo.sample
包是SpringBoot项目默认组件扫描的根包,所以,在项目中创建的所有组件类(需要由Spring框架创建并管理的)必须放在这个包或其子包中!
在cn.demo.sample
包中创建HelloController
控制器,在类的声明之前添加@Controller
注解,并在类中添加处理请求的方法,例如:
package cn.demo.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默认已经完成了这些配置,所以,可以直接使用!
在SpringBoot项目中,如果涉及数据库编程,需要自行添加数据库相关的依赖,虽然SpringBoot默认能集成绝大部分常规依赖,但是,它无法直接确定每个开发者使用的是哪种数据库、哪种数据库编程时使用的框架,所以,是需要自行添加的!
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.1
mysql
mysql-connector-java
runtime
当SpringBoot项目添加了数据库相关的依赖后,启动项目时,就会自动尝试读取数据库连接的配置信息,如果没有配置信息,则启动项目会报错!
所以,需要在application.properties中添加配置:
spring.datasource.url=jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
添加以上配置后,就可以正常启动项目,但是,启动项目时,只会读取配置信息,并不会执行连接,所以,即使以上配置信息中存在错误的值,也不影响项目启动,同样,也不无法得知以上配置信息是否正确!
所以,接下来,需要尝试连接到数据库,以确认以上配置信息是否正确!可以在src/test/java中cn.demo.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());
}
}
首先,需要创建用户数据类,用于封装用户数据的属性,所以,在src/main/java的cn.demo.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()方法
}
注册功能:先根据用户尝试注册的用户名查询数据,如果查询到某个结果,则表示该用户名已经被占用,不允许插入新的用户数据,如果查询不到结果,则该用户名没有被人占用,将用户尝试注册的信息插入到数据库中即可!所以,涉及操作分别是根据用户名查询用户数据和插入用户数据。
先cn.demo.sample
包中创建UserMapper
接口,并在接口中添加抽象方法:
package cn.demo.sample;
public interface UserMapper {
Integer addnew(User user);
User findByUsername(String username);
}
写完接口后,需要配置接口文件的位置,配置的做法可以是:
@Mapper
注解,使用这种做法,就要求每一个接口都需要添加该注解;SampleApplication
)的声明之前,添加@MapperScan("接口所在的包")
注解,然后,所有接口都放在配置的包中即可!一般推荐使用以上的第2种做法,例如:
@SpringBootApplication
@MapperScan("cn.demo.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语句:
INSERT INTO
t_user (username, password, age, phone, email )
VALUES
(#{username}, #{password}, #{age}, #{phone}, #{email})
在执行单元测试之前,还需要指定这些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("[email protected]");
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已经完成了相关的配置,所以,可以直接使用!
首先,需要创建封装返回结果的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
执行测试。
先创建reg.html和jQuery文件到static文件夹下。
为注册的表单设置ID值:
修改按钮:
然后,引用jQuery文件,并编写代码以提交请求、处理结果: