一、Maven概述

1、Maven的概述

Maven是项目对象模型(Project object model)POM对象模型。每个maven工程 中都有一个pom.xml文件、定义工程所依赖的jar包、本工程的坐标、打包运行方式。

依赖管理系统(基础核心 )。maven通过坐标对项目工程所依赖的jar包统一规范管理

maven定义一套项目生命周期。清理、初始化、编译、测试、报告 、打包、部署、站点生成。

一组标准集合。maven工程有自己标准的工程目录结构、定义坐标有标准。

· maven 管理项目生命周期过程都是基于插件完成的,例如:开发中使用的tomcat插件。

2、Maven的作用

2.1、maven对第三方构件(jar包)进行统一管理

2.2、maven项目生征集周期管理:编译、测试、打包、部署、运行

2.3、maven对工程分模块构建、提高开发效率

3、Maven的仓库

仓库名称 作用
本地仓库 相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找。
中央仓库 就是远程仓库,仓库中jar由专业团队(maven团队)统一维护。中央仓库的地址:http://repo1.maven.org/maven2 开发中经常使用国内的远程仓库:阿里云 http://maven.aliyun.com/nexus/content/groups/public
远程仓库 在公司内部架设一台私服,其它公司架设一台仓库,对外公开。

 解压Maven后config里有个setting.xml

Maven --01.安装使用Maven --01.安装使用

4、Maven的坐标

Maven的一个核心的作用就是管理项目的依赖、引入我们所需的各种jar包等。为了能自动化解析任何一个

java构件、maven必须将这些jar包进行唯一标识、这是管理项目的依赖的基础、也是我们说的坐标、

坐标的定义元素如下:

groupId:定义当前Maven项目名称

artifactId:定义项目模块

version:定义当前项目的当前版本

例如:如果要引入junit的测试jar、只要在pom.xml配置文件中配置引入junit的坐标即可

<dependency>
    <!-- 组织机构名称,一般公司名 -->
    <groupId>junit</groupId>
	<!-- 项目名 -->
    <artifactId>junit</artifactId>
	<!-- 版本号 -->
    <version>4.12</version>
	<!-- 依赖范围 -->
    <scope>test</scope>

</dependency>

 

二、Maven的安装

1、下载安装

下载maven后解压即安装完毕

下载地址:http://maven.apache.org/

Maven --01.安装使用

2、配置环境变量

Maven --01.安装使用

Maven --01.安装使用

3、配置本地仓库

在Maven安装目录中conf/setting.xml文件、打开后、配置本地仓库存放的磁盘位置

 

Maven --01.安装使用

 settings.xml配置远程仓库-阿里云仓库

 

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

4、测试Maven安装成功

Maven --01.安装使用

 

三、IDEA创建Maven工程

1、配置工程路径

Maven --01.安装使用

Maven --01.安装使用

Maven --01.安装使用

 

-DarchetypeCatalog=internal

所有资源都先从本地仓库查找,没有再去网络。

 

2、创建Java工程

Maven --01.安装使用

Maven --01.安装使用

Maven --01.安装使用

Maven --01.安装使用

Maven --01.安装使用

注意: 初次搭建工程需要联网,更新maven工程组件。

Maven --01.安装使用

 

Maven --01.安装使用

Maven --01.安装使用

java工程目录结构

Maven --01.安装使用

编写hello World

Maven --01.安装使用

 

3、创建javaweb工程

创建javaweb工程与创建javase工程类似,但在选择Maven骨架时,选择maven-archetype-webapp即可:

Maven --01.安装使用

Maven --01.安装使用

Maven --01.安装使用

Maven --01.安装使用

所以,要手动创建一个java目录用于编写java代码:手动创建test/java、手动创建resources

Resources用于存储配置文件,类似以前的src下存放的配置文件信息。

如图:

Maven --01.安装使用

然后、

Maven --01.安装使用

Maven --01.安装使用

Maven --01.安装使用

Maven工程目录和原先的web工程目录结构对比图

Maven --01.安装使用

pom模板中没有配置过依赖、可以通过http://mvnrepository.com/ 在线搜索坐标写法

配置tomcat发布javaWeb工程

Maven --01.安装使用

Maven --01.安装使用

Maven --01.安装使用

浏览器效果

Maven --01.安装使用

 

四、Maven常用命令

1、Maven生命周期

Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。

Site Lifecycle 生成项目报告,发布站点。

再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。

当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

2、clean命令

清除编译产生的target文件夹内容,可以配合相应命令一起使用,如mvn clean package, mvn clean test

Maven --01.安装使用

3、package命令

mvn package,打包项目(target目录下生成)

package ,开发项目完成,基于该命令发布生成xxx.war

4、complie命令

