框架部分的整体介绍
maven -- 只需要配置与操作
mybatis -- ORM框架
spring -- 为整个java项目服务,降低项目的耦合性
springmvc -- MVC框架:帮我们服务器简化接收前端请求的数据,以及简化服务器为前端响应数据
在实际开发,目前中国市场基本都是使用SSM+maven
git -- 一个版本控制工具
SSM的项目:3天
maven
没有maven的时候,我们写项目会有很多问题:
1.jar包的问题
导包的方式不方便:需要我们将jar包 复制粘贴到项目中的lib目录中
每一个项目都单独的需要一份jar包: jar包会浪费很多空间
2.项目管理的问题
写一个项目的最终目的是需要将项目发布到服务器。
一个项目需要发布到服务器,需要做的准备工作:
1.编译 将所有的.java文件编译成.class文件
2.测试 每一个功能都应该有相应的单元测试
3.打包 将编译好的.class文件以及其他的比如前端页面/配置文件,进行打包
4.发布 将打好的包 发布到服务器
如何解决上面所说的两个问题:使用maven
maven的介绍
Apache Maven是一个(特别是Java编程)项目管理及自动构建工具,使用java语言编写(所以依赖java_home)
基于项目对象模型(缩写:POM)概念
包含了一个POM 以及 项目生命周期 以及 项目生命周期中的插件
根据上面的介绍,我们可以简单的认为maven是一个依赖管理与项目生命周期管理的框架
也就是说maven主要两个功能:
1.依赖管理
依赖:比如jar包、自己写的项目之间互相依赖
管理:有Maven统一的管理所有的jar包
2.生命周期管理
由maven管理指定项目的整个生命周期
生命周期:编译、测试、打包、发布…..
maven的依赖管理
基本原理
小结:如果使用了maven则我们的项目依赖的所有jar包都不需要我们手动的下载、复制、粘贴了,让依赖管理变得非常的简单了
定位jar包
我们使用maven的时候,我们的 项目需要向本地仓库请求jar包
那么如果指定某一个具体的jar包呢
答案:使用groupId+artifactId+version 就一定可以定位到某个具体的jar包
比如使用fastjson jar包 的指定方式:
在某个文件中就编写:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastJson</artifactId>
<version>1.2.6</version>
</dependency>
编写的方式:我们简称为jar包的坐标
编写的文件是maven项目必须维护的一个文件:pom.xml
如何知道Jar包的坐标
不可能知道,所以需要到指定的网站进行查询
网站的网址:Attention Required! | Cloudflare (mvnrepository.com)
如果登录这个网站出现:表示访问失败
出现这个问题有两个可能的原因:
1.网速太慢
解决方案:加钱
2.DNS服务器没有配置
解决方案:配置DNS服务器
配置的方式:
安装maven
maven是免安装的,所以只需要将maven下载下来,然后解压就行了
现在建议使用3.5版本及以上
注意:解压的路径的父目录尽量不要有中文与空格
maven的目录结构
bin:表示执行mvn的相关命令
boot:启动相关
conf:存放了maven的配置文件
其中有一个文件叫做:settings.xml,在这个文件中可以配置:1.本地仓库的路径 2.镜像的路径
lib:maven依赖的Jar包
我们建议安装好maven后都将本地仓库与镜像进行配置:
1.配置本地仓库:因为默认的本地仓库’C:/Users/当前用户/.m2/repository’ 这个目录的路径太深了,操作的时候不够方便,建议自定义本地仓库
2.配置镜像路径:要求所有人必须配置,因为如果不配置,则maven默认去远程仓库下载jar包,速度太慢
配置maven的本地仓库与镜像
<localRepository>E:\mvn_repo</localRepository>
<!-- 配置阿里云镜像 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
配置maven的环境变量
注意:maven是使用java语言编写的,所以maven会默认通过JAVA_HOME去找到java的位置
那么如果JAVA_HOME没有配置,或者配置错了,则maven也启动不了
IDEA配置maven
IDEA创建maven项目
创建普通的javaSE项目
创建好的maven项目可能项目:
就是很多插件爆红,可能的原因:
1.就是网络问题 不能正常下载
2.下载了一部分但是没有下载完成 后果:maven去本地仓库找这个插件能找到,所以maven就不下载了,但是这个插件不能用
方案:自己找到自己的本地仓库 将下载的那一部分删除
项目结构
java:存放源代码
resources:存放配置文件
test-java:存放单元测试的源代码的
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjpowernode</groupId>
<artifactId>maven-simple</artifactId>
<version>1.0</version>
</project>
会声明本身的坐标:groupId+artifactId+version
此文件中还可以声明依赖(jar包)
比如引入fastjson的依赖:
依赖测试
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjpowernode</groupId>
<artifactId>maven-simple</artifactId>
<version>1.0</version>
<!-- 所有的依赖都通过dependency标签就行引用
所有的dependency标签都应该属于dependencies标签
-->
<dependencies>
<!-- 如果引用的依赖的坐标是红色 表示本地仓库没有这个依赖
则需要刷新maven 让maven去中央仓库下载这个jar包
下载成功后 就变成黑色了
-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
package com.bjpowernode;
import com.alibaba.fastjson.JSON;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestMavenJar {
@Test
public void test1(){
// 创建了对象
DataResult dataResult = new DataResult();
dataResult.setMsg("注册成功");
dataResult.setSuccess(true);
// 把对象转成json格式的字符串
String s = JSON.toJSONString(dataResult);
System.out.println("s = " + s);
// 把json格式的字符串,转成 对象
DataResult dataResult1 = JSON.parseObject(s, DataResult.class);
System.out.println(dataResult1);
}
}
@Data
public class DataResult {
private boolean success;
private String msg;
}
创建web项目
目录结构
main/java: 源码
main/resources: 存放开发环境的配置文件
webapp:存放前端相关的资源
test/java:存放测试的源码
test/resources:存放测试的配置文件
hello maven小案例
1.创建前端页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="js/jquery-1.11.1-min.js"></script>
<script>
$(function () {
$("#spanId").click(function () {
$.get("/hello",function (data) {
alert(1);
console.log(data);
$("#spanId").text(data); // 把data 给 text方法,表示data一般是string
})
})
})
</script>
</head>
<body>
<%--
需求:通过异步请求,发送给后台servlet 获取随意的字符串,并把该字符串显示到 span 标签上
--%>
<span id="spanId">span</span>
</body>
</html>
2.导包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
</dependencies>
3.编写servlet
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setContentType("text/html;charset=utf-8");
// PrintWriter writer = resp.getWriter();
// writer.println("hello maven");
// writer.flush();
// writer.close();
System.out.println("===============发送的数据格式必须和 设置的格式一致========");
resp.setContentType("application/json;charset=utf-8");
PrintWriter writer = resp.getWriter();
String str = "hello maven";
String s = JSON.toJSONString(str);
writer.println(s);
writer.flush();
writer.close();
}
}
依赖的细节问题
使用dependency标签指定依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<groupId><artifactId><version>这三个标签是用它来指定jar包的坐标
scope标签
这个标签用来控制jar包的作用域
可选的作用域:
compile
是默认的作用域
作用域:在主程序 测试程序 编译文件
这是最常用的作用域
test
作用域:测试程序
使用场景:所有的测试工具 比如:junit
provided
作用域: 主程序 测试程序
使用场景:如果某个jar包服务器自带了 则就不用部署到服务器也就不用在编译文件中生效
比如:servlet
依赖的传递性
我们应用了一个jar包a, 而jar包a本身应用了jar包b
则我们可以直接使用jar包b
因为依赖具有传递性
测试:
1.在mavena项目中引用mysql的驱动包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
2.将mavena项目打成jar包存放到自己的本地仓库中(使用使用install命令)
3.使用mavenb项目引用mavena项目
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>mavena</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
4.测试
在mavenb中进行测试
package com.bjpowernode;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TestJar {
@Test
public void test1() throws SQLException {
//因为能成功的获取Connection对象,所以证明mavenb能够成功使用mysql的驱动包 而mysql驱动包是由mavena项目引用的 所以证明了jar包具有传递性
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cms2104", "root", "123456");
System.out.println(conn);
}
}
依赖的剔除(了解)
在上面案例中mavenb引用了mavena
mavena引用mysql驱动包
现在:如果mavenb也引用一个mysql驱动包并且版本与mavena的不一致
mavenb的依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>mavena</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
</dependencies>
查看mavenb的实际的依赖:
这样的情况有可能引发jar包的冲突问题
解决方案:mavenb在引用mavena时可以指定剔除mavena中的某一个jar包
开始剔除:
在mavenb项目中修改pom.xml文件
<dependency>
<groupId>org.example</groupId>
<artifactId>mavena</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 指定排除掉引用的mavena项目中的指定jar包-->
<exclusions>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
</dependency>
检查是否排除成功:
maven管理项目的生命周期
项目的生命周期:
表示项目从创建出来开始 一直到 项目发布到服务器 的整个过程
clean: 将打好的包删除
compile:编译 将所有的.java文件编译成.class文件
test: 测试 将所有的单元测试统一执行,如果某一个单元测试抛出异常则测试失败
package:打包 将所有需要发布到服务器的文件打成jar/war 包
install:安装 将包安装到本地仓库中
deploy:发布 将项目发布到服务器中
聚合项目
一个项目由多个子项目组成
什么时候会使用聚合项目:如果一个项目特别的大,大到每一个模块都需要一台都需要单独作为一个项目管理
主要是引用在分布式的场景下:
比如有一个项目:动力商城
每一个模块:controller service dao 的逻辑与代码量都很大
建议将每一个模块作为一个单独的项目独立管理
然后将这些项目聚合在一起形成一个总的商城项目
后面会学(今天只做了解)
今天主要是在Maven依赖的角度来学习聚合项目
案例:动力商城项目
不写任何代码 做为这个项目每一个子项目添加依赖
创建父工程
父工程中不需要任何的java代码 ,只需要将其他的项目聚合起来就行了
所以父工程可以将src目录删除
创建controller子工程
创建webapp项目
创建service子工程
创建一个普通的Java项目
创建dao子工程
创建一个普通的Java项目
父子工程的标识
1.在父工程中的pom.xml
<modules>
<module>powershop-controller</module>
<module>powershop-service</module>
<module>powershop-dao</module>
</modules>
2.在每一个子工程中的pom.xml
<parent>
<artifactId>powershop</artifactId>
<groupId>com.powernode</groupId>
<version>1.0</version>
</parent>
父子工程的jar包的特点
父工程的jar包 子工程可以直接继承
所以建议所有的jar包的引用,都放在父工程中
所有的子工程都可以直接继承
例如:在父工程中引用Mysql的驱动包
效果:每一个子工程也都有了这个jar包
对于不是公用的Jar包的处理
处理方式:
1.这个jar包不放在父工程中,在需要使用的子工程中单独引用
弊端:如果某几个子工程都要使用同样的jar包 则需要重复的引用,并且不能统一的管理这几个子工程引用的Jar包的版本
2.还是让父工程管理所有的jar包,但是对某些不是全部子工程公用的jar包使用
子工程之间的互相引用
将每一个子工程都打包
在controoler子工程中使用dependency引用service工程
在controoler子工程中使用dependency引用dao工程
小结
所谓的聚合项目:
1.父工程统一的管理所有的Jar包
2.子工程直接互相引用
直接看源码