Maven-程序员宅基地

02.Maven介绍与作用【理解】

疑问
  • 项目引用第三方jar包直接将jar包复制到项目中的方式好不好?不好在哪里?

    不好,原因如下:
    1.因为管理jar包不方便。一个项目复制一次jar包,很多项目导致磁盘jar包冗余;
    2.jar包类冲突无法解决。复制过来的jar包,就会使用里面所有类的api,无法排除指定类的api。
    
  • 有没有更好的方式管理项目引入jar包?

    有,实现项目构建工具maven
    
maven介绍
可以管理项目jar包的构建,解决jar包之间的冲突;可以对项目进行管理,比如项目打包等,maven使用pom项目对象模型进行构建项目的。
POM介绍
POM(Project Object Model 项目对象模型),是一个maven的核心配置文件(xml格式)。用于描述项目如何构建,声明项目依赖,打包运行的方式等等。它是按面向对象的思想来管理项目的(每个jar包都是一个对象,通过给对象配置不同的属性来解决jar包的使用范围、不同版本冲突等),每个maven工程中都有一个pom.xml配置文件。
maven的作用
1. 项目jar包的构建
2. 项目的管理(项目生命周期的管理)
   比如:打包,javase项目打jar,javaweb项目打成war包,还有其他功能
3. 分模块开发,在maven高级的时候讲解
小结
  • 为什么使用maven管理jar的引用(maven的依赖管理)?

    因为可以更加灵活控制每个jar包的使用,还可以节省磁盘jar包冗余,解决jar包类的冲突
    

03.Maven的仓库【理解】

疑问
  • 使用maven管理依赖jar包,以后就不用复制jar包到项目中了,那么maven从哪里获取jar包进行构建项目呢?

    仓库(磁盘的空间位置)
    
仓库类型

[外链图片转存失败(img-h979bsMX-1567396505767)(assets/)]

官方中央仓库地址:http://repo1.maven.org/maven2/

第三方阿里云仓库:http://maven.aliyun.com/nexus/content/groups/public/

小结
  1. 本地仓库的作用?

    本地缓存,加快项目引用jar包构建
    
  2. 远程仓库有哪几种?

    3种:官方、第三方、私服
    

04.Maven的坐标【理解】

疑问
  • 所有项目要引用的jar包都在仓库里面,如何从仓库里面找到jar包给项目构建使用?

    使用maven的坐标去仓库里面找到jar包给项目去构建

坐标的作用

可以在pom.xml配置坐标信息,坐标信息用于指向仓库里面具体jar包的位置

坐标具体含义

[外链图片转存失败(img-M9jOTkAs-1567396505768)(assets/)]

groupId,对应仓库里面第一层目录

artifactId,对应仓库里面第二层目录

version,对应仓库里面第三层目录

例子,引用junit的jar包使用坐标来描述,这个描述会放到pom.xml文件中
<dependency>  <!--依赖-->
<groupId>junit</groupId>   <!--组织名,仓库里面的第一层目录-->
<artifactId>junit</artifactId>  <!--项目名-模块名, 仓库里面的第二层目录-->
<version>4.12</version>  <!--版本号, 仓库里面的第三层目录-->
<scope>test</scope>
</dependency>

[外链图片转存失败(img-VeNdihmo-1567396505769)(assets/)]

本地仓库的jar包位置

[外链图片转存失败(img-ftqEu4lV-1567396505769)(assets/)]

注意的点:大多数每个坐标的组成都对应一层目录,只有groupId特殊,如果groupid描述的信息中有“.”,就会代表多层目录结构

[外链图片转存失败(img-LjSYYEUo-1567396505769)(assets/)]

小结
  • 坐标的作用是什么?

    引用仓库里面的jar包
    

05.Maven的安装与配置【应用】

