框架基本介绍


框架部分的整体介绍

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的依赖管理

基本原理

image-20211215091018079

image-20211215091949682

小结:如果使用了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)

如果登录这个网站出现:表示访问失败

image-20211215095528937

出现这个问题有两个可能的原因:

1.网速太慢

解决方案:加钱

2.DNS服务器没有配置

解决方案:配置DNS服务器

配置的方式:

image-20211215095801113

image-20211215095827507

image-20211215095920255

image-20211215100004515

image-20211215100046732

image-20211215100258845

image-20211215100339894

image-20211215100613547

image-20211215100728966

安装maven

maven是免安装的,所以只需要将maven下载下来,然后解压就行了
现在建议使用3.5版本及以上

注意:解压的路径的父目录尽量不要有中文与空格

maven的目录结构

image-20211215102155293

bin:表示执行mvn的相关命令

boot:启动相关

conf:存放了maven的配置文件

​ 其中有一个文件叫做:settings.xml,在这个文件中可以配置:1.本地仓库的路径 2.镜像的路径

lib:maven依赖的Jar包

我们建议安装好maven后都将本地仓库与镜像进行配置:

1.配置本地仓库:因为默认的本地仓库’C:/Users/当前用户/.m2/repository’ 这个目录的路径太深了,操作的时候不够方便,建议自定义本地仓库

2.配置镜像路径:要求所有人必须配置,因为如果不配置,则maven默认去远程仓库下载jar包,速度太慢

配置maven的本地仓库与镜像

image-20211215102944777

<localRepository>E:\mvn_repo</localRepository>

image-20211215103123459

 
     <!-- 配置阿里云镜像 -->
     <mirror>  
      <id>alimaven</id>  
      <name>aliyun maven</name>  
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
      <mirrorOf>central</mirrorOf>          
    </mirror> 
 

配置maven的环境变量

image-20211215104022129

image-20211215104110853

image-20211215104216940

注意:maven是使用java语言编写的,所以maven会默认通过JAVA_HOME去找到java的位置

那么如果JAVA_HOME没有配置,或者配置错了,则maven也启动不了

IDEA配置maven

image-20211215111107631

image-20211215111422119

IDEA创建maven项目

创建普通的javaSE项目

image-20220616113032525

image-20211215112145849

创建好的maven项目可能项目:

就是很多插件爆红,可能的原因:

1.就是网络问题 不能正常下载

2.下载了一部分但是没有下载完成 后果:maven去本地仓库找这个插件能找到,所以maven就不下载了,但是这个插件不能用

方案:自己找到自己的本地仓库 将下载的那一部分删除

项目结构

image-20211215115630198

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项目

image-20211215140842984

image-20211215141003864

image-20211215141151795

目录结构

image-20211215144748009

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命令)

image-20211215154832766

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的实际的依赖:

image-20211215162227916

这样的情况有可能引发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>

检查是否排除成功:

image-20211215162642912

maven管理项目的生命周期

项目的生命周期:

表示项目从创建出来开始 一直到 项目发布到服务器 的整个过程

image-20211215162944057

clean: 将打好的包删除

compile:编译 将所有的.java文件编译成.class文件

test: 测试 将所有的单元测试统一执行,如果某一个单元测试抛出异常则测试失败

package:打包 将所有需要发布到服务器的文件打成jar/war 包

install:安装 将包安装到本地仓库中

deploy:发布 将项目发布到服务器中

image-20211215163702186

聚合项目

一个项目由多个子项目组成

什么时候会使用聚合项目:如果一个项目特别的大,大到每一个模块都需要一台都需要单独作为一个项目管理

主要是引用在分布式的场景下:

比如有一个项目:动力商城

每一个模块: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包

image-20211215172437687

image-20211215172501634

对于不是公用的Jar包的处理

处理方式:

1.这个jar包不放在父工程中,在需要使用的子工程中单独引用

弊端:如果某几个子工程都要使用同样的jar包 则需要重复的引用,并且不能统一的管理这几个子工程引用的Jar包的版本

2.还是让父工程管理所有的jar包,但是对某些不是全部子工程公用的jar包使用

image-20211215173146378

image-20211215173205748

子工程之间的互相引用

将每一个子工程都打包

在controoler子工程中使用dependency引用service工程

在controoler子工程中使用dependency引用dao工程

image-20211215173657100

image-20211215173726388

小结

所谓的聚合项目:

1.父工程统一的管理所有的Jar包

2.子工程直接互相引用

直接看源码


文章作者: 勾魂大猩猩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 勾魂大猩猩 !
  目录