2. SpringBoot
官网:https://spring.io/
Spring全家桶:Spring已经形成了一种开发生态圈,其提供的若干子项目分别用于完成特定的功能
Spring Boot简化了Spring Framework,不用底层实现那么配置繁琐,可以快速构建应用程序、简化开发、提高效率
2.1 入门程序
2.2 HTTP协议
1)概念
超文本传输协议,规定了浏览器和服务器之间数据传输的规则
2)特点
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型的:一次请求对应一次响应
- HTTP协议是无状态的协议:没记忆,每次请求-响应都是独立的——速度快,但是多次请求之间不能共享数据
3)请求协议
格式:
- 请求行:请求数据第一行(请求方式、资源路径、协议)
- 请求头:第二行开始,格式是key: value(主机名,浏览器版本、……)
- 请求体(POST特有):存放请求参数(加个空行与上面隔开)
注:GET和POST的区别
- GET:请求参数在请求行中,没有请求体,并且请求大小是有限制的
- POST:请求参数在请求体中,请求大小没有限制
4)响应协议
格式:
- 响应行:第一行(协议、状态码、描述)
- 响应头:第二行,格式是key: value
- 响应体:最后一部分,存放响应数据(加个空行与上面隔开)
状态码大类
状态码分类 | 说明 |
---|---|
1xx | 响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它 |
2xx | 成功——表示请求已经被成功接收,处理已完成 |
3xx | 重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。 |
4xx | 客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等 |
5xx | 服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等 |
常见的响应状态码
状态码 | 英文描述 | 解释 |
---|---|---|
200 | OK | 客户端请求成功,即处理成功,这是我们最想看到的状态码 |
302 | Found | 指示所请求的资源已移动到由Location 响应头给定的 URL,浏览器会自动重新访问到这个页面 |
304 | Not Modified | 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 |
400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 |
404 | Not Found | 请求资源不存在,一般是URL输入有误,或者网站资源被删除了 |
405 | Method Not Allowed | 请求方式有误,比如应该用GET请求方式的资源,用了POST |
428 | Precondition Required | 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 |
429 | Too Many Requests | 指示用户在给定时间内发送了太多请求(“限速”),配合 Retry-After(多长时间后可以请求)响应头一起使用 |
431 | Request Header Fields Too Large | 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 |
500 | Internal Server Error | 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 |
503 | Service Unavailable | 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 |
状态码大全:https://cloud.tencent.com/developer/chapter/13553
响应头
5)HTTP解析
客户端,也就是浏览器这一端,已经内置了解析的方法
服务器端该如何解析数据并响应数据
HTTP解析和响应过于繁琐——有公司把代码封装大软件中(Web服务器),最受欢迎的是Apache Tomcat
2.3 Tomcat
主要功能: 提供网上信息浏览服务
一个轻量级的web服务器,支持servlet、jsp等少量javavEE规范,也被称为web容器、servlet容器
HTTP默认端口号是80,如果修改了Tomcat端口号的配置为80,那么地址栏就不需要添加端口了
部署: 将应用放在webapps目录下,部署就完成了
3. 请求响应
3.1 postman
概念: 网页调试与发送网页HTTP请求的Chrome插件
作用: 常用于接口测试
简单参数:参数 写在URL后面,请求名与形参对象属性名相同,自动类型转换;@RequestParam手动映射
实体参数:将简单参数放在一个实体类当中;请求参数名与实体对象的属性名一致,回自动接收封装
数组参数:将参数名与形参数组名称相同且定义为多个,定义数组类型形参即可接受参数;名一致直接封装;不一致@RequestParam
日期参数:@DataTimeFormat
json参数:@RequestBody
路径参数:@PathVariable
@RestController = @Controller + @ResponseBody
返回都是@ResponseBody,如果是字符串直接返回,是对象、集合要包装成json格式——>统一响应结果
public class Result {
// 响应码,1代表成功;0代表失败
private Integer code;
// 提示信息
private String msg;
// 返回数据
private Object data;
// ……
}
3.2 分层解耦
都写在Controller中复用性和可读性都比较差——>单一职责原则
三层架构
-
数据访问
-
逻辑处理
-
接收请求、响应数据
-
controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据
-
server:业务逻辑层,处理具体的业务逻辑
-
Dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查
分层解耦
- 内聚:软件中各个功能模块内部的功能联系 (一个内部)
- 耦合:衡量软件中各个层/模块之间的依赖、关联程度 (多个之间)
- 软件设计原则:高内聚、低耦合
思路: 设计一个容器,里面包含了实现类的对象,方法中需要使用对象的时候就去容器里面找,看有没有自己需要的对象
问题:
- 如何将对象放在容器里面——控制反转
- 如何从容器中取到需要的对象——依赖注入
控制反转: Inversion OfControl(IOC),对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转——在需要创建对象的类上方@Component
依赖注入: Dependency Injection(DI),容器为应用程序提供运行时,所依赖的资源,称之为依赖注入——在需要创建对象的上方@Autowired(运行时,IOC容器会提供该类型的bean对象,并赋值给该变量)
Bean对象: IOC容器中创建、管理的对象,称之为bean
1)IOC详解
注解 | 说明 | 位置 |
---|---|---|
@Component | 声明bean的基础注解 | 不属于以下三类时,用此注解——例如:工具类 |
@Controller | @Component的衍生注解 | 标注在控制器类上 |
@Service | @Component的衍生注解 | 标注在业务类上 |
@Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少) |
注:
- 声明bean的时候,可以通过value属性指定bean的名字(后面跟个小括号),如果没有指定,默认为类名首字母小写
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller
Bean的组件扫描
- 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描
- @ComponentScan注解虽然没有显式配置,但实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包
2)DI详解
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,会报错,解决办法——再加注解
注:@Resource与@Autowired区别
- @Autowired是spring框架提供的注解,而@Resource是JDK提供的注解
- @Autowired默认是按照类型注入,而@Resource默认是按照名称注入
4. 数据库
Dao数据访问是访问数据库中的数据