前后端分离模式
浏览器发送请求到前端服务器,前端服务器会将该请求路径下的静态资源返回给浏览器,返回的同时会发送异步请求给后端服务器,后端服务器将数据查询出来并以json格式将数据返回,前端服务器将返回的数据通过jQuery等方式将数据渲染到页面上进行响应
传统的开发模式:
- 前后端严重耦合,前端需要改bug调试时,需要在当前电脑安装一整套后端的开发工具,启动后端程序
- 还要求后端人员会html,js等前端语言
- 前端页面也会嵌入很多后端的代码
- 一旦后端换了一套语言,前端也需要重新开发
- 沟通成本,调试成本,前后端开发进度相互影响,从而大大降低开发效率
前后端分离:
- 前后端责任清晰,前端只需要进行页面端的展示,后端只需要提供数据即可
- 两者可同时进行开发,提高开发效率
- 可应对复杂多变的前端需求
- 增强代码可维护性
springboot+crud
准备阶段
-
将之前ssm中的domain、mapper、query、service、web包中的所有类迁移到springboot项目中,并导入相关的依赖坐标
-
在配置文件中配置数据库连接四要素,springboot采用的默认连接池是 Hikari,如果要想使用 Druid 作为连接池也是可以的,直接导入Druid的场景启动器即可,就会把Hikari覆盖掉
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql:///rbac?serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=admin
<!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency>
集成MyBatis
-
Mybatis 集成到 SpringBoot需添加整合依赖
mybatis-spring-boot-starter
-
配置 MapperScannerConfigurer 对象,扫描指定的mapper包,在主程序类上添加
@MapperScan
@MapperScan("cn.kjcoder.mapper") //如果需要配置domain包中实体类的别名,在主配置文件中配置 mybatis.type-aliases-package=cn.kjcoder.domain //打印 SQL 日志 logging.level.cn.kjcoder.mapper=trace
注:如关联数据库配置文件,数据源,SqlSessionFactory工厂,springboot都已经帮我们配置好了
-
事务管理,只需在业务层实现类上或者其方法上直接贴
@Transactional
注解即可 -
配置代理,Spring Boot 默认优先选择 CGLIB 代理,如果需要改为优先使用 JDK 代理,需要做以下配置
spring.aop.proxy-target-class=false
集成web
-
mvc集成到 SpringBoot需添加整合依赖
spring-boot-starter-web
-
静态资源处理
# 告诉 Spring Boot 什么访问的路径是找静态资源 spring.mvc.static-path-pattern=/static/**
集成 Thymeleaf
- 添加依赖
spring-boot-starter-thymeleaf
- 禁用掉缓存
spring.thymeleaf.cache=false
控制器增强器用于5xx错误
自己定义一个控制器增强器,专门用于统一异常处理,该方式一般用于 5xx 类错误
@ControllerAdvice// 控制器增强器
public class ExceptionControllerAdvice {
@ExceptionHandler(RuntimeException.class) //处理什么类型的异常
public String handleRuntimeException(Model model,RuntimeException e){
e.printStackTrace();
model.addAttribute("errorMsg",e.getMessage());
return "error";
}
@ExceptionHandler(ArithmeticException.class)// 处理什么类型的异常
public String handleRuntimeException(Model model,ArithmeticException e){
e.printStackTrace();
model.addAttribute("errorMsg","除数不能为零");
return "error";//指定错误页面视图名称
}
}
<!--页面进行取值-->
<span th:text="${errorMsg}"></span>