Maven基础、HTTP协议、请求响应(Web后端笔记第一期)
p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解
目录
- Maven
- Maven坐标
- 依赖
- 生命周期
- HTTP
- HTTP数据格式
- 请求头
- 响应数据格式
- 请求响应
- 请求
- 参数
- 原始参数
- 简单参数
- 实体参数
- 数组集合参数
- 日期参数
- Json参数
- 路径参数
- 响应
- 分层解耦
- 三层架构
- IOC&DI
Maven
Maven是一款用于管理和构建java项目的工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建
Maven可用于依赖管理(方便快捷地管理项目依赖的资源包:jar包,避免版本冲突问题)、统一项目结构以及项目构建(标准跨平台如Linux、Windows、MacOS地自动化项目构建方式)
仓库:用于管理存储资源,管理各种jar包
本地仓库:自己计算机上的一个目录
中央仓库:由Maven团队维护的全球唯一的,仓库地址:http://repo1.maven.org/maven2/
远程仓库(私服):一般由公司团队搭建的私有仓库
Maven坐标
MAVEN坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置
使用坐标来定义项目或引入项目中所需要的依赖
Maven坐标组成
groupId:定义当前Maven项目隶属组织(通常是域名反写)
artifactId:定义当前Maven项目名称(通常是模块名)
version:定义当前项目版本号<groupId>org.example</groupId> <artifactId>Test</artifactId> <version>1.0-SNAPSHOT</version>
依赖
依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
.
配置:
- 在pom.xml中编写标签
- 在标签中使用引入坐标
- 定义坐标的groupId,artifactId,version
例如:groupId为ch.qos.logback
artifactId为logback-classic
version为1.2.3- 点击刷新按钮,引入最新加入的坐标
依赖具有传递性:
直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
。
。
排除依赖:排除依赖指主动断开依赖的资源,被排除的资源无需其他版本
依赖范围:
依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope></scope>
标签设置其作用范围
作用范围:
主程序范围有效(main文件夹范围内)
测试范围是否有效(test文件夹范围内)
是否参与打包运行(package指令范围内)
生命周期
Maven的生命周期就是为了对所有的Maven项目构建过程进行抽象和统一
Maven有三套相互独立的生命周期:
clean:清理工作
default:核心工作,如:编译、测试、打包、安装、部署等
site:生成报告、发布站点等
。
生命周期阶段:
clean:移除上一次构建生成的文件
compile:编译项目源代码
test:使用合适的单元测试框架(junit)运行测试
install:安装项目到本地仓库
。
在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行
执行指定生命周期的两种方式:
在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行。
在命令行中,通过命令执行。
HTTP
HTTP(Hypertext Transfer Protocol),超文本传输协议,规定了浏览器和服务器之间数据传输的规则
特点:
- 基于TCP协议:面向连接、安全
- 基于请求-相应模型的:一次请求对应一次相应
- HTTP是无状态的协议:对于事物没有记忆能力。每次请求-相应都是独立的
优点:速度快;缺点:多次请求间不能共享数据
HTTP数据格式
请求头
响应数据格式
.
.
请求响应
请求
如果发送的参数相同,则能接收,否则为默认值
参数
原始参数
在原始的web程序中,获取请求参数,需要通过HttpSeverRequest对象手动获取(手动类型转换、繁琐)
简单参数
简单参数:参数名与形参变量名相同,定义形参即可接收参数
注意:@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错,如果该参数是可选的,可以将required属性设为false
实体参数
简单实体对象:请求参数名与形参对象属性名相同,定义接收即可,即将参数封装为一个实体类
注意:发送的参数要与实体类中的参数名字一致
。
。
复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构即可接收嵌套POJO属性参数
数组集合参数
数组参数:请求参数名与形参参数名称相同且请求参数为多个,定义数组类型形参即可接收参数
。
集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系
日期参数
Json参数
Json参数:Json数据与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识
路径参数
路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数
总结
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;//请求处理类
@RestController
public class helloController {//简单参数@RequestMapping("/simpleParam")public String simpleParam(String name,int age) {System.out.println(name+","+age);return "ok";}//实体参数@RequestMapping("/simplePojo")public String simplePojo(User user) {System.out.println(user);return "ok";}//数组参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return "ok";}//集合参数@RequestMapping("/listParam")public String listParam(@RequestParam List<Integer> hobby) {System.out.println(hobby);return "ok";}//日期参数@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {System.out.println(updateTime);return "ok";}//json参数@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "ok";}//路径参数@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id) {System.out.println(id);return "ok";}}//实体类
class User{private String name;private int age;
}
响应
@ResponseBody注解,是一种方法注解、类注解
位置:Controller方法上/类上
作用:将方法返回值直接响应,如果返回值类型是实体对象/集合,将会转换为JSON格式响应
说明:@RestController=@Controller+@ResponseBody;
上面不同的请求参数返回的响应格式都不一样,为了统一,我们使用一个实体对象进行接收
案例
分层解耦
三层架构
三层架构指控制层、业务逻辑层、数据访问层
控制层(controller):控制层,接收前端发来的请求,对请求进行处理。并响应数据
业务逻辑层(service):处理具体的业务逻辑
数据访问层(dao,Data Access Object):也叫持久层,负责数据访问操作,包括数据的crud
两个概念
内聚:软件中各个模块内部的功能联系
耦合:衡量软件中各个层/模块之间的依赖、关联的程度
软件设计原则:高内聚、低耦合
IOC&DI
三个概念:
控制反转(IOC):对象的创建控制权由程序自身转移到外部(容器),这种思想成为控制反转
依赖注入(DI):容器为应用程序提供运行时所依赖的资源,称为依赖注入
Bean对象:IOC容器中创建、管理的对象,称为Bean
注意:
声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写
使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller
Bean注解扫描
前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描
@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包
Bean注入
@Autowired,默认是按照类型进行,如果存在多个相同的bean,则会报错
解决方案