Maven
是apach旗下的一个开源项目,是一款用于管理和构建java项目的工具。
- 依赖管理(方便快捷的管理项目依赖的资源jar包,避免版本冲突)、
- 统一的项目结构(提供标准、统一的项目结构)、
- 项目构建(跨平台的自动化项目构建方式)
1、解压
2、配置本地仓库:修改conf/settings.xml中的<localRepository>为一个指定目录
3、配置阿里云私服:修改conf/settings.xml中的<mirrors>标签,为其添加如下子标签:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
4、配置环境变量,MAVEN_HOME为解压目录,并将其bin目录加入PATH环境变量中。
在Idea中配置Maven环境(全局):
setttings->Build,Execution,Deployment->Build Tools->Maven:
设置Maven home path和User Settings file、Local repository
setttings->Build,Execution,Deployment->Build Tools->Maven->Runner中的JRE
setttings->Build,Execution,Deployment->Compiler->Java Compliler中的project bytecode version
Idea创建Maven项目
Maven坐标:
Maven中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置,使用坐标来定义项目或引入项目中需要的依赖。
坐标主要组成:
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
- artifactId:定义当前Maven项目名称(通常是模块名称,例如order-service、goods-service)
- version:定义当前项目版本号
依赖配置:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
- 在pom.xml中编写<dependencies>标签
- 在<dependencies>标签中使用<dependency>引入标签
- 定义坐标的groupId,artifactId、version
- 点击刷新按钮,引入最新加入的坐标
mvn仓库链接:https://mvnrepository.com/
注意:如果引入的依赖,在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖;如果不知道依赖的坐标信息,可以到上述连接中搜索。
依赖传递:
依赖具有传递性。
直接依赖:在当前项目中通过依赖配置建立的依赖关系。
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。
排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。<exclusions>
依赖范围:
依赖的jar包,默认情况下,可以在任何地方使用,可以通过<scope>设置其作用范围。
作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包运行(package指令范围内)
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
compile(默认) | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jbdc驱动 |
生命周期:
Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。
Maven中有3套相互独立的生命周期:
- clean清理工作
clean:移除上一次构建生成的文件
- default核心工作,如:编译、测试、打包、安装、部署等
compile:编译项目源代码
test:使用合适的单元测试框架运行测试(junit)
package:将编译后的文件打包,如jar、war等
install:安装项目到本地仓库
- site生成报告、发布站点
注意:在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。
执行指定生命周期:
在Idea中,右侧的maven工具栏,选择对应的生命周期,双击执行;
或者在命令行中,通过命令执行:mvn clean/compile/test
Maven高级
分模块设计与开发:
创建maven模块tlias-pojo,存放实体类;创建maven模块tlias-utils,存放相关工具类;
方便项目的管理维护、扩展,也方便模块间的相互协调,资源共享。
继承与聚合:
继承:子工程可以继承父工程中的配置信息,常见于依赖关系的继承。作用:简化依赖配置、统一管理依赖。
注意:
- 在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的;
- relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程);
- 如果父子工程都配置了同一个依赖的不同版本,以子工程的为准;
<dependencyManagement>与<dependencies>的区别是什么?
- <dependencies>是直接依赖,在父工程配置了依赖,子工程会直接继承下来;
- <dependencyManagement>是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本);
聚合:将多个模块组织成一个整体,同时进行项目的构建。
聚合工程:一个不具有业务功能的“空”工程(有且仅有一个pom文件)。
作用:快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)。
私服:
SpringBoot Web
SpringBoot简化了Spring的开发,帮助快速的构建应用程序、简化开发、提高效率。
入门:
1、创建springboot工程,并勾选web开发相关依赖。
创建module时,选择Spring Initializr,type选择Maven,dependencies选择Spring Web.
2、定义HelloController类,添加方法hello,并添加注解。
3、运行测试。
Error:(3, 47) java: 程序包org.springframework.web.bind.annotation不存在
解决:勾选将IDE运行操作委托给Maven
起步依赖:
spring-boot-starter-web、spring-boot-starter-test
内嵌Tomcat服务器:
基于Springboot开发的web应用程序,内置了tomcat服务器,当启动类运行时,会自动启动内嵌的tomcat服务器。
HTTP协议:
规定了浏览器和服务器之间数据传输的规则;默认端口号为80;
特点:
1.基于TCP协议:面向连接,安全
2.基于请求-响应模型的:一次请求对应一次响应
3.HTTP协议是无状态的协议:对于事务处理没有记忆能力,每次请求-响应都是独立的。
缺点:多次请求间不能共享数据。
优点:速度快。
请求数据格式:
请求行:(请求方式 资源路径 协议)
请求头:格式key:value
请求体:POST请求,存放请求参数
注意:
请求方式- GET:请求参数在请求行中,没有请求体,如:/brand/findAll?name=zhangsan&status=1,GET请求大小是有限制的;
请求方式- POST:请求参数在请求体中,POST请求大小是没有限制的;
响应数据格式:
响应行:(协议 状态码描述)
响应头:格式key:value
响应体:存放响应数据
状态码大全:https://cloud.tencent.com/developerchapter/13553
Web服务器-Tomcat:
Web服务器是一个软件程序,对Http协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发便捷,主要功能是"提供网上信息浏览服务"。
Tomcat是Apache软件基金会一个核心项目,轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。也被称为web容器、Servlet容器。Servlet程序需要依赖于Tomcat才能运行。
请求响应:
- 请求(HttpServletRequest):获取请求数据
- 响应(HttpservletResponse):设置响应数据
- BS架构:浏览器服务器架构
- CS架构:客户端服务器架构
POSTMAN:
postman是一款功能强大的网页调试与发送网页HTTP请求的chrome插件。类似的还有ApiPost、Apifox。
作用:常用于接口测试
在这里使用了Apipost,注意使用web版可能会受到浏览器的跨域限制,因此需要下载客户端版本。
请求简单参数传递:
简单参数:参数名与形参变量名相同,定义形参即可接收参数;如果请求参数与形参变量不一致,则不会接收参数,但不会报错;
@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false;
/*@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
//获取请求参数
String name = request.getParameter("name");
String ageStr= request.getParameter("age");
int age = Integer.parseInt(ageStr);
System.out.println(name+" "+age);
return "OK!";
}*/
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(String name, Integer age) {
System.out.println(name + " " + age);
return "simpleParamOK!";
}
请求实体参数传递:
需要保证请求的参数名和封装的对象名保持一致。
@RequestMapping("/entityParam")
public String entityParam(User user){
System.out.println(user);
return "entityParamOk!";
}
请求数组集合参数传递:
数组:请求参数名与形参数名称相同且请求参数为多个,定义数组类型形参即可接收参数。
集合:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系。
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "arrayParamOK!";
}
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "listParamOK!";
}
请求日期参数传递:
使用@DateTimeFormat注解完成日期参数格式转换。
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime time){
System.out.println(time);
return "dateParamOK!";
}
请求Json参数传递:
JSON数据键名与形参对象属性名相同,定义对象User类型形参即可接收参数,需要使用@RequestBody。
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "jsonParamOK!";
}
请求路径参数传递:
通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数。
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "pathParamOK!";
}
//多个路径参数
@RequestMapping("/path/{id}/{name}")
public String pathParam2(@PathVariable Integer id,@PathVariable String name){
System.out.println(id+" : "+name);
return "2pathParamOK!";
}
响应数据:
@ResponseBody
- 类型:方法注解、类注解
- 位置:Controller方法上/类上
- 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应。
- 说明:@RestController=@Controller+@ResponseBody;
分层解耦
三层架构:
- controller控制层:接收前端发送的请求,对请求进行处理,并响应数据。
- service业务逻辑层:处理具体的业务逻辑。
- dao数据访问层(Data Access Object持久层):负责数据访问操作,包括数据的增删改查。
内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
IOC和DI:
IOC:Inversion Of Control控制反转,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
DI:Dependency Injection依赖注入,容器为应用程序提供运行时所依赖的资源,称为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为bean。
@component将当前类交给IOC容器管理,成为IOC容器中的Bean。
@Autowired运行时,IOC容器会提供该类型的bean对象,并赋值给该变量-依赖注入。
Bean的声明:
注解 | 说明 | 位置 |
@component | 声明bean的基础注解 | 不属于以下三类时用此注解 |
@Controller | 衍生注解 | 标注在控制器类上 |
@Service | 衍生注解 | 标注在业务类上 |
@Repository | 衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少) |
注意:声明Bean的时候,可以通过value属性指定名字,如果没有指定,默认为类名首字母小写。
以上四个注解都可以声明Bean,但在SpingBoot集成Web开发中,声明控制器Bean只能用@Controller。
Bean组件扫描:
- 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
- @ComponentScan注解虽然没有显示配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。
Bean注入:
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,则会报错;
解决方案:
① 在声明bean的前面加上@Primary,表明注入的优先级最高;
② 在注入bean时(即@Autowired)前面加上@Qualifier("beanName"),表明注入的哪个bean;
③ 将@Autowired注解替换为@Resource(name="beanName"),这是按照名称注入的。
注意:
@Autowired和@Resource的区别:
- @Autowired都是spring框架提供的,@Resource是jdk提供的注解。
- @Autowired默认是按照类型注入的,而@Resource默认是按照名称注入的。