文章目录
SpringBoot
1、简介
Servlet+jsp:原生开发,十分的麻烦,在web.xml和代码中有很多的重复代码
Spring:从2003年Spring出现到现在,Spring已经变得不是那么简单了,里面配置文件过于繁琐。再加上集成很多的框架,会导致程序变得很臃肿
SpringBoot:简化配置文件,可以简单的理解为Spring的升级版,原来Spring中的很多配置文件要手动配置,而SpringBoot可以自动配置,简化开发,将注意力放在具体的代码上,而不是配置文件
在SpringBoot中自动配置web.xml、Tomcat服务器、Maven依赖等,写一个Web项目就好比写一个Java的Hello World程序一样简单
2、第一个SpringBoot程序
1、打开IEDA,构建一个SpringBoot程序
2、填写项目基本信息
3、勾选启动器(Spring web),相当于帮你配置好了Spring和SpringMVC、Tomcat等
4、选择文件位置,等待下载所有的Maven依赖,第一次下载会比较慢,耐心等待
5、新建Controller包,创建HelloController类
要在主启动类的同级或子级目录下新建包,否则项目识别不了
package org.westos.springbootdemo.controller;
@Controller
public class HelloController {
@RequestMapping("/hello")
//只返回json字符串,而不是页面
@ResponseBody
public String hello() {
return "Hello,springBoot!";
}
}
6、启动主启动类,访问测试
发现Controller返回的Hello,springBoot! 过来了
3、自定义项目启动Log
实现自定义的SpringBoot启动logo
在线banner生成网站:https://www.bootschool.net/ascii
在SpringBoot项目的resource目录下新建banner.txt
,将生成的banner粘贴进去就OK了
4、pom.xml讲解
1、怎么启动的
我们创建的SpringBoot程序中会默认配置一个项目名Application类
,这个类就是当前项目的主启动类,用来开启服务,下来我们看这个类的代码
//只要标注了这个注解,就代表是一个SpringBoot应用
@SpringBootApplication
public class SpringbootdemoApplication {
public static void main(String[] args) {
//启动方法,调用SpringApplication类的run方法
//参数为当前类的class对象,main方法的args参数
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}
下来我们删掉项目原来的主启动类,自己创建一个
//1、添加SpringBootApplication注解
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
//2、调用SpringApplication类的run方法
SpringApplication.run(MyApplication.class, args);
}
}
启动项目,发现项目依然可以启动起来,没有问题。
那么,SpringApplication类的run方法究竟是怎么执行起来的呢?
我们点进源码看一下,发现真正调用的这个run方法
2、依赖怎么配置的
我们并没有像spring中那样配置Tomcat、servlet、spring、Maven依赖等,这些都是怎么生效的呢
pom.xml研究
- 父依赖
<!--pom.xml中父依赖
spring-boot-starter就是一个启动类
1、里面有常用的绝大部分依赖,如果在里面有,就不用在pom.xml文件中单独进行配置了,没有再进行配置
2、进行插件和资源过滤等管理
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--我们点进org.springframework.boot
发现在spring-boot-dependencies中进行了绝大部分依赖的导入
所以在pom.xml就不用再单独进行配置了
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
......
<resources>
<!--资源过滤-->
</resources>
......
<pluginManagement>
<!--插件管理-->
</pluginManagement>
......
- 启动器
官网链接:https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/html/using-spring-boot.html#using-boot,在里面有所有的场景启动器
<dependencies>
<!--spring-boot-starter
场景启动器,会自动导入对应场景的依赖
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
5、三种配置文件
SpringBoot中配置文件的类型:yml、yaml、properties,现在官方推荐使用yml,但是仍然是properties配置文件使用的较多
1、application.properties
在application.properties配置文件中可以编写一些SpringBoot的配置
-
配置Tomcat服务器端口
server.port=9090
这时候我们输入localhost:8080/就访问不到,而输入localhost:9090/就可以
- 还可以进行mybatis、spring等的配置,所有的配置都可以在里面进行
2、yaml配置
我们在pom.xml中点进
发现里面的配置文件过滤有好几种格式
yaml语法:
空格严格要求,缩进严格要求(一个缩进是两个空格)
行首一般是两个空格,代表从属关系,键与值之间一般是一个空格隔开
#普通键值对
key: value
name: zhangsan
#map/对象
key:
k1: v1
k2: v2
person:
name: zhangsan
age: 23
#list/数组
key:
- v1
- v2
pets:
- dog
- cat
#还可以向json一样,有行内写法,比如写person对象
person: {name: zhangsan,age: 23}
#写数组
pets: [dog,cat]
5、SpringBoo集成MyBatis
mybatis所有的包都要手动导入maven依赖
1、导入依赖
<!--导入mybatis和mysql依赖-->
<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>
</dependency>
2、配置mysql连接
- 使用application.properties
#配置mysql数据库
# mysql 5 和 mysql 8 的区别
# mysql 5 :driver-class-name=com.mysql.jdbc.Driver
# mysql 8 :driver-class-name=com.mysql.cj.jdbc.Driver,在URL中要编写时区配置
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding-utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 使用application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123
url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding-utf-8
3、测试数据源
package org.westos.springbootdemo;
@SpringBootTest
class SpringbootdemoApplicationTests {
//自动导入数据源
@Autowired
private DataSource dataSource;
@Test
void contextLoads() throws SQLException {
//查看默认的数据源
System.out.println(dataSource.getClass());
//查看连接信息
Connection connection = dataSource.getConnection();
System.out.println(connection);
//关闭连接
connection.close();
}
}
默认的是Hikari数据源
4、创建pojo包,创建User实体类
导入lombok依赖
<!-- lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
package org.westos.springbootdemo.pojo;
@Data
public class User {
private int id;
private String name;
private String pwd;
}
5、创建Mapper接口及mapper.xml
UserMapper接口
package org.westos.springbootdemo.mapper;
@Repository//代表持久层的
@Mapper
public interface UserMapper {
//获得所有的用户信息
List<User> getUserList();
}
UserMapepr.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">
<mapper namespace="org.westos.springbootdemo.mapper.UserMapper">
<select id="getUserList" resultType="User">
select * from `user`;
</select>
</mapper>
6、配置别名及xml扫面包
mybatis:
type-aliases-package: org.westos.springbootdemo.pojo
mapper-locations: classpath:org/westos/springbootdemo/mapper/*.xml
7、创建UserController类
package org.westos.springbootdemo.controller;
@RestController
public class MyBatisController {
@Autowired
private UserMapper mapper;
@RequestMapping("/mybatis")
public String getUserList() {
List<User> list = mapper.getUserList();
return list.toString();
}
}
8、测试运行
发现有报错,说getUserList方法找不到,所以我们检查UserMapper.xml文件和在application.yml中的配置,没发现什么问题
这个时候,我们打开target目录,发现UserMapper.xml文件根本就没有编译进来
原来是pom.xml文档中的过滤出了问题,点进parent标签里的artifactId值,发现过滤器中没有设置过滤xml文件,所以在target目录中才没有输出UserMapper.xml
那么找到了问题,只需要在pom.xml中添加xml过滤就好了
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<!--添加xml的过滤-->
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
然后运行程序,数据库中的信息就显示出来了
6、SpringBoot页面传值
当我们启动SpringBoot时,输入http://localhost:8080/发现显示的是页面不存在,没有默认的index首页,那么我们怎么定制首页呢?
1、首页存放的位置
首先我们先看首页能存放的位置,在ResourceProperties类下存放着我们的一些资源路径,可以输入类名,点进去看一下
public class ResourceProperties {
//我们可以看到,在CLASSPATH_RESOURCE_LOCATIONS变量中定义了我们资源的存放路径
//除了创建项目开始resources目录下就有的static、templates包之外,还能扫描public、resources目录
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
private String[] staticLocations;
private boolean addMappings;
private final ResourceProperties.Chain chain;
private final ResourceProperties.Cache cache;
所以resources目录下除了已有的static、templates包之外,还能创建public、resources目录
2、测试resources目录下文件夹
在resources目录下创建public、resources目录
在templates目录下创建index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello,这是我的首页!</h1>
</body>
</html>
启动项目,输入localhost:8080/index.html,发现404,页面找不到
这是因为templates目录下的资源只能通过Controller跳转访问,不能直接访问资源,类似于web项目中的WEB-INF目录
将index.html文件挪到public目录下,重新运行项目
发现可以直接访问首页,再将index.html文件分别挪到static和resources目录下,发现同样可以访问到。
templates目录下的文件只能由Controller跳转访问,public、static、resources目录下文件可以直接访问
3、跳转到templates目录下文件
将index.html文件再次挪到templates目录下,创建IndexController类
package org.westos.springbootdemo.controller;
@Controller
public class IndexController {
//只要访问localhost:8080/,就跳转到index.html页面
@RequestMapping("/")
public String index() {
System.out.println("请求进来了");
//跳转到首页
return "index";
}
}
启动项目,访问localhost:8080/,发现页面404
原来这是因为SpringBoot在解析页面的时候默认使用的是thymeleaf,所以要导入thymeleaf的依赖,只要在SpringBoot中编写页面跳转,就要导入这个依赖
<!--导入thymeleaf依赖,如果要编写页面,就要使用这个依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
再次启动项目,发现跳转到templates目录下的首页了
4、页面传值
在后端Controller中使用Model对象传值
在前端使用thymeleaf表达式,th:xxx
接收后端的值
编写IndexController类
package org.westos.springbootdemo.controller;
@Controller
public class IndexController {
//只要访问localhost:8080/,就跳转到index.html页面
@RequestMapping("/")
public String index(Model model) {
//使用Model对象进行传值
//传字段
model.addAttribute("msg","Hello!");
//传对象
model.addAttribute("user",new User(8,"李四","123"));
//传集合
model.addAttribute("lists", Arrays.asList("语文","数学","英语"));
//跳转到首页
return "index";
}
}
编写index.html页面
- 导入命名空间:
xmlns:th="http://www.thymeleaf.or"
- 使用
th:xxx
取值
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.or">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<!--取普通字段-->
<h1 th:text="${msg}"></h1>
<!--取对象属性-->
<h3 th:text="${user.name}"></h3>
<!--取集合遍历-->
<a th:each="list:${lists}" th:text="${list}"></a>
<br>
<!--行内写法,和上面的写法效果一样-->
<a th:each="list:${lists}">[[${list}]]</a>
</body>
</html>
基本thymeleaf表达式语法