实现步骤
  1. 下载maven(素材中提供)

    [外链图片转存失败(img-LIzn0dki-1567396505770)(assets/)]

  2. 解压完成安装

    [外链图片转存失败(img-kZknd8nO-1567396505770)(assets/)]

  3. 介绍maven服务器的目录结构

    [外链图片转存失败(img-Ra7DCNtd-1567396505770)(assets/)]

    [外链图片转存失败(img-1d21vFry-1567396505771)(assets/)]

    [外链图片转存失败(img-it4VCR0J-1567396505771)(assets/)]

  4. 配置maven全局配置文件settings.xml

    • 绑定本地仓库

      [外链图片转存失败(img-f1wiwEIF-1567396505771)(assets/)]

      <localRepository>C:\webServer\repository</localRepository>
      
    • 绑定远程仓库,阿里云

      	 <mirror>
            <id>nexus</id>
            <mirrorOf>*</mirrorOf> 
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          </mirror>	
      

      注意,上面id的名字不要改,否则会导致本地仓库的所有jar需要重新下载

      将上面信息配置到如下位置

      [外链图片转存失败(img-6dKlvaVF-1567396505772)(assets/)]

    • 配置全局的jdk编译语言级别版本(如果不配这个,默认编译级别是1.5,太低,idea运行的会有警告)

        <profile>
          <id>development</id>
          <activation>
            <jdk>1.8</jdk>
            <activeByDefault>true</activeByDefault>
          </activation>
          <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
          </properties>
        </profile>
      

      将上面内容添加到如下配置文件位置

      [外链图片转存失败(img-Yp5Mk7vR-1567396505772)(assets/)]

  5. 设置环境变量,到处都可以使用maven的命令

    [外链图片转存失败(img-EjJdTdYu-1567396505772)(assets/)]

  6. 测试是否安装配置成功,如下信息代表配置成功

    [外链图片转存失败(img-VauzpooZ-1567396505773)(assets/)]

小结
  • 给maven配置环境变量有哪些?

    MAVEN_HOME
    Path
    
  • 安装maven,给全局配置文件settings.xml配置什么信息?

本地仓库
远程仓库
全局jdk编译语言级别版本




### 06.IDEA绑定本地Maven服务器【应用】

##### idea当前项目或工作空间绑定Maven实现步骤

