maven依赖
maven依赖配置 是在 pom.xml文件中配置的 依赖 就是 java在项目运行中所需要的jar包
在我们添加依赖时,如果本地仓库没有该依赖,maven会链接远程仓库,自己下载依赖
依赖传递
而 maven依赖具有传递性的,可以是 直接依赖 和间接依赖
直接依赖
假如 有一个项目 A 现在添加了 a b c三个 依赖 ,现在 我们 又创建了一个项目B,在我们没有在pom文件中添加依赖的时候,依赖不会传递,在我们 在pom文件中把A项目添加到依赖中去,B项目就会 有 A项目中的所有依赖 ,这就是直接依赖
间接依赖
在上面的基础上 我们又创建了一个项目C,我们把B添加到我们C项目的pom文件中去, 这就是间接依赖
如图所示
依赖排除
当我们在C项目中依赖了B项目,此时 有a b c三个jar1包,我们C项目不需要cjar包,此时可以用依赖排除,记住 排除的依赖代码需要写在 此时 依赖的B项目的代码中 也就是<dependency>标签中
<exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions>
依赖范围
依赖范围代码写在pendency标签中,version标签下,用scope标签包裹
依赖生命周期
在maven中有许多生命周期,但是无论怎样,当你运行后面顺序的生命周期时,前面的生命周期都是运行
http请求协议
浏览器 向服务器用固定格式的内容进行请求,服务器响应浏览器发来的内容,按照固定格式进行响应
请求行 前面get代表的是get请求 ,请求的网址是/hello,用的是http协议
后面是 服务器向 浏览器进行响应
特点
http协议是基于 tcp协议比较安全,而且还需要进行 三次握手,四次挥手
三次握手
1 客户端向服务器发出连接请求等待服务器确认
2 服务器返回响应 告诉客户端收到请求
3客户端再次发出确认信息 建立连接
四次挥手
1 客户端发出取消连接请求
2 服务器 返回响应,表示收到请求
3 服务器 向客户端 发出取消请求
4 客户端发送确认信息,取消连接
两种常用请求
1是get请求 2 是post请求
使用get请求 请求的内容一般在 请求行中,长度有限制
而post请求的内容是json形式的包含在请求体中 数据比较安全,长度没有限制
http响应
服务器按照http格式相应给 浏览器
分为 响应行 响应头 响应体 而响应的内容 在响应体内
一般在服务器响应的状态码中 有以下几种情况
常用响应软件
一般测试自己的响应内容 用postman软件进行测试 ,而轻量得得web服务器 有tomcat 等
在自己spring代码中如下
写下如下代码之后 启动自己项目类
而在postman中 具体如下
正常返回的就是 ok
请求参数
在我们 用post请求中 有几种请求参数需要注意
简单参数
@RestController public class hello { @RequestMapping("/nihaoya") public String nihao(String name, int age){ System.out.println(name); return "ok"; }
在我们用postman发起请求时的时候,请求的就是下面的网址,而我们请求的内容就写在 ?之后,
也就是name=什么什么的
此时我们输出打印name,会得到zhangsan的结果,而如果我们 使用的名字不一样的时候,打印的结果就会变成null,就比如 我们用上面的代码打印name的名字,而我们在发送get请求时候 输入的网址内容为localhost:8080/nihaoya?namess=zhangsan&age=100 我们发现 我们用的namess 跟 我们定义的方法 nihao 中 形参name名字不同,所以会返回 null ,也就是说 我们用网址发送请求时,键值对的键要和 我们方法的形参名字相同
复杂参数
就是我们写方法的时候,写的是一个类 比如
@RequestMapping("/nihao") public String ni(User user){ System.out.println(user); return "ok"; }
我们 的形参是一个我们自定义的pojo实体user类
public class User { public String name; public int age;
而我们在get请求中的网址输入为localhost:8080/nihaoya?name=zhangsan&age=100 他会自动匹配我们名字相同的内容,但是需要按照顺序写入
集合参数
我们请求数组参数的时候 需要加一个 requestparam注解
@RequestMapping("/jihe") public String ji( @RequestParam List<String> hobby){ System.out.println(hobby.toString()); return "ok"; }
对应的hobby内容依次对应即可 localhost:8080/jihe?hobby=sing&hobby=java&hobby=song
其他参数
json参数 就是 用post请求 发送一个json,实体类用注解 注释
路径参数
我们一般是通过一个网址进行 内容的传递 比如
localhost:8080/nihaoya?name=zhangsan&age=100
而我们用路径参数可以可以这样写 localhost:8080/nihaoya/wocaole
代码如下
@RequestMapping("/path/{id}")
public String nihaoya(@PathVariable Integer id)
{return "ok"}
这样我们就可以为 该路径的后面写入任意的内容 也就是在 localhost:8080/nihaoya/ 这个后面写任意的数字
统一请求响应结果
当我们 每次用不同的数据进行进行响应返回的时候,会显得代码太臃肿,所以我们可以自定义个实体类来进行统一响应的管理
自定义的统一实体类为
public class Result { public String code;// 1 成功 0失败 public String msg; //success public Object data;//存放数据 public Result() { } public Result(String code, String msg, Object data) { this.code = code; this.msg = msg; this.data = data; } public static Result success(Object data){ return new Result("1","success",data); } public static Result err(){ return new Result("0","err",null); }}
而标准的javabean我们就不再复制出来
这样我们就可以把之前请求参数的代码改为如下
@RestController public class hello { @RequestMapping("/nihaoya") public Result nihao(@RequestParam(name = "name") String names){ System.out.println(names); return Result.success(names); }}
我们通过统一的响应结果 解决了代码的测试的冗余
springboot分层解耦
当我们 写入一个项目,对前后端进行测试的时候代码分为三层
1 controller 层 service层 dao层三层
我们在分层的时候 要尽量遵循 高内聚 低耦合
高内聚 就是 一个层级中元素的联系程度越高 内聚性越高
低耦合 层级之间关联度越小越好
假设现在 有一个项目 前端页面A 数据内容 B 项目把数据内容B 导入到前端页面A中 进行渲染展示
那么 我们就需要进行三层的设计
现在 dao 业务层 进行 数据内容B 的解析 假设解析好的内容为a
在service层中 对内容a进行数据内容的处理筛选判断等
在controller层 进行页面的数据响应
而使用了 解耦之后就不能随便new对象了,那么接下来怎么办
在其中 需要用到ioc di 也就是 控制反转 依赖注入
完整的代码如下
ioc &di 详解
ioc
我们用@component 注解 分类实在是不够明确 下面 我们用下面的注解标注各个层面
@Component的衍生注解:
@Controller (标注在控制层类上)
@Service (标注在业务层类上)
@Repository (标注在数据访问层类上)
但是我们使用了这些注解 他就会生效吗 不会,其中会有组件扫描,我们一般可以看出 我们springboot的启动程序一般是在 我们设置的包下的
就是 springwebapplication类在com包下,他在启动的时候会有组件扫描,@SpringwebApplication 中, 默认扫描的范围是SpringBoot启动类所在包及其子包,然后找到我们注解的内容,但是当我们包一个服务层或者业务层的包 与com包平级,在组件扫描中就不会扫描到,运行就会出错
解决方法如下
1 不要没事把 包弄到其他地方
2
在启动类的上面加上该注解的包
di
我们使用依赖注入 ioc容器的时候,是使用的autowired注解,但是加入在 ioc容器中 有相同类型的bean对象 ,在程序运行的时候就会出错
我们依赖注入了一个接口两个相同的子类型,虽然类名不一样,但是 实现的接口一样,当进行依赖注入的时候会重复,程序报错
解决方法
mybatis
mybatis 是一个应用在数据持久层(dao层)的框架,主要是简化jdbc的开发
使用mybatis是怎么个流程
在使用mybatis操作数据库 就是在mybatis中编写sql代码,然后发给数据库执行,数据库执行之后返回结果,返回的结果mybatis会用实体类封装起来
使用过程 设置好驱动依赖等一系列工作之后
我们根据
数据库中表的 字段 在 main包中 创建一个 跟数据库表对应的实体类,然后实现一个mapper接口
接口如下
然后在test测试包下 ,进行程序测试
运行之后,控制台就会出现 该数据库表中的 各个数据
数据库连接池
没有使用数据库连接池 客户端执行sql会建立新的连接对象,使用完之后释放资源,这种比较耗费计算机性能
mybatis中则存在数据库连接池
数据库连接池是个容器,负责分配、管理数据库连接(Connection) 程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象 允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句 执行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以 复用) 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏 客户端获取到Connection对象了,但是Connection对象并没有去访问数据库(处于空闲),数据 库连接池发现Connection对象的空闲时间 > 连接池中预设的最大空闲时间,此时数据库连接池 就会自动释放掉这个连接对象
lombok
我们在创建实体类的时候 ,老写重复的getset方法,使用了lombok之后只需要加上注解就行了,但是我有其他的插件了更加简洁,所以我就不用lombok了