该命令可以对src/main/java目录的下的代码进行编译

6、install命令

mvn install,打包后将其安装在本地仓库(多模块使用的,后续开发项目需要依赖当前项目时)

五、依赖管理

1、插件

Maven是一个核心引擎,提供了基本的项目处理能力和建设过程的管理,以及一系列的插件是用来执行实际建设任务。maven插件可以完成一些特定的功能。例如,集成jdk插件可以方便的修改项目的编译环境;集成tomcat插件后,无需安装tomcat服务器就可以运行tomcat进行项目的发布与测试。在pom.xml中通过plugin标签引入maven的功能插件。

JDK编译版本的插件

<!-- jdk版本插件 -->

<plugin>

    <groupId>org.apache.maven.plugins</groupId>

    <artifactId>maven-compiler-plugin</artifactId>

    <version>3.2</version>

    <configuration>

        <source>1.7</source>

        <target>1.7</target>

        <encoding>UTF-8</encoding>

        <showWarnings>true</showWarnings>

    </configuration>

</plugin>

2、导入依赖

导入依赖坐标,无需手动导入jar包就可以引入jar。在pom.xml中使用<dependency>标签引入依赖。

注意: 如果我们的本地仓库拥有了jar依赖,那么可以使用

alt+insert 快速完成依赖导入

可到https://mvnrepository.com/网站选择相应的版本写在pom.xml中即可

例如导入junit的依赖

Maven --01.安装使用

3、依赖范围

开发时,jar的作用范围,根据jar引入的作用不同,所以定义jar的作用范围是非常有必要的
测试包junit 开发包,仅仅是在测试时才会使用,当项目发布时,我们是不需要使用测试包的。
所以我们可以定义junit开发包的作用范围,仅仅是在开发测试时使用有效即可。

Maven --01.安装使用
 

maven命令小结:

compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖

provided 编译、和测试有效,A在编译和测试时需要B

 runtime:测试、运行有效

test:只是测试有效,只在单元测试类中用

六、案例maven工程三级联动

1、创建Maven工程 

如图:

Maven --01.安装使用

 

2、导入依赖

打开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">
  <!-- poom.xml版本  -->
  <modelVersion>4.0.0</modelVersion>
  <!-- 当前项目的组部织机构名 -->
  <groupId>com.maven02.demo02</groupId>

  <!-- 项目名 -->
  <artifactId>demo02</artifactId>

  <!-- 当前项目的版本号 -->
  <version>1.0-SNAPSHOT</version>

  <!-- 打包的方式、不写默认为jar包 -->
  <packaging>war</packaging>

  <!-- 起别名 -->
  <name>demo02 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->

  <!-- 当前项目的首面地址 -->
  <url>http://www.example.com</url>

  <!-- 属性 里面可以配置编码 、版本的统一管理 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <!-- 依赖管理 -->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
      <!-- 如果不写编译范围、默认就是compile -->
    </dependency>

    <!-- servlet依赖 -->
    <dependency>
      <!-- 坐标是如何定位只唯一依赖的、groupId+artifactId+version -->
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
    </dependency>

    <!-- fastJson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.47</version>
    </dependency>

    <!-- lang3 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.4</version>
    </dependency>

    <!-- c3p0的依赖 -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>
    <!-- jedis的依赖 -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>

    <!-- java连接mysql的驱动包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.26</version>
      <scope>runtime</scope>
    </dependency>

    <!-- jdbctemplate -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
      <scope>compile</scope>
    </dependency>

  </dependencies>

  <build>
    <!-- 最终名字 -->
    <finalName>demo02</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <!-- 仅仅锁定了插件的版本(一般用在父工程的pom.xml文件中)  -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.0.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.7.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.0</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>

    <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.5</version>
      <configuration>
        <forkMode>once</forkMode>
        <argLine>-Dfile.encoding=UTF-8</argLine><!-- 解决从json中读取测试数据时的中文乱码问题 -->
      </configuration>
    </plugin>
  </plugins>

  </build>
</project>

实体类:

package com.mvn.domain;

public class Pcd {
    private int id;
    private int pid;
    private String name;

