建筑设计软件公司,极限优化wordpress,网站链接查询,做网页是什么专业Springboot学习笔记——1 一、快速上手Springboot1.1、Springboot入门程序开发1.1.1、IDEA创建Springboot项目1.1.2、官网创建Springboot项目1.1.3、阿里云创建Springboot项目1.1.4、手工制作Springboot项目 1.2、隐藏文件或文件夹1.3、入门案例解析1.3.1、parent1.3.2、starte… Springboot学习笔记——1 一、快速上手Springboot1.1、Springboot入门程序开发1.1.1、IDEA创建Springboot项目1.1.2、官网创建Springboot项目1.1.3、阿里云创建Springboot项目1.1.4、手工制作Springboot项目 1.2、隐藏文件或文件夹1.3、入门案例解析1.3.1、parent1.3.2、starter1.3.3、引导类1.3.4、内嵌tomact 1.4、REST开发1.4.1、REST风格介绍1.4.2、入门案例1.4.3、RESTful快速开发 二、基础配置2.1、属性配置2.2、三种属性配置方式2.3、yaml2.3.1、读取yaml单一属性数据2.3.2、yaml文件中的变量引用2.3.3、读取yaml全部属性数据2.3.4、读取yaml引用类型属性数据 三、整合第三方技术3.1、整合Junit3.2、整合Mybatis3.3、整合Mybatis-Plus3.4、整合Druid 四、基于SpringBoot的SSMP整合案例4.1、模块开发4.2、实体类快速开发4.3、数据层开发基础CUBD4.3.1、开启MP运行日志4.3.2、分页4.3.3、数据层标准开发按条件查询 4.4、业务层开发基础CUBD4.4.1、业务层快速开发基于MyBatisPlus框架 4.5、表现层开发4.5.1、表现层消息一致性处理 4.6、前后端协议联调4.6.1、添加功能4.6.2、删除功能4.6.3、修改功能4.6.4、异常消息处理4.6.5、分页4.6.6、删除功能维护4.6.7、按条件查询 4.7、案例基本步骤 一、快速上手Springboot
1.1、Springboot入门程序开发
1.1.1、IDEA创建Springboot项目
SpringBoot是由Pivotal团队提供的全新框架其设计目的是用来简化Spring应用的初始搭建以及开发过程
创建新模块选择Spring Initializr并配置模块相关基础信息 选择当前模块需要使用的技术集 开发控制器类
//Rest模式
RestController
RequestMapping(/books)
public class BookController {GetMappingpublic String getById(){System.out.println(springboot is running...);return springboot is running...;}
}运行自动生成Application类 最简SpringBoot程序所包含的基础文件 pom.xml文件 ?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.1.4/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.Smulll/groupIdartifactIdspringboot_01_02/artifactIdversion0.0.1-SNAPSHOT/versionnamespringboot_01_02/namedescriptionspringboot_01_02/descriptionpropertiesjava.version17/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies
/projectApplication类 SpringBootApplication
public class Springboot0102Application {public static void main(String[] args) {SpringApplication.run(Springboot0102Application.class, args);}
}Spring程序与SpringBoot程序对比
类/配置文件SpringSpringBootpom文件中的坐标手工添加勾选添加web3.0配置类手工制作无Spring/SpringMVC配置类手工制作无控制器手工制作手工制作
1.1.2、官网创建Springboot项目
创建项目也可以通过官网进行创建 springboot项目创建官网 1.1.3、阿里云创建Springboot项目
通过阿里云进行创建项目 阿里云创建项目官网 阿里云提供的坐标版本较低如果需要使用高版本进入工程后手工切换SpringBoot版本阿里云提供的工程模板与Spring官网提供的工程模板略有不同 1.1.4、手工制作Springboot项目
手工创建项目手工导入坐标
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.1.4/versionrelativePath/!-- lookup parent from repository --/parentgroupIdcom.Smulll/groupIdartifactIdspringboot_01_02/artifactIdversion0.0.1-SNAPSHOT/version dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies
/project手工创建项目手工制作引导类
SpringBootApplication
public class Springboot0102Application {public static void main(String[] args) {SpringApplication.run(Springboot0102Application.class, args);}
}1.2、隐藏文件或文件夹 1.3、入门案例解析 SpringBoot是由Pivotal团队提供的全新框架其设计目的是用来简化Spring应用的初始搭建以及开发过程 Spring程序缺点 依赖设置繁琐配置繁琐 SpringBoot程序优点 起步依赖简化依赖配置)自动配置简化常用工程相关配置)辅助功能内置服务器…
1.3.1、parent 将依赖合并 再进行统一管理
开发SpringBoot程序要继承spring-boot-starter-parentspring-boot-starter-parent中定义了若干个依赖管理继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突继承parent的形式也可以采用引入依赖的形式实现效果
1.3.2、starter
spring-boot-starter-web.pom
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdversion2.5.4/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspringweb/artifactIdversion5.3.9/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-webmvc/artifactIdversion5.3.9/version/dependency
/dependenciesstarter SpringBoot中常见项目名称定义了当前项目使用的所有依赖坐标以达到减少依赖配置的目的 parent 所有SpringBoot项目要继承的项目定义了若干个坐标版本号依赖管理而非依赖)以达到减少依赖冲突的目的spring-boot-starter-parent各版本间存在着诸多坐标版本不同 实际开发 使用任意坐标时仅书写GAV中的G和Av由SpringBoot提供除非SpringBoot未提供对应版本V如发生坐标错误再指定Version(要小心版本冲突)
1.3.3、引导类
启动方式
SpringBootApplication
public class Springboot0102Application {public static void main(String[] args) {SpringApplication.run(Springboot0102Application.class, args);}
}SpringBoot的引导类是Boot工程的执行入口运行main方法就可以启动项目SpringBoot工程运行后初始化Spring容器扫描引导类所在包加载bean
1.3.4、内嵌tomact
辅助功能
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency在其内部导入一个
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdversion2.5.4/version
/dependency其内部有个核心包进行运行
dependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-core/artifactIdversion9.0.52/version
/dependency内置服务器
tomcat(默认) apache出品粉丝多应用面广负载了若干较重的组件jetty 更轻量级负载性能远不及tomcatundertow undertow负载性能勉强跑赢tomcat
1.4、REST开发
1.4.1、REST风格介绍 REST (Representational State Transfer)表现形式状态转换 传统风格资源描述形式 http://localhost/user/getById?id1 http:/ localhost/user/saveUserREST风格描述形式 http:/ localhost/user/1 http:/ localhost/user 优点 隐藏资源的访问行为无法通过地址得知对资源是何种操作书写简化 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作 http://localhost/users 查询全部用户信息 GET查询http://localhost/users/1 查询指定用户信息 GET查询http://localhost/users 添加用户信息 POST新增/保存http://localhost/users 修改用户信息 PUT修改/更新http://localhost/users/1 删除用户信息 DELETE删除 根据REST风格对资源进行访问称为RESTful
注意事项 上述行为是约定方式约定不是规范可以打破所以称REST风格而不是REST规范描述模块的名称通常使用复数也就是加s的格式描述表示此类资源而非单个资源例如: users、books、accounts… 1.4.2、入门案例
设定http请求动作动词
RequestMapping(value /users,method RequestMethod.PUT)
ResponseBody
public String update(RequestBody User user){System.out.println(user update...user);return {module:user update};
};设定请求参数路径变量
RequestMapping(value /users/{id},method RequestMethod.GET)
ResponseBody
public String getById(PathVariable Integer id){System.out.println(user getById...id);return {module:user getById};
};名称:RequestMapping类型:方法注解位置:SpringMVC控制器方法定义上方作用:设置当前控制器方法请求访问路径
RequestMapping(value /users,method RequestMethod.POST)
ResponseBody
public String save(){System.out.println(user save...);return {module:user save};
};属性 value默认请求访问路径methodhttp请求动作标准动作GET/POST/PUT/DELETE
名称:PathVariable类型:形参注解位置: SpringMVC控制器方法形参定义前面作用:绑定路径参数与处理器方法形参间的关系要求路径参数名与形参名一一对应范例:
RequestMapping(value /users/{id},method RequestMethod.DELETE)
ResponseBody
public String delete(PathVariable Integer id){System.out.println(user delete...id);return {module:user delete};
};接收参数的三种方式
RequestBody RequestRaram PathVariable
区别 RequestParam用于接收url地址传参或表单传参RequestBody用于接收json数据PathVariable用于接收路径参数使用{参数名称}描述路径参数 应用 后期开发中发送请求参数超过1个时以json格式为主RequestBody应用较广如果发送非json格式数据选用RequestParam接收请求参数采用RESTful进行开发当参数数量较少时例如1个可以采用PathVariable接收请求路径变量通常用于传递id值
1.4.3、RESTful快速开发
RequestMapping(value /books,methodRequestMethod.POST)
ResponseBody
public String save(RequestBody Book book){system.out.println(book save. . . book);return {module:book save};
}
RequestMapping(value /books,methodRequestMethod.PUT)
ResponseBody
public String update(RequestBody Book book){system.out.println( book update. . . book);return {module:book update};
}名称:RestController类型:类注解位置:基于SpringMNC的RESTful开发控制器类定义上方作用:设置当前控制器类为RESTful风格等同于Controller与ResponseBody两个注解组合功能范例:
RestController
public class BookController{
}名称:GetMappingPostMapping PutMappingDeleteMapping类型:方法注解位置:基于SpringMVC的RESTful开发控制器方法定义上方作用:设置当前控制器方法请求访问路径与请求动作每种对应一个请求动作例如GetMapping对应GET请求范例:
GetMapping(/{id})
public String getById(PathVariable Integer id){System.out.println(user getById...id);return {module:user getById};
};属性 value默认请求访问路径
二、基础配置
复制工程
原则 保留工程基础结构抹掉原始工程痕迹
在工作空间中复制对应工程并修改工程名称删除与Idea相关配置文件仅保留src目录与pom. xml文件修改pom.xml文件中的artifactId与新工程/模块名相同删除name标签可选)保留备份工程供后期使用
2.1、属性配置 修改服务器端口 SpringBoot默认配置文件application.properties通过键值对配置对应属性 修改配置 修改服务器端口 server.port80关闭运行日志图标banner spring.main.banner-modeoff设置日志相关 logging.level.root errorSpringBoot内置属性查询 参考官方文档
2.2、三种属性配置方式
application.properties
server.port80application. yml
server:port: 81application. yaml
server:port: 82SpringBoot配置文件加载顺序 application.properties application.yml application.yaml 不同配置文件中相同配置按照加载优先级相互覆盖不同配置文件中不同配置全部保留
2.3、yaml
YAML ( YAML Ain t Markup Language) ,一种数据序列化格式优点 容易阅读容易与脚本语言交互以数据为核心重数据轻格式 YAML文件扩展名 .yml(主流).yaml
yaml语法规则
大小写敏感属性层级关系使用多行描述每行结尾使用冒号结束使用缩进表示层级关系同层级左侧对齐只允许使用空格不允许使用Tab键)属性值前面添加空格属性名与属性值之间使用冒号空格作为分隔)# 表示注释
核心规则数据前面要加空格与冒号隔开
字面值表示方式
boolean: TRUE #TRUE ,true ,True ,FALSE,false ,False均可
float: 3.14 #6.8523015e5#支持科学计数法
int: 123 #0b1010_0111_0100_1010_1110#支持二进制、八进制、十六进制
null: ~ #使用~表示null
string: Helloworld #字符串可以直接书写
string2: Hello world #可以使用双引号包裹特殊字符
date: 2018-02-17 #日期必须使用yyyy-MM-dd格式
datetime: 2018-02-17T15:02:3108:00 #时间和日期之间使用T连接最后使用代表时区数组表示方式在属性名书写位置的下方使用减号作为数据开始符号每行书写一个数据减号与数据间空格分隔
likes:- game- sleep- musicuser1:name: zhangsanage: 23likes:- Java- 前端- 大数据
likes1: [game,sleep,music]2.3.1、读取yaml单一属性数据
使用Value读取单个数据属性名引用方式∶${一级属性名.二级属性名...}
likes:- game- sleep- musicuser1:name: zhangsanage: 23RestController
RequestMapping(/Books)
public class BookController {Value(${country})private String country1;Value(${user1.name})private String name1;Value(${likes[1]})private String likes;
}2.3.2、yaml文件中的变量引用
在配置文件中可以使用属性名引用方式引用数据
baseDir: /usr/ local/fire
center:dataDir: ${baseDir}/datatmpDir: ${baseDir}/tmplogDir: ${baseDir}/logmsgDir: ${baseDir}/msgDir属性值中如果出现转义字符需要使用双引号包裹
lession: Spring\tboot\nlesson2.3.3、读取yaml全部属性数据
RestController
RequestMapping(/Books)
public class BookController {Autowiredprivate Environment environment;GetMappingpublic void Books(){System.out.println(environment.getProperty(user1.name));System.out.println(environment.getProperty(likes[1]));}
}likes:- game- sleep- musicuser1:name: zhangsanage: 23使用Environment对象封装全部配置信息使用Autowired自动装配数据到Environment对象
2.3.4、读取yaml引用类型属性数据
自定义对象封装指定类
datasource:driver: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost/springboot_dbusername: rootpassword: 123456Component
ConfigurationProperties(datasource)
public class Datasource {private String driver;private String url;private String username;private String password;public Datasource() {}public Datasource(String driver, String url, String username, String password) {this.driver driver;this.url url;this.username username;this.password password;}public String getDriver() {return driver;}public void setDriver(String driver) {this.driver driver;}public String getUrl() {return url;}public void setUrl(String url) {this.url url;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}public String toString() {return Datasource{driver driver , url url , username username , password password };}
}RestController
RequestMapping(/Books)
public class BookController {Autowiredprivate Datasource datasource;
}使用ConfigurationProperties注解绑定配置信息到封装类中封装类需要定义为Spring管理的bean否则无法进行属性注入
三、整合第三方技术
3.1、整合Junit
SpringBoot整合Junit
SpringBootTest
class Springboot0101ApplicationTests {Autowiredprivate BooksDao booksDao;Testvoid contextLoads() {booksDao.save();}
}名称: SpringBootTest类型:测试类注解位置:测试类定义上方作用:设置JUnit加载的SpringBoot启动类范例:
SpringBootTest
class Springboot0101ApplicationTests {}SpringBootTest(classes Springboot0101Application.class )
class Springboot0101ApplicationTests {}相关属性 classes:设置SpringBoot启动类
注意事项 如果测试类在SpringBoot启动类的包或子包中可以省略启动类的设置也就是省略classes的设定 步骤
导入测试对应的starter测试类使用SpringBootTest修饰使用自动装配的形式添加要测试的对象
3.2、整合Mybatis
核心配置数据库连接相关信息练什么连谁什么权限映射配置SQL映射XML/注解
创建一个全新的模块选择Spring初始化并配置模块相关基础信息 选择当前模块需要使用的技术集MyBatis,MySQL 设置数据源参数
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/springbaseusername: rootpassword: xxxxxx定义数据层接口与映射配置
Mapper
public interface AccountDao {Select(select * from tb_account where id #{id})public Account SelectById(Integer id);
}测试类中注入dao接口测试功能
SpringBootTest
class Springboot03MybatisApplicationTests {Autowiredprivate AccountDao accountDao;Testvoid contextLoads() {Account account accountDao.SelectById(1);System.out.println(account);}
}注意 MySQL 8.X驱动强制要求设置时区 修改url添加serverTimezone设定修改MySQL数据库配置略) 驱动类过时提醒更换为com.mysql.cj.jdbc.Driver
3.3、整合Mybatis-Plus
手工添加SpringBoot整合MyBatis-Plus的坐标可以通过mvnrepository获取
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version
/dependency注意事项 由于SpringBoot中未收录MyBatis-plus的坐标版本需要指定对应的Version 定义数据层接口与映射文件继承BaseMapper
Mapper
public interface AccountDao extends BaseMapperAccount {
}3.4、整合Druid
指定数据源类型
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springbase?serverTimezoneUTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSource导入Druid对应的starter
dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.19/version
/dependency变更Druid的配置方式
spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springbase?serverTimezoneUTCusername: rootpassword: 123456四、基于SpringBoot的SSMP整合案例
案例实现方案分析 实体类开发——使用Lombok快速制作实体类Dao开发–整合MyBatisPlus制作数据层测试类service开发——基于MyBatisPlus进行增量开发制作业务层测试类Controller开啊发——基于Restful开发使用PostMan测试接口功能Controller开发——前后端开发协议制作页面开发——基于VUEElementUI制作前后端联调页面数据处理页面消息处理 列表、新增、修改、删除、分页、查询 项目异常处理按条件查询——页面功能调整、Controller修正功能、Service修正功能
4.1、模块开发 勾选springMVC与MySQL坐标修改配置文件为yml格式设置端口为80方便访问
4.2、实体类快速开发
Lombok,一个Java类库提供了一组注解简化POJ0实体类开发
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId
/dependencylombok版本由SpringBoot提供无需指定版本常用注解Data
Data
public class Book {private Integer id;private String type;private String name;private String description;
}为当前实体类在编译期设置对应的get/set方法toString方法hashCode方法equals方法等
4.3、数据层开发基础CUBD
技术实现方案 MyBatisPlusDruid 导入MyBatisPlus与Druid对应的starter
!--mybatis-plus--
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version
/dependency
!--druid--
dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.19/version
/dependency配置数据源与MyBatisPlus对应的基础配置id生成策略使用数据库自增策略
server:port: 80spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springbootbase?serverTimezoneUTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcemybatis-plus:global-config:db-config:table-prefix: tb_id-type: auto继承BaseMapper并指定泛型
Mapper
public interface bookDao extends BaseMapperBook {
}制作测试类测试结果
SpringBootTest
public class bookTestCase {Autowiredprivate bookDao bookDao;Testvoid TestSelectById(){Book book bookDao.selectById(1);System.out.println(book);}
}4.3.1、开启MP运行日志
为方便调试可以开启MyBatisPlus的日志
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl4.3.2、分页
分页操作需要设定分页对象IPage
Test
void TestGetPage(){Page page new Page(1,5);bookDao.selectPage(page,null);
}IPage对象中封装了分页操作中的所有数据 数据当前页码值每页数据总量最大页码值数据总量 分页操作是在MNyBatisPlus的常规操作基础上增强得到内部是动态的拼写SQL语句因此需要增强对应的功能使用MyBatisPlus拦截器实现
Configuration
public class MPConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){//定义MP拦截器MybatisPlusInterceptor mybatisPlusInterceptor new MybatisPlusInterceptor();//添加具体的拦截器mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}4.3.3、数据层标准开发按条件查询
使用Querywrapper对象封装查询条件推荐使用LambdaQuerywrapper对象所有查询操作封装成方法调用
Test
void TestGetBy(){QueryWrapperBook qw new QueryWrapper();qw.like(name, Spring);bookDao.selectList(qw);
}支持动态拼写查询条件
Test
void TestGetBy2(){String name Spring;LambdaQueryWrapperBook lqw new LambdaQueryWrapper();//当name不等于null时走该语句lqw.like(name!null,Book::getName, name);//执行分页查询加上条件查询Page page new Page(1,5);bookDao.selectPage(page,lqw);
}4.4、业务层开发基础CUBD Service层接口定义与数据层接口定义具有较大区别不要混用 selectByUserNameAndPassword (String username,String password);login (String username,String password); 定义接口
public interface BookService {Boolean save(Book book);Boolean update(Book book);Boolean delete(Integer id);Book getById(Integer id);ListBook getAll();IPageBook getByPage(Integer current,Integer size);
}实现类定义
Service
public class BookServiceImpl implements BookService {Autowiredprivate bookDao bookDao;Overridepublic Boolean save(Book book) {return bookDao.insert(book)0;}Overridepublic Boolean update(Book book) {return bookDao.updateById(book)0;}Overridepublic Boolean delete(Integer id) {return bookDao.deleteById(id)0;}Overridepublic Book getById(Integer id) {return bookDao.selectById(id);}Overridepublic ListBook getAll() {return bookDao.selectList(null);}Overridepublic IPageBook getByPage(Integer current, Integer size) {PageBook bookPage new Page(current, size);bookDao.selectPage(bookPage,null);return bookPage;}
}测试类定义
SpringBootTest
public class bookServiceTestCase {Autowiredprivate BookService bookService;Testvoid getById(){Book byId bookService.getById(1);System.out.println(byId);}Testvoid getAll(){ListBook all bookService.getAll();System.out.println(all);}Testvoid testPage(){IPageBook byPage bookService.getByPage(0, 5);System.out.println(byPage.getPages());System.out.println(byPage.getCurrent());System.out.println(byPage.getSize());System.out.println(byPage.getTotal());System.out.println(byPage.getRecords());}
}4.4.1、业务层快速开发基于MyBatisPlus框架 快速开发方案 使用MyBatisPlus提供有业务层通用接口ISerivceT)与业务层通用实现类(ServiceImplM,T)在通用类基础上做功能重载或功能追加注意重载时不要覆盖原始操作避免原始提供的功能丢失 定义接口
public interface IBookService extends IServiceBook {
}如果不满足使用需要可以自行添加
public interface IBookService extends IServiceBook {Boolean delete(Book book);Boolean insert(Book book);
}实现类定义
Service
public class BookServiceImpl extends ServiceImplbookDao,Book implements IBookService {Overridepublic Boolean delete(Book book) {return null;}Overridepublic Boolean insert(Book book) {return null;}
}4.5、表现层开发
基于Restful进行表现层接口开发使用Postman测试表现层接口功能
功能测试
RestController
RequestMapping(/books)
public class bookController {Autowiredprivate IBookService iBookService;GetMappingpublic ListBook GetAll(){return iBookService.list();}PostMappingpublic Boolean save(RequestBody Book book){boolean save iBookService.save(book);return save;}PutMappingpublic Boolean update(RequestBody Book book){boolean b iBookService.updateById(book);return b;}DeleteMapping(/{id})public Boolean delete(PathVariable Integer id){boolean b iBookService.removeById(id);return b;}GetMapping(/{id})public Book getById(PathVariable Integer id){return iBookService.getById(id);}GetMapping({current}/{size})public IPageBook getPage(PathVariable Integer current,PathVariable Integer size){return iBookService.getPage(current,size);}
}getPage在Service层重写
Override
public PageBook getPage(Integer current, Integer size) {PageBook bookPage new Page(current, size);return bookDao.selectPage(bookPage, null);
}接收参数 实体数据RequestBody路径变量PathVariable
4.5.1、表现层消息一致性处理
增删改
true查单条
{id: 5,type: 操作系统,name: 深入理解计算机系统,description: 这本书是一本导论型作品并不单单的讲操作系统它创造性的把操作系统体系结构数字逻辑以及编译原理这些计算机基础学科知识有机的结合起来。
}查多条
[{id: 1,type: 计算机理论,name: Spring实战 第五版,description: Spring经典入门教学深入理解Spring理解技术内幕},{id: 2,type: 计算机理论,name: Spring实战 第五版,description: Spring经典入门教学深入理解Spring理解技术内幕},{id: 3,type: 计算机理论,name: Spring实战 第五版,description: Spring经典入门教学深入理解Spring理解技术内幕},{id: 4,type: 操作系统,name: 现代操作系统,description: 本书虽然是理论的书但是里面的一些操作系统算法介绍都挺非常的详细有关操作系统的各种理论也是非常详实。},{id: 5,type: 操作系统,name: 深入理解计算机系统,description: 这本书是一本导论型作品并不单单的讲操作系统它创造性的把操作系统体系结构数字逻辑以及编译原理这些计算机基础学科知识有机的结合起来。}
]设计表现层返回结果的模型类用于后端与前端进行数据格式统一也称为前后端数据协议
Data
public class R {private Boolean flag;private Object data;public R(Boolean flag) {this.flag flag;}public R() {}public R(Boolean flag, Object data) {this.flag flag;this.data data;}
}表现层接口统一返回值类型结果
RestController
RequestMapping(/books)
public class bookController {Autowiredprivate IBookService iBookService;GetMappingpublic R GetAll(){return new R(true,iBookService.list());}PostMappingpublic R save(RequestBody Book book){return new R(iBookService.save(book));}PutMappingpublic R update(RequestBody Book book){return new R(iBookService.updateById(book));}DeleteMapping(/{id})public R delete(PathVariable Integer id){return new R(iBookService.removeById(id));}GetMapping(/{id})public R getById(PathVariable Integer id){return new R(true,iBookService.getById(id));}GetMapping({current}/{size})public R getPage(PathVariable Integer current,PathVariable Integer size){return new R(true,iBookService.getPage(current,size));}
}4.6、前后端协议联调
前后端分离结构设计中页面归属前端服务器单体工程中页面放置在resources目录下的static目录中建议执行clean)
前端发送异步请求调用后端接口
//列表
getAll(){axios.get(/books).then((res){console.log(res.data)})
}单体项目中页面放置在resources /static目录下created钩子函数用于初始化页面时发起调用页面使用axios发送异步请求获取数据后确认前后端是否联通
4.6.1、添加功能
//添加
handleAdd () {//发送异步请求axios.post(/books,this.formData).then((res){//如果操作成功关闭弹层显示数据if(res.data.flag)this.dialogFormVisible false;this.$message.success(添加成功);}else {this.$message.error(添加失败);}}).finally((){this.getAl1();});
},请求方式使用POST调用后台对应操作添加操作结束后动态刷新页面加载数据根据操作结果不同显示对应的提示信息弹出添加Div时清除表单数据
4.6.2、删除功能
//删除
handleDelete(row){axios.delete(/books/row.id).then((res){if(res.data.flag){this.$message.success(删除成功);}else{this.$message.error(数据同步失败自动刷新);}}).finally((){this.getAll();});
}改进删除操作
handleDelete(row) {//1.弹出提示框this.$confirm(此操作永久删除当前数据是否继续? ,提示,{type:info}).then((){//2.做删除业务axios.delete(/books/row.id).then((res){......}).finally((){this.getAl1();});}).catch((){//3.取消删除this.$message.info(取消删除操作);});
}请求方式使用Delete调用后台对应操作删除操作需要传递当前行数据对应的id值到后台删除操作结束后动态刷新页面加载数据根据操作结果不同显示对应的提示信息删除操作前弹出提示框避免误操作
4.6.3、修改功能
//弹出编辑窗口
handleUpdate(row){axios.get(/books/row.id).then((res){if(res.data.flag){//展示弹层加载数据this.formData res.data.data;this.dialogFormVisible4Edit true;}else{this.$message.error(数据同步失败自动刷新);}});
},加载要修改数据通过传递当前行数据对应的id值到后台查询数据利用前端数据双向绑定将查询到的数据进行回显
//修改
handleAdd () {//发送异步请求axios.put(/books,this.formData).then((res){//如果操作成功关闭弹层显示数据if(res.data.flag)this.dialogFormVisible4Edit false;this.$message.success(修改成功);}else {this.$message.error(修改失败);}}).finally((){this.getAl1();});
},取消添加和修改
cancel(){this.dialogFormVisible false;this.dialogFormVisible4Edit false;this.$message.info(操作取消);
},请求方式使用PUT调用后台对应操作修改操作结束后动态刷新页面加载数据同新增)根据操作结果不同显示对应的提示信息同新增)
4.6.4、异常消息处理
业务操作成功或失败返回数据格式
{flag: true,data: null
}{flag: false,data: null
}后台代码BUG导致数据格式不统一性
{timestamp: 2021-09-15T03:27:31.03800:00,status: 500,error: Internal Server Error,path: /books
}
对异常进行统一处理出现异常后返回指定信息
//作为SpringMVC的异常处理器
ControllerAdvice
RestControllerAdvice
public class ProjectExceptionAdvice {ExceptionHandlerpublic R doException(Exception ex){//记录日志//通知运维//通知开发ex.printStackTrace();return new R(服务器故障请稍后重试);}
}修改表现层返回结果的模型类封装出现异常后对应的信息 flag: falseData: null消息(msg):要显示信息
Data
public class R {private Boolean flag;private Object data;private String Message;public R(Boolean flag, String message) {this.flag flag;this.Message message;}
}可以在表现层Controller中进行消息统一处理
PostMapping
public R save(RequestBody Book book){boolean flag iBookService.save(book);return new R(flag,flag?添加成功^_^:添加失败-_-!);
}目的国际化
使用注解RestControllerAdvice定义SpringMVC异常处理器用来处理异常的异常处理器必须被扫描加载否则无法生效表现层返回结果的模型类中添加消息属性用来传递消息到页面
4.6.5、分页
页面上使用el分页组件添加分页功能
!--分页组件--
div classpagination-containerel-paginationclasspagiantioncurrent-changehandleCurrentChange:current-pagepagination.currentPage:page-sizepagination.pageSizelayouttotal,prev, pager,nextjumper:totalpagination.total/el-pagination
/div定义分页组件需要使用的数据并将数据绑定到分页组件
data:{pagination: { //分页相关模型数据currentPage: 1, //当前页码pageSize:10, //每页显示的记录数total:0, //总记录数}
},替换查询全部功能为分页功能
getAll(){axios.get(/books/this.pagination.currentPage/this.pagination.pageSize).then((res){});
}加载分页数据
getAll(){axios.get(/books/this.pagination.currentPage/this.pagination.pageSize).then((res){this.pagination.total res.data.data.total;this.pagination.currentPage res.data.data.current;this.pagination.pagesize res.data.data.size;this.datalist res.data.data.records;});
}分页页码值切换
//切换页码
handleCurrentChange(currentPage) {this.pagination.currentPage currentPage;this.getAll();
},4.6.6、删除功能维护
对查询结果进行校验如果当前页码值大于最大页码值使用最大页码值作为当前页码值重新查询
GetMapping({current}/{size})
public R getPage(PathVariable Integer current,PathVariable Integer size){PageBook page iBookService.getPage(current, size);if (currentpage.getPages()){page iBookService.getPage((int)page.getPages(), size);}return new R(true,page );
}4.6.7、按条件查询
查询条件数据封装 单独封装与分页操作混合封装
pagination: { //分页相关模型数据currentPage: 1, //当前页码pagesize:10, //每页显示的记录数total:0, //总记录数name: ,type: ,description:
}页面数据模型绑定
div classfilter-containerel-input placeholder图书类别v-modelpagination.type classfilter-item/el-input placeholder图书名称v-modelpagination.name classfilter-item /el-input placeholder图书描述v-modelpagination.description classfilter-item /el-button clickgetAll() classdalfBut查询/el-buttonel-button typeprimary classbutT clickhandleCreate()新建/el-button
/div组织数据成为get请求发送的数据
getAll() {//1.获取查询条件拼接查询条件param ?namethis.pagination.name;param typethis.pagination.type;param descriptionthis.pagination.description;console.log(-----------------param) ;axios.get(/books/this.pagination.currentPage/this.pagination.pageSizeparam).then((res) {this.dataList res.data.data.records;});
},Controller接收参数
GetMapping({current}/{size})
public R getPage(PathVariable Integer current,PathVariable Integer size,Book book){PageBook page iBookService.getPage(current, size,book);if (currentpage.getPages()){page iBookService.getPage((int)page.getPages(), size,book);}return new R(true,page );
}业务层接口功能开发
Override
public PageBook getPage(Integer current, Integer size, Book book) {LambdaQueryWrapperBook lqw new LambdaQueryWrapper();lqw.like(Strings.isNotEmpty(book.getType()),Book::getType,book.getType());lqw.like(Strings.isNotEmpty(book.getName()),Book::getName,book.getName());lqw.like(Strings.isNotEmpty(book.getDescription()),Book::getDescription,book.getDescription());PageBook bookPage new Page(current, size);return bookDao.selectPage(bookPage, lqw);
}4.7、案例基本步骤
pom. xml 配置起步依赖application.yml 设置数据源、端口、框架技术相关配置等dao 继承BaseMapper、设置Mapperdao测试类service 调用数据层接口或MyBatis-Plus提供的接口快速开发service测试类controller 基于Restful开发使用Postman测试跑通功能页面 放置在resources目录下的static目录中