https://study.163.com/course/courseMain.htm?courseId=1005213034
章节1 开始一个最简单的RESTful API项目
课时1 什么是RESTful API
课时2 Maven简介
课时3 RESTful API的Hello world
课时4 一个简单的RESTful API
章节2 RestController详解
课时5 Spring Boot项目开发过程中的Hot Swapping(热部署)
课时6 在程序中记录日志
课时7 使用curl来测试API
课时8 详解RestController中获取请求的各种数据
课时9 RestController中的上传和下载示例
课时10 在RestController中获取各种相关信息
课时11 对客户端传入数据的校验
课时12 深入学习Bean Validation
课时13 Bean Validation 2.0中的约束用注解
章节3 在Spring Boot项目中使用Mybatis
课时14 后端程序的层次结构
课时15 不同层级之间的数据传输
课时16 在Spring Boot项目中使用Mybatis
章节4 Spring Boot项目的单元测试
课时17 使用spring-test和junit进行单元测试
课时18 用mockito做桩模块来测试业务逻辑层
课时19 用mockMvc来测试web控制层和业务逻辑层
章节5 在spring中管理数据库事务
课时20 利用Transactional注解来管理事务
课时21 Transactional注解的propagation参数详解
课时22 Transactional注解的isolation参数详解
课时23 Transactional注解的timeout参数详解
章节6 期中作业
课时24 期中作业
课时25 小测验
章节7 Mybatis进阶
课时26 复杂类的ORMapping和主子表的同时数据插入
课时27 使用TypeHandler处理枚举、数组和JSON类型
章节8 Spring Security
课时28 Spring Security基础
课时29 编写一个用Spring Security保护的RESTful API
课时30 OAuth 2.0
章节9 Spring Async、Scheduling & Cache
课时31 用Spring Async编写异步执行的方法
课时32 用Spring Scheduling处理需定时启动的任务
课时33 通过Spring Cache实现程序中需要的缓存机制
课时34 使用Redis缓存服务
章节10 Websocket & JMS
课时35 在Spring项目中使用Websocket
课时36 使用JMS进行异步数据通讯
章节11 部署Spring Boot项目
课时37 Spring Profile和配置日志记录框架
课时38 生产环境架构
章节12 杂项
课时39 在Spring Boot项目中使用Servlet, Filter, Listener等
课时40 Autowired的加载规则
课时41 API的版本管理
课时42 定制Spring REST的错误返回信息
SPRING INITIALIZR:
http://start.spring.io
RESTful概念已有文章如下:
https://blog.csdn.net/weixin_42915286/article/details/84880998
MAVEN:
https://blog.csdn.net/weixin_42915286/article/details/84105587
RESTful API URI 示例
URL:http://somehost/tvseries
GET /tvseries 获取电视剧列表
POST /tvseries 创建一个新电视剧
GET /tvseries/101 获取编号为101的电视剧信息
PUT /tvseries/101 修改编号为101的电视剧信息
DELETE /tvseries/101 删除编号为101的电视剧
GET /tvseries/101/characters 获取编号为101的电视剧的人物列表
POST /authorization 登录
DELETE /authorization 退出
在http://start.spring.io中创建REST依赖框架:
下好后,导入IDE中:
导入时的路径记得不要随便放在桌面还是其他地方,放在正式仓库文件夹为好;
比如放在桌面导入,系统配置会全部在桌面上。
初始化界面
章节1 开始一个最简单的RESTful API项目
课时3 RESTful API的Hello world
为求方便,把TutorialApplication改名为Application;
tutorial文件夹下新建TvSeriesController
写一个最简单的Controller
package cn.devmgr.tutorial;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/tvseries")
public class TvSeriesController {
@GetMapping
public Map<String,Object> sayHello(){
Map<String,Object> result=new HashMap<>();
result.put("message","hello,world.");
return result;
}
}
可以直接在IDE里RUN
浏览器可查看 localhost:8080/tvseries
页面自动生成了JSON,写着{“message”:“hello,world”}
也可以在Terminal中RUN:进入POM的根目录下,mvn spring-boot:run
—————————————————
课4:
搞个电视剧的例子:
在src/main/java…/java 下新建:TVSeriesDto.java
private id; private name; private int seasonCount; private Date originRelease;(引入)
为了后面的测试,再加一个无参函数和有参函数
public TvSeriesDto(){
}
public TvSeriesDto(int id,int name,int seasonCount,int originRelease){
this.id=id;
this name=name;
this seasonCount=seasonCount;
this originRelease=originRelease;
}
生成Setter/Getter方法
返回TvSeriesController,把
public Map<String,Object> sayHello()方法
改成getAll()方法
public List<TcSeriesDto> getAll() //因为需要返回所有电视剧,下面只返回一部电视剧:西部世界
List<TvSeriesDto> list=new ArrayList<>(); (引入)
list.add(new TvSeriesDto(1,"WestWorld",1,calendar.getTime()));
Calendar calendar=Calendar.getInstance();
calendar.set(2016,Calendar.OCTOBER,2,0,0);
return list;
这里暂时不说怎么从数据库查询,后面再说。
完成后同样可以在浏览器检查 localhost:8080/tvseries
若时间显示有问题,可能是时区原因;
有种方法:写时间戳Timestamp,较灵活(前端控制)
注:日期类型转JSON格式,可以在属性上增加:
1.设置时区和格式;2.设置shape的long型格式
即:
@JsonFormat(timezone="GMT+8",pattern="yyyy-MM-dd")
或
@JsonFormat(shape=JsonFormat.Shape.NUMBER)
这两个方法需要在每一个日期型的属性前都添加,较麻烦,推荐下面方法:
全局修改可以在application.yml
spring:
jackson:
date-format: yyyy-MM-dd # 用字符串型表示,用这里设置格式;若设置字符串类型,下面的时间戳应该不写或者设置false
timezone: GMT+8
serialization:
write-dates-as-timestamps: true # 时间戳:true;若时间戳和字符型并存,时间戳优先
BEFORE:
"originRelease": "2016-10-01T16:00:21.816+0000"
AFTER timeStamps:
"originRelease": 1475337601927
AFTER 字符串:
"originRelease": "2016-10-02"
——————————————
章节2 RestController详解
Controller里添加一部电视剧先:
calendar.set(2011,Calendar.SEPTEMBER,1,2,0,0);
list.add(new TvSeriesDto(1,"Person of Interest",5,calendar.getTime()));
课5: HOT Swapping 热部署
(热部署设置介绍在本blog之IDEA设置文章)
每次修改了项目,要看结果要重新启动ctrl+C,比较麻烦
Spring中提供了hot swapping
1.在POM里输入devtools依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2.添加配置文件:配置文件中显示指定,默认值也是true,但是防止其他地方修改了默认值,所以,建议添加这个配置信息。
「.properties与.yml格式的区别详见本blog之Spring文章。」
「Application.yml格式」:
spring:
devtools:
restart:
enabled: true
「Application.properties格式」:
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java
spring.devtools.restart.exclude=WEB-INF/**
3.此方法是基于类加载机制来实现热加载的,因此你修改完成代码后必须重新编译当前代码,才能触发热部署,Eclipse默认就支持了自动编译,而在Intellij IDEA中默认是关闭了自动编译的,要按照如下几步设置开启:
-
1.IDEA开启项目自动编译,进入设置,Build,Execut, Deployment -> Compiler 勾选中左侧的Build Project automatically
-
2.IDEA开启项目运行时自动make, command + shift + a搜索命令:registry -> 勾选compiler.automake.allow.when.app.running
再试试启动,浏览器看看
我自己用以上方法操作后可以生效,只是反应速度比较迟缓。
PS:
JRebel激活 https://www.cnblogs.com/zhengsc/p/8494066.html
——————————————————
课6: 在程序中记录日志
日志可以设置级别:
使用System.out.println
操作时很局限,因为他不能设置级别,各种环境下都会输出全部语句,调试时还要删掉多余语句;使用日志则无需删除,只需调整级别。
指定级别后,运行时借用一个「输出配置文件」可以把某个级别以及之上的级别都记录下来。比如生产环境中,我们把日志级别调高一些「WARN」,那么TRACE、DEBUG那些就不会被记录。
- 1.两种方法(依赖包) (1).Common-logging (2).SLF4j
他们都用得很广,特性相似 - 2.日志级别:
Common-logging分成6级:
TRACE<DEBUG<INFO<WARN<ERROR<FATAL
SLF4j和一般的日志分成(中间)4个级:
DEBUG INFO WARN ERROR
「输出配置文件」:在application.yml中配置
logging: file:target/app.log level: ROOT:WARN cn.devmgr:TRACE //包名自行修改
举例:commons-logging
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
/