    public Pcd() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3、配置文件

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
	    <property name="driverClass">com.mysql.jdbc.Driver</property>
	    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
	    <property name="user">root</property>
	    <property name="password">sswqzx</property>
  	</default-config>
</c3p0-config>

jedis.properties

host=localhost
port=6379
maxIdle=8
maxTotal=10

 

4、html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>省市区三级联动</h2>

省&nbsp;
<select onchange="changeCities(this.value)" id="province" name="province">
    <option value="">--请选择--</option>

</select>

市&nbsp;
<select id="city" name="city" onchange="changeZone(this.value)">
    <option value="">--请选择--</option>

</select>

区&nbsp;
<select name="area" id="area">
    <option value="">--请选择--</option>

</select>

</body>
<script src="js/jquery-3.3.1.js"></script>
<script>
    function changeZone(pid) {
        alert(pid);
        /**
         *      [
         *          {id:v,pid:v,name:v},
         *          {id:v,pid:v,name:v},
         *      ]
         */
        $.ajax({
            url:"/pcdServlet",
            data:{"pid":pid},
            dataType:"json",
            success:function (res) {

                $("#area").html("<option value=\"\">--请选择--</option>");

                for(var i=0;i<res.length;i++){
                    var $option = $("<option></option>");
                    //设置属性和文本值
                    $option.attr("value",res[i].id).html(res[i].name);
                    //追加
                    $("#area").append($option);
                }
            }
        });
    }

    function changeCities(pid) {
        alert(pid);
        /**
         *      [
         *          {id:v,pid:v,name:v},
         *          {id:v,pid:v,name:v},
         *      ]
         */
        $.ajax({
            url:"/pcdServlet",
            data:{"pid":pid},
            dataType:"json",
            success:function (res) {
                $("#area").html("<option value=\"\">--请选择--</option>");
                $("#city").html("<option value=\"\">--请选择--</option>");

                for(var i=0;i<res.length;i++){
                    var $option = $("<option></option>");
                    //设置属性和文本值
                    // $option.attr("value",res[i].id).html(res[i].name);
                    $option.html(res[i].name).attr("value",res[i].id);
                    //追加
                    $("#city").append($option);
                }
            }
        });
    }

    //ajax请求省的信息
    $.ajax({
        url:"/pcdServlet",
        data:{"pid":0},
        dataType:"json",
        success:function (res) {
            /**
             *      [
             *          {id:v,pid:v,name:v},
             *          {id:v,pid:v,name:v},
             *      ]
             */
            for(var i=0;i<res.length;i++){
                //创建option标签对象
                // jquery创建标签对象的方式   $(完整的标签);   $("<option ></option>")
                var $option = $("<option ></option>");

                //设置标签的属性  ,value   文本值
                $option.html(res[i].name).attr("value",res[i].id);
                //添加到省的下拉列表框下  parentNode.append(childNode)向 父标签的下面追加子标签。
                $("#province").append($option);

            }

        }
    });

</script>
</html>

 

5、servlet代码

package com.mvn.web;

import com.mvn.service.Impl.UserSerivceImpl;
import com.mvn.service.UserService;


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("/pcdServlet")
public class PcdServlet 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.setContentType("text/html;charset=utf-8");
        //获取ajax请求的参数
        int pid = Integer.parseInt(request.getParameter("pid"));
        //发送给service
        UserService userservice = new UserSerivceImpl();
        String str = userservice.findPcdByPid(pid);
        //将json字符串响应到前端ajax
        response.getWriter().print(str);

    }
}

 

6、service代码

package com.mvn.service.Impl;

import com.alibaba.fastjson.JSON;
import com.mvn.dao.Impl.UserDaoImpl;
import com.mvn.dao.UserDao;
import com.mvn.domain.Pcd;
import com.mvn.service.UserService;
import com.mvn.utils.JedisUtils;
import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.Jedis;

import java.util.List;

public class UserSerivceImpl implements UserService {
    //调用userDao层
    private static UserDao userDao = new UserDaoImpl();
    //调用jedisUtils工具
    private   Jedis jedis = JedisUtils.getJedis();
    @Override
    public String findPcdByPid(int pid) {
        //从redis数据库中拿pcd+pid数据
        String json = jedis.get("pcd"+pid);
        //判断redis数据库中是否有pcd+pid这个键的数据、如果没有就调用dao层从mysql数据库中取值
        if (StringUtils.isEmpty(json)){
            List<Pcd> pcdList = userDao.findPcdByPid(pid);
            //将mysql中查询的值转成JSON字符串
            json = JSON.toJSONString(pcdList);
            //将JSON字符串写入到redis数据库中
            jedis.set("pcd"+pid,json);

        }
        jedis.close();
        return json;
    }
}

 

7、dao层代码

package com.mvn.dao.Impl;

import com.mvn.dao.UserDao;
import com.mvn.domain.Pcd;
import com.mvn.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;


public class UserDaoImpl implements UserDao {
    private static  JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
    @Override
    public List<Pcd> findPcdByPid(int pid) {
        String sql = "select * from pcd where pid = ?";
        List<Pcd> pcdList = jdbcTemplate.query(sql,new BeanPropertyRowMapper<Pcd>(Pcd.class),pid);
        return pcdList;
    }
}

 

 

相关文章: