一、SptringBoot介绍
Spring Boot实际上是利用Spring Framework 4 自动配置特性完成。编写项目时不需要编写xml文件。发展到现在,Spring Boot已经具有很很大的生态圈,各种主流技术已经都提供了Spring Boot的启动器。
启动器?Spring框架在项目中作用是Spring整合各种其他技术,让其他技术使用更加方便。Spring Boot的启动器实际上就是一个依赖。这个依赖中包含了整个这个技术的相关jar包,还包含了这个技术的自动配置,以前绝大多数XML配置都不需要配置了。当然了,启动器中自动配置无法实现所有内容的自动配置,在使用Spring Boot时还需要进行少量的配置(这个配置不是在xml中了,而是在properties或yml中即可)。如果是Spring自己封装的启动器的artifact id名字满足:spring-boot-starter-xxxx,如果是第三方公司提供的启动满足:xxxx-spring-boot-starter。以后每次使用Spring Boot整合其他技术时首先需要考虑导入启动器。
二、环境搭建
(1)依赖:spring-boot-starter-web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.5</version>
</dependency>
(2)新建启动类
启动类表示项目的启动入口。启动器表示jar包的坐标
必须在包中新建这个类,不能直接放入到java文件夹。在com.bjsxt下新建自定义名称的类。命名常用规范:XXXXApplication。
// 启动类
// 可以自动扫描当前类所在包及子包的注解
// 注意:此类要放入到包中
@SpringBootApplication
public class MyApplication {
public static void main(imagesString[] args) {
SpringApplication.run(MyApplication.class,args);
}
}
(3)配置文件:文件名必须叫application,支持得到文件类型有.properties>.yml>.yaml
(4)目录结构:
/src/main/resources/static:所有希望被放行的静态资源
/src/mian/resources/templates:放thymeleaf、freemarker的,里面的额资源必须通过控制器访问。
三、SpringBoot整合MyBatis
(1)导入依赖:mybatis-spring-boot-starter
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
(2)配置数据库连接参数
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///ssm
spring.datasource.username=root
spring.datasource.password=123456
(3)在配置文件中配置mapper相关配置
# 配置去哪里找mapper.xml文件
mybatis.mapper-locations=classpath:mybatis/**/*.xml
# 为实体类配置别名
mybatis.type-aliases-package=com.bjsxt.pojo
(4)注意事项
mapper接口上要加@Mapper注解,或者在启动类上添加@MapperScan(basePackages="com.bjsxt.mapper"),(当其他类注入这个接口时编辑时报红但是能正常运行如果不想看到报红可以添加@Component注解)
四、SpringBoot整合test单元测试
(1)导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
(2)创建测试类在类上加@SptringBootTest注解
@SpringBootTest
class ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
User user = userMapper.selectById(1);
System.out.println(user);
}
}
五、SpringBoot整合Druid(数据库连接池)
(1)导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.14</version>
</dependency>
(2)配置数据库连接池的参数,appliction
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/sxt4?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf8
username: root
password: 123456
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
max-active: 30
min-idle: 5
# 配置获取连接等待超时的时间
max-wait: 60000
validation-query: SELECT 1 FROM DUAL
#配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
test-while-idle: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 配置DruidStatViewServlet
stat-view-servlet:
# 登录名
login-username: admin
# 登录密码
login-password: admin
url-pattern: /druid/*
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 192.167.10.1,127.0.0.1
reset-enable: false
# 必须启用,要不会404
enabled: truemybatis:
#起别名
type-aliases-package: com.bjsxt.pojo
#扫描mybatis下所有的xml文件
mapper-locations: classpath:mybatis/*.xml
六、SpringBoot整合Thymeleaf(模板)
(1)Thymeleaf介绍
Thymeleaf的主要目标是将优雅的自然模板带到开发工作流程中,并将HTML在浏览器中正确显示,并且可以作为静态原型,让开发团队能更容易地协作。Thymeleaf能够处理HTML,XML,JavaScript,CSS甚至纯文本。长期以来,jsp在视图领域有非常重要的地位,随着时间的变迁,出现了一位新的挑战者:Thymeleaf,Thymeleaf是原生的,不依赖于标签库.它能够在接受原始HTML的地方进行编辑和渲染.因为它没有与Servelet规范耦合,因此Thymeleaf模板能进入jsp所无法涉足的领域。
(2)使用步骤
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
(3)使用方式
为了有提示,修改html页面中<html>标签为
<html xmlns:th="http://www.thymeleaf.org" >
(4)th:text
向HTML标签内部输出信息。
<!--直接向标签内部填充内容,清空原有内容 -->
<span th:text="jqk"></span>
<!-- 从作用于中获取name输入到标签内部 -->
<span th:text="${name}"></span>
(5)th:value
表单元素,设置HTML标签中表单元素value属性时使用。
<input type="text" th:value="${name}"/>
(6)th:if
进行逻辑判断。如果成立该标签生效(显示),如果不成立,此标签无效(不显示)。
注意:判断条件中逻辑判断符号写在${}外面的
<span th:if="${name}!='张三'">会显示</span>(7)
(7)th:each
循环遍历. 示例中u为迭代遍历。
-
th:each=”u,i :${list}” 其中i表示迭代状态。
-
index:当前迭代器的索引 从0开始
-
count:当前迭代对象的计数 从1开始
-
size:被迭代对象的长度
-
even/odd:布尔值,当前循环是否是偶数/奇数 从0开始
-
first:布尔值,当前循环的是否是第一条,如果是返回true否则返回false
-
last:布尔值,当前循环的是否是最后一条,如果是则返回true否则返回false
<table border="1" width="500">
<tr>
<td>编号</td>
<td>姓名</td>
</tr>
<tr th:each="u : ${list}">
<td th:text="${u.id}" ></td>
<td th:text="${u.name}"></td>
</tr>
</table>
(8)th:href
设置href属性的。取值使用@{}取值 getParam代表的是删除地址
<a th:href="@{/getParam(id=1,name='bjsxt')}" >跳转</a>
<!-- 获取作用域值-->
<a th:href="@{/getParam(name=${name})}">跳转二</a>
(9)th:onclick
点击传递参数的单击事件
<th><a href="javascript:viod(0)" th:οnclick="'del('+${stu.sid}+')'">删除</a></th>
(10)内置对象
${#strings.isEmpty(key)} |
---|
判断字符串是否为空,如果为空返回true,否则返回false |
${#strings.contains(msg,'T')} |
判断字符串是否包含指定的子串,如果包含返回true,否则返回false |
${#strings.startsWith(msg,'a')} |
判断当前字符串是否以子串开头,如果是返回true,否则返回false |
${#strings.endsWith(msg,'a')} |
判断当前字符串是否以子串结尾,如果是返回true,否则返回false |
${#strings.length(msg)} |
返回字符串的长度 |
${#strings.indexOf(msg,'h')} |
查找子串的位置,并返回该子串的下标,如果没找到则返回-1 |
${#dates.format(key)} |
---|
格式化日期,默认的以浏览器默认语言为格式化标准 |
${#dates.format(key,'yyyy/MM/dd')} |
按照自定义的格式做日期转换 |
${#dates.year(key)}${#dates.month(key)}${#dates.day(key)} |
Year:取年。 Month:取月。 Day:取日 |
七、 SpringBoot整合FreeMarker
(1)导入依赖
()<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
(2)FreeMarker基础 之常用指令
-
注释,即<#‐‐和‐‐>,介于其之间的内容会被freemarker忽略
-
插值(Interpolation):即${..}部分,freemarker会用真实的值代替${..}
-
FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。
-
文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。
(3)List指令
<#list stus as stu>
<tr><td>${stu_index+1}</td>
<td>${stu.name}</td>
<td>${stu.age}</td>
<td>${stu.mondy}</td>
</tr>
</#list>
(4)if指令
<#list stus as stu>
<tr>
<td <#if stu.name =='小明'>style="background:red;"</#if>>${stu.name}</td>
<td>${stu.age}</td>
<td>${stu.mondy}</td>
</tr>
</#list>
八、Spring Boot整合PageHelper(分页)
(1)导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
九、SpringBoot整合JSP依赖
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
十、SpringBoot整合Logback
(1)Logback读取配置文件的步骤
-
在classpath下查找文件logback-test.xml
-
如果文件不存在,则在classpath下查找logback.xml
(2)logback.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${catalina.base}/logs/" />
<!-- 控制台输出 -->
<appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="Stdout" />
<appender-ref ref="RollingFile" />
</root>
<logger name="com.bjsxt.mapper" level="DEBUG"></logger>
<!--日志异步到数据库 -->
<!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
日志异步到数据库
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
连接池
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender> -->
</configuration>
十一、SpringBoot工具
(1)SpringBoot打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
(2)SpringBoot开发者工具
使用开发者工具包不需要重启。页面的异常信息更加全面
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
十二、显示异常页面
(1)设置具体的状态码页面
在templates/下新建error文件夹,在error中新建:状态码.html的页面。例如当出现500时显示的页面为500.html
(2)使用x进行模糊匹配
当出现5开头状态码的错误时,显示页面可以命名为5xx.html
(3)统一错误显示页面
在templates下新建error.html。如果项目中不存在具体状态码的页面或没有使用x成功匹配的页面时,显示error.html作为错误显示页面。
十三、SpringBoot中的Bean管理
Spring Boot 由于没有XML文件,所以所有的Bean管理都放入在一个配置类中实现。
配置类就是类上具有@Configuration的类。这个类就相当于之前的applicationContext.xml
注意:
-
配置类要有@Configuration
-
方法要有@Bean
package com.bjsxt.cofig;
import com.bjsxt.pojo.Student;
import com.bjsxt.pojo.Teacher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public Student student() {
Student student = new Student();
student.setId(1);
student.setName("张三");
return student;
}
@Bean
public Teacher teacher(Student student){
Teacher teacher = new Teacher();
teacher.setId(1);
teacher.setName("张老师");
teacher.setStudent(student);
return teacher;
}
}
十四、SpringBoot配置拦截器
(1)新建拦截器类
@Component
public class DemoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行拦截器");
return false;
}
}
(2)配置拦截器
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Autowired
private DemoInterceptor demoInterceptor;
//配置拦截器的映射
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor).addPathPatterns("/").excludePathPatterns("/login");
}
}