![\[外链图片转存失败(img-U5e1RNK6-1567396505773)(assets/)\]](https://img-blog.csdnimg.cn/2019090212485113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0J1bGlkX0V2b2x0bw==,size_16,color_FFFFFF,t_70)

运行参数绑定

1. 设置运行参数

 -DarchetypeCatalog=internal  ,用于设置任何配置信息都从本地缓存中拿。有一些模板信息maven默认从远程仓库下载获取,如果设置了这个参数第一次从远程拿,以后从本地拿(这就要求大家第一次玩maven必须联网,1~5M不等)

 ```properties
 -DarchetypeCatalog=internal

配置效果如下

[外链图片转存失败(img-HAIcnX1K-1567396505773)(../../day35(Maven%E5%9F%BA%E7%A1%80)]/%E7%AC%94%E8%AE%B0/assets/)

全局设置以后所有新建的项目或工作空间绑定Maven实现步骤
  1. 绑定本地maven软件

    [外链图片转存失败(img-NK0nKFM3-1567396505774)(assets/)]

    [外链图片转存失败(img-hQ301CMg-1567396505774)(assets/)]

    注意,旧的项目或工作空间需要每个单独设置绑定maven

07.使用Maven骨架向导创建javaweb工程【了解】

实现步骤
  1. 使用向导骨架创建maven项目

    [外链图片转存失败(img-U6JrWb69-1567396505775)(assets/)]

    [外链图片转存失败(img-vP8JaRnB-1567396505775)(assets/)]

    新建模块设置坐标是为了以后可以将项目打包后安装到仓库,给其他人使用

    [外链图片转存失败(img-ib7jZhRY-1567396505775)(assets/)]

    [外链图片转存失败(img-Z95vLtY3-1567396505777)(assets/)]

    生成默认的项目目录结构

    [外链图片转存失败(img-vvhw1Ug8-1567396505778)(assets/)]

    配置maven自动刷新

    [外链图片转存失败(img-AeNAHTh1-1567396505779)(assets/)]

    如图下面webapp有蓝点

    [外链图片转存失败(img-sDOG8g7H-1567396505779)(assets/)]

  2. 学习maven对javaweb项目目录结构的要求规范

    项目名字
    	src
    		main-------------------主程序目录,会被放到打包war文件中【必须有】
    			java---------------主程序java源文件目录	
    			resources----------放业务配置文件,最后会放到classes类路径下面
    			webapp-------------存储web资源文件,类似以前web工程中web目录
    		test-------------------测试程序目录,不会放到war文件中【可有可无】
    			java---------------测试程序java源文件目录	
    			resources----------放测试配置文件(经常不用这个目录)
    	target---------------------输出目录存放部署资源和编译代码,由maven自动管理生成
    	pom.xml
    

    完善当前javaweb项目目录结构

    [外链图片转存失败(img-2B69J7QN-1567396505779)(assets/)]

    注意:里面的颜色变化,需要点击maven projects窗口里面的刷新才会有。

  3. 介绍pom.xml文件(每个项目都有maven的核心配置文件)

    <?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>javaee117</groupId>
      <artifactId>day35_01_javaweb_archetype</artifactId>
      <version>1.0-SNAPSHOT</version>
      <!-- 设置打包方式,war代表当前项目打成war包,如果不设置默认打成jar包 -->
      <packaging>war</packaging>
    
      <!-- name与url的配置可有可无,因为没有具体意义,name设置maven窗口显示的模块名称,url显示的访问地址-->
      <name>day35_01_javaweb_archetype Maven Webapp</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <!--设置全局属性-->
      <properties>
        <!--设置maven的码表,与当前项目没有关系,只会影响maven的输出信息-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--设置jdk编译语言的级别改为1.8,如果不设置会采用settings.xml全局配置文件的设置-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>
    
    
      <!--配置jar的引用依赖-->
      <dependencies>
    
        <!--配置junit的jar包引用-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
    
      <!--配置构建需要的工具-->
      <build>
    
        <!--finalName也是可有可无,代表名字-->
        <finalName>day35_01_javaweb_archetype</finalName>
    
        <!--配置的插件,插件就是代表一种功能,下面是骨架方式生成的插件信息
              下面配置的插件版本比较高,如果不配置,插件默认也有的,只不过版本比较低
        -->
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.2.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    
    

    总结:骨架方式生成的pom.xml文件生成了很多没有用的信息

  4. 开发一个Servlet

    导入servelet的jar包依赖,在pom文件中dependencies标签里面

    [外链图片转存失败(img-CPJ6CPiT-1567396505780)(assets/)]

    疑问:为什么以前的web项目没有导入servlet的jar包,也可以开发servlet?

    答:因为以前的项目与tomcat直接绑定,tomcat上就有servlet的jar包,所以以前项目不用。

    证明1:项目与tomcat是绑定的

    [外链图片转存失败(img-hnILQoSh-1567396505780)(assets/)]

    证明2:tomcat默认有servlet的jar包

    [外链图片转存失败(img-Or3Kk9bX-1567396505781)(assets/)]

    选中main/java鼠标右键创建servlet

    [外链图片转存失败(img-LtaJW4L5-1567396505781)(assets/)] 

    package com.itheima.web;
    
    import java.io.IOException;
    
    @javax.servlet.annotation.WebServlet(name = "DemoServlet", urlPatterns = "/DemoServlet")
    public class DemoServlet extends javax.servlet.http.HttpServlet {
          
        protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
          
            doGet(request, response);
        }
    
        protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
          
    
            //数据数据给浏览器
            response.getWriter().write("hello maven javaweb archetype");
        }
    }
    
  5. 部署项目运行

    由于maven工程默认没有与tomcat绑定,所以需要手动部署运行

    [外链图片转存失败(img-m6noPHJD-1567396505781)(assets/)]

    运行效果

    [外链图片转存失败(img-c2yEUTEU-1567396505782)(assets/)]

    注意运行部署的位置

    [外链图片转存失败(img-Yx39wK35-1567396505782)(assets/)] 

小结
  • maven项目对javaweb目录结构的要求是什么?

    src

    ​ main

    ​ java

    ​ resources

    ​ webapp

    ​ test

    ​ java

    ​ resources

    target

    pom.xml

08.使用Maven自定义创建javaweb工程【了解】

实现步骤
  1. 创建maven项目,不用向导骨架

    [外链图片转存失败(img-DB5d2JdC-1567396505783)(assets/)]

    [外链图片转存失败(img-HPCbcw8P-1567396505783)(assets/)]

    [外链图片转存失败(img-8hvbMuqF-1567396505783)(assets/)]

    生成的默认目录结构

    [外链图片转存失败(img-f3qjuRng-1567396505784)(assets/)]

  2. 完成项目目录结构

    完成webapp目录

    [外链图片转存失败(img-VbvhO4Tp-1567396505784)(assets/)]

    [外链图片转存失败(img-C2KhhVUS-1567396505784)(assets/)]

    将web目录拖拽到main目录里面,并修改名字为webapp

    [外链图片转存失败(img-65RGBdIZ-1567396505785)(assets/)]

    更新当前项目的webapp目录位置,因为如下报错

    [外链图片转存失败(img-sExitbhF-1567396505785)(assets/)]

    修改正确

    [外链图片转存失败(img-L2tJ9Uny-1567396505785)(assets/)]

    完善后的路径

    [外链图片转存失败(img-rbAlaEEy-1567396505788)(assets/)]

  3. 开发一个servlet

    完善pom文件

    <?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>javaee117</groupId>
        <artifactId>day35_02_javaweb_selfdefine</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--设置打包方式-->
        <packaging>war</packaging>
    
        <!--导入jar包-->
        <dependencies>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <!--servlet-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    
    
    </project>
    

    创建servlet

    package com.itheima.web;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(name = "DemoServlet", urlPatterns = "/DemoServlet")
    public class DemoServlet extends HttpServlet {
          
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          
            response.getWriter().write("hello javaweb selfdefine");
        }
    }
    
  4. 部署运行

    [外链图片转存失败(img-0wy1mExi-1567396505788)(assets/)]

小结
  • 自定义方式创建方式需要额外做什么?

    完善目录结构添加webapp

    完善pom.xml添加打包方式

09.使用maven自定义和插件创建JavaWeb工程【重要】

实现步骤
  1. 安装插件(只需要做一次,以后不用做,根据插件安装文档安装),安装完成之后重启idea

    鼠标右键有如下菜单说明插件安装完成

    [外链图片转存失败(img-xM6YXYMR-1567396505789)(assets/]

  2. 新建项目

    [外链图片转存失败(img-VqRcOY3k-1567396505789)(assets/)]

    [外链图片转存失败(img-WKYXnYmU-1567396505789)(assets/)] 

  3. 使用插件优化项目目录结构

    [外链图片转存失败(img-Hr4tbcNs-1567396505790)(assets/)]

    [外链图片转存失败(img-lvbAkge7-1567396505790)(assets/)]

    直接点击OK

    [外链图片转存失败(img-CBoKsV70-1567396505791)(assets/)]

  4. 开发servlet

    导入依赖

    [外链图片转存失败(img-UkbAYurC-1567396505791)(assets/)]

    servlet代码

    package com.itheima.web;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(name = "DemoServlet", urlPatterns = "/DemoServlet")
    public class DemoServlet extends HttpServlet {
          
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          
            response.getWriter().write("hello maven javaweb selfdefine plugin");
        }
    }
    
  5. 部署运行

    [外链图片转存失败(img-KPR9H6LX-1567396505791)(assets/]

小结
  • 使用maven插件帮助创建了什么?

    创建了webapp和打包方式

10.Maven的生命周期常用命令1—clean与使用命令方式【应用】

目标

通过生命周期管理命令管理项目

生命周期命令介绍

[外链图片转存失败(img-kfnfzImr-1567396505792)(assets/)]

使用命令方式
  1. 方式一:传统方式使用dos命令

    [外链图片转存失败(img-QKzzEqXb-1567396505792)(assets/)]

  2. 方式二:使用idea开发工具内置集成的maven工具操作(推荐方式)

    [外链图片转存失败(img-KsRD9u8m-1567396505792)(assets/)]

11.Maven的生命周期常用命令2—其他命令【应用】

complie命令:用于对main目录下的java代码编译

test命令:先编译再运行test目录下的所有java代码,运行test目录下的java有2个要求

​ 要求1:测试类类名必须以Test为结尾,否则只会编译不会运行

​ 要求2:使用test目录运行测试类输出中文,默认会乱码,不建议使用test命令运行测试类,而是直接在测试类里面点击运行不会乱码。如果要解决这个乱码需要如下设置【了解】

​ a.设置当前项目maven码表为utf8

​ b.所有生命周期的命令都是使用插件完成的,要求插件必须使用最新版本

​		[外链图片转存失败(img-0zT0rbLz-1567396505793)(assets/)]

[外链图片转存失败(img-8gmZzAEy-1567396505793)(assets/)]

package命令:将当前项目进行打包的

intall命令:将当前项目安装到本地仓库

总结

[外链图片转存失败(img-29ZqMRMj-1567396505794)(assets/)]

12.依赖管理-依赖插件【应用】

maven的插件介绍

maven工具自带的插件,每个插件都有特殊的功能,常见知名的插件有2个

jdk编译语言级别设置插件
tomcat7插件
实现步骤
  1. jdk插件用于设置编译级别【了解】

  2. tomcat7插件,非常建议使用这个,因为部署项目速度快

    配置插件代码

    <?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>javaee117</groupId>  
      <artifactId>day35_03_javaweb_selfdefine_plugin</artifactId>  
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <!--导入jar包-->
      <dependencies>
        <!--junit-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
        <!--servlet-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
      </dependencies>
    
      <build>
    
        <plugins>
       <!-- jdk版本编译语言级别插件(了解),因为一般都采用全局settings.xml配置了,如果当前项目不使用全局就可以使用这个插件 -->
          <plugin>
         <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
         <version>3.2</version>
            <configuration>
           <source>1.8</source>
              <target>1.8</target>
           <encoding>UTF-8</encoding>
              <showWarnings>true</showWarnings>
         </configuration>
          </plugin>
    
          <!--tomcat7的插件,官方只提供了tomcat7,没有提供tomcat8
              对比:tomcat7插件与tomcat正式服务器的区别
                    tomcat7插件部署速度快,有如下2个快:
                        A.支持webapp目录下资源修改的热部署,即修改后立即生效,不需要重新部署
                        B.不需要部署,服务器直接运行当前项目模块位置的代码
    
          -->
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
              <port>8080</port><!--设置插件使用端口-->
              <path>/</path>   <!--设置项目资源部署目录的名字-->
              <uriEncoding>UTF-8</uriEncoding>  <!--设置get提交中文码表为utf-8,目的解决tomcat7的get方式提交中文乱码-->
              <server>tomcat7</server>   <!--插件服务器的名字-->
            </configuration>
          </plugin>
        </plugins>
    
      </build>
    </project>
    
    

    使用插件运行

    [外链图片转存失败(img-WiOcGFkS-1567396505794)(assets/)]

    [外链图片转存失败(img-mNtoyi8T-1567396505794)(assets/)][外链图片转存失败(img-hED7DhkK-1567396505795)(assets/1547610634710.png)]

    运行浏览器

    [外链图片转存失败(img-Y29hjp3w-1567396505795)(assets/)]

    对与webapp目录下的资源修改,支持热部署(修改完立刻可以看到效果,不用重新部署)

    对于main目录下java和resources任何的修改,不支持热部署,需要重新部署。

小结

推荐使用tomcat7,官方没有提供tomcat8,只能用tomcat7插件

tomcat7,get请求提交中文默认会乱码,但是这个插件解决了

[外链图片转存失败(img-yofHlVjm-1567396505795)(assets/)]

13.依赖管理-依赖jar与依赖范围【理解】

依赖jar包

http://mvnrepository.com/ ,不会写可以在这里参照jar包的坐标依赖写法

<dependencies> 
  <dependency> 
    <groupId>junit</groupId>  
    <artifactId>junit</artifactId>  
    <version>4.12</version>  
    <scope>test</scope> 
  </dependency>

  <!--指定Servlet的依赖包-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>  
依赖范围介绍

上面的依赖jar包有个scope是依赖范围,就是这个jar包在什么情况下起作用或使用。

[外链图片转存失败(img-9on2yaBD-1567396505796)(assets/)]

[外链图片转存失败(img-ILNggKkl-1567396505796)(assets/)]

编译classpath:在main目录下的java代码编译时可用

测试classpath:在test目录下的java代码编译时可用

运行时classpath:在运行的时候可用,才会将jar包部署到服务器上

编译时和运行时:

​ 编译时:指将java代码编译成class文件的时候

​ 运行时:在服务器上运行.class文件的时候

test依赖范围

只有在test目录下编译代码的时候可用

[外链图片转存失败(img-sIp7L7Bv-1567396505797)(assets/)]

provided依赖范围

在运行的时候不可用。

​ servlet的jar包由于服务器上已经存在,所以使用provided就不会将其部署到服务器上。在tomcat7服务器上,如果将这个jar包部署到服务器上会与服务器自带的servlet的jar包产生冲突

[外链图片转存失败(img-XRDI0GrX-1567396505797)(assets/)]

runtime依赖范围

只有运行时需要,其他情况不需要。mysql的驱动包,编译的时候不用,但是服务器运行的时候要用

我们写jdbc操作的编译时候,使用的都是jdk的接口(connection,Resultset,PreparedStatement这些接口)

在运行jdbc的.class文件的时候,获取mysql的数据库连接com.mysql.jdbc.Connection的实例对象操作数据库

,所以运行的时候mysql驱动包

[外链图片转存失败(img-SBuitXjx-1567396505797)(assets/)]

注意

如果没有配置依赖范围,默认使用complie,所有地方都需要。

小结

14.Maven案例添加联系人信息1-需求与环境搭建【应用】

需求

[外链图片转存失败(img-JDSkqdyR-1567396505797)(assets/)]

点添加联系人的按钮,弹出如下的模态框,使用原型文件夹的页面

[外链图片转存失败(img-HBd9pjOH-1567396505798)(assets/)]

点保存添加一行,使用ajax向后台数据库添加一行记录,更新表格,隐藏模态框。

[外链图片转存失败(img-Q9B0KwHO-1567396505798)(assets/)]

[外链图片转存失败(img-GfQ5z5sA-1567396505799)(assets/)]

模态框方法

[外链图片转存失败(img-tmD8fj4E-1567396505799)(assets/)]

新建maven工程

[外链图片转存失败(img-oppLnx25-1567396505799)(assets/)]

导入页面原型素材,导入到项目main目录下

[外链图片转存失败(img-C69GTbKH-1567396505799)(assets/)]

环境搭建

pom文件内容

<?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>javaee112</groupId>  
  <artifactId>day35_04_contactSys</artifactId>  
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!--servlet-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.40</version>
      <scope>runtime</scope>
    </dependency>

    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

    <!--BeanUtils-->
    <dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils</artifactId>
      <version>1.9.2</version>
      <scope>compile</scope>
    </dependency>

    <!--jackson-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.3.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.3.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.3.3</version>
    </dependency>
    <!--jedis-->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.7.2</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>

      <!--tomcat7的插件-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8080</port>
          <path>/</path>
          <uriEncoding>UTF-8</uriEncoding>
          <server>tomcat7</server>
        </configuration>
      </plugin>

    </plugins>
  </build>
</project>

根据素材中“原型目录”中的所有资源导入项目中src/main目录下

[外链图片转存失败(img-kGtpwKc8-1567396505800)(assets/)]

代码结构

[外链图片转存失败(img-7cVWS5eW-1567396505800)(assets/)]

15.Maven案例添加联系人信息2-后端实现【应用】

实现步骤

[外链图片转存失败(img-SwUecVOT-1567396505800)(assets/)]

实现代码

IContactDAO代码

//添加联系人
@Insert("INSERT INTO contact2 VALUES(NULL,#{name},#{phone},#{email},#{birthday})")
void insert(Contact contact);

ContactService代码

//添加联系人业务方法,并且更新缓存
    public boolean addContact(Contact contact){
    

        //初始化sqlSession资源
        SqlSession sqlSession = MybatisUtils.getSession();
        IContactDao contactDao = sqlSession.getMapper(IContactDao.class);

        //1.调用dao添加联系人
        contactDao.insert(contact);

        //2.删除缓存,下次查询自动会更新缓存
        //获取Jedis连接对象
        Jedis jedis = JedisUtils.getJedis();
        //删除缓存数据
        jedis.del("contacts");
        //关闭连接
        jedis.close();

        //关闭sqlSession
        MybatisUtils.closeSession(sqlSession);

        return true;
    }

AddContactServlet代码

package com.itheima.servlet;

import com.itheima.entity.Contact;
import com.itheima.service.ContactService;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "AddContactServlet", urlPatterns = "/AddContactServlet")
public class AddContactServlet extends HttpServlet {
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        doGet(request, response);
    }

    //实例业务
    private ContactService contactService = new ContactService();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        try {
    
            //1.获取添加联系人数据封装到Contact对象
            Contact contact = new Contact();
            BeanUtils.populate(contact,request.getParameterMap());

            //2.调用业务层添加联系人
            boolean isAdd = contactService.addContact(contact);

            //3.返回添加成功,返回true
            response.getWriter().print(isAdd);
            //wirte方法适合输出字符串类型数据,其他类型输出使用print方法
        } catch (Exception e) {
    
            e.printStackTrace();
            throw new RuntimeException(e);//前端error回调函数接收弹出服务器忙
        }
    }
}

将解决乱码的过滤器放入到项目中

[外链图片转存失败(img-E3Q8Ryu2-1567396505801)(assets/)]

16.Maven案例添加联系人信息3-前端实现【应用】

实现步骤

[外链图片转存失败(img-MdXsF7RQ-1567396505801)(assets/)]

index.html实现代码
//1.给“保存”按钮注册点击事件
$("#btnSave").click(function () {
    

    //获取表单所有数据有2种方法:
    //方法一:一个一个表单项获取,有多少个就获取多少次
    //方法二(推荐):使用jquery提供获取表单所有数据方法,一次性获取所有数据
    var contactData = $("#contactForm").serialize(); //格式="name1=value1&name2=value2..." 键值对字符串格式
    //alert(contactData);

    //2.提交添加联系人异步请求,并传递表单所有数据给服务器
    $.post({
    
        url:"AddContactServlet",
        data:contactData,//传递表单所有数据
        success:function (isAdd) {
    

            //3.获取服务器返回的结果
            if(isAdd=="true"){
    
                //返回true,
                // 表单数据清空, jquery没有提供表单清空方法,js对象有,语法为:js对象.reset();
                $("#contactForm")[0].reset();

                // 关闭模态框
                $("#contactAdd").modal("hide");

                // 刷新页面数据,让“加载联系人列表”按钮执行点击事件
                $("#btnLoad").click();//click() 有参数叫绑定事件,没有参数就是执行点击事件

            }else{
    
                //返回false, 提示添加失败
            }

        },
        error:function () {
    
            //有异常,弹出“服务器忙”
            alert("服务器忙");
        }
    });
});

16.Maven案例添加联系人信息3-前端实现【应用】

index.html实现代码
//1.给“保存”按钮注册点击事件
$("#btnSave").click(function () {
    

    //获取表单所有数据有2种方法:
    //方法一:一个一个表单项获取,有多少个就获取多少次
    //方法二(推荐):使用jquery提供获取表单所有数据方法,一次性获取所有数据
    var contactData = $("#contactForm").serialize(); //格式="name1=value1&name2=value2..." 键值对字符串格式
    //alert(contactData);

    //2.提交添加联系人异步请求,并传递表单所有数据给服务器
    $.post({
    
        url:"AddContactServlet",
        data:contactData,//传递表单所有数据
        success:function (isAdd) {
    

            //3.获取服务器返回的结果
            if(isAdd=="true"){
    
                //返回true,
                // 表单数据清空, jquery没有提供表单清空方法,js对象有,语法为:js对象.reset();
                $("#contactForm")[0].reset();

                // 关闭模态框
                $("#contactAdd").modal("hide");

                // 刷新页面数据,让“加载联系人列表”按钮执行点击事件
                $("#btnLoad").click();//click() 有参数叫绑定事件,没有参数就是执行点击事件

            }else{
    
                //返回false, 提示添加失败
            }

        },
        error:function () {
    
            //有异常,弹出“服务器忙”
            alert("服务器忙");
        }
    });
});

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Bulid_Evolto/article/details/100223074

智能推荐

python网络编程之socket的使用_socket.gethostname-程序员宅基地

文章浏览阅读1.6k次。python网络编程之socket的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:p.._socket.gethostname

Ubuntu下eclipse indigo版在线安装hibernate插件_ubantu 安装hibernate-程序员宅基地

文章浏览阅读3.4k次。Ubuntu下eclipse indigo版在线安装hibernate插件:1.打开eclipse,进入Help->Install new software...;2.添加新站点,命名为:Hibernate Tools,地址:http://download.jbo_ubantu 安装hibernate

快速重装Windows操作系统秘籍-程序员宅基地

文章浏览阅读100次。无论菜鸟还是老鸟,用上电脑后,自己新装或者重装所需的操作系统是避免不了要做的事情。虽然安装操作系统的过程不算太复杂,但也的确是一件劳神费力的辛苦事。1.重装系统的主要步骤首先要调整系统引导顺序。一般是在开机的时候,按下DEL键,进入BIOS设置界面,将系统引导顺序中的设置更改为“CD-ROM”(光驱优先启动)。然后,对硬盘进行重新格式化。为了让新安装的操作系统拥有“绝对纯净”的环境,很..._hkc小蚂蚁重装

ajax跨域(1)-程序员宅基地

文章浏览阅读35次。通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新。但有的时候需要向其它域发送AJAX请求,完成数据的加载,例如Google。 在ASP.NetMVC 框架里实现跨域的AJAX请求有几种方式可以实现,以下就介绍常用的两种方法。1.发送JSONP请求客户端:jQuery对发送JSONP请求有很好的支持,客户端通过. aja..._vure withcredentials 跨域请求

SpringCloud微服务 Apollo分布式配置中心实现(四)_apollo all-in-one-程序员宅基地

文章浏览阅读833次。前言前面三节分别介绍了如实使用携程Apollo并在本地部署,本小结将深入学习Apollo-如何搞定定制与本地部署。案例实现在本地使用IDE定制化开发,参考:SpringCloud微服务 Apollo分布式配置中心实现(三)定制化部署下载最新版本的Apollo Quick Start包,传送门在SpringCloud微服务 Apollo分布式配置中心实现(三)实现的案例基..._apollo all-in-one

使用OpenCV检测相机与目标的角度和距离_opencv目标距离-程序员宅基地

文章浏览阅读2k次。使用OpenCV检测相机与目标的角度和距离 新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入#https://github.com/weiweiever/Angle-distance-detection你好! 这是你第一_opencv目标距离

随便推点

关键字——volatile_c语言 使用特征修饰符volatile的优缺点是什么-程序员宅基地

文章浏览阅读251次。volatile关键字是C语言本身具备的,在这里需要理解一下变量一个完整的变量定义分为以下部分:存储类型 特征修饰 数据类型 变量名如: static volatile int value;存储类型 : 决定变量的存储位置(决定)特征类型 : 决定变量的特征属性数据类型 : 决定变量的存储空间(既开辟几个字节)及数据范围(正负数值)变量名 : 决定变量的引用标识修饰的是局部变量,其存储的地方位于栈区。_c语言 使用特征修饰符volatile的优缺点是什么

智力题 (一)Nim游戏_nim谜题-程序员宅基地

文章浏览阅读969次。Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集..._nim谜题

文件下载(包含中文、超过2.5G大文件、IE下载乱码解决)_文件流下载 超过2g怎么下载-程序员宅基地

文章浏览阅读398次。public function downLoad() { // 时间调整,下载大文件 ini_set('max_execution_time','3600'); // 传的参数,最终目的为了找到要下载文件的路径 $id = input('file_path_name'); $name..._文件流下载 超过2g怎么下载

Flash地图控件AnyMap地图中的图例用法_anymap 教程-程序员宅基地

文章浏览阅读576次。在本教程中,我们将对Flash地图控件AnyMap中经常会用到的图例进行一个详细的说明,并展示几个图例的使用示例和如何显示图例中的阈值。》》》免费下载Flash地图控件AnyMap简单图例通常图例是用来显示地图上的区域名称,也有可能是一些地区的附加值,例如某些地区的销售额。在下面的示例中我们将创建一份附带有美国各州销售额情况的地图(地图中的彩色州是ACME公司商品的_anymap 教程

进程创建函数fork()、vfork() ,以及excel()函数_进程 fork exel-程序员宅基地

文章浏览阅读1.4w次。一、进程的创建步骤以及创建函数的介绍1、使用fork()或者vfork()函数创建新的进程2、条用exec函数族修改创建的进程。使用fork()创建出来的进程是当前进程的完全复制,然而我们创建进程是为了让新的进程去执行新的程序,因此,就需要用到exec函数族对创建出来的新进程进行修改,让他拥有和父进程不一样的东西,修改后就可以执行新的程序,当然,修改后的子进程包含了要执行程序的信息。在_进程 fork exel

android jni dll库,unity 调用C++库(android+jni+window dll平台实现)-程序员宅基地

文章浏览阅读372次。方便不知道如何再unity调用各平台动态库的同学参考,实测可用:window案例动态库名tracker_model.dll位置unity工程 Assets\Plugins目录下c# 关键调用代码using UnityEngine;using System.Collections;using System.Runtime.InteropServices;using System.Collection..._unity调用 dll能在安卓上运行吗