1. 程式人生 > >Java EE Web部分--08.Maven

Java EE Web部分--08.Maven

一、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包存在本地倉庫(在程式設計師的電腦上)。第二次不需要從遠端倉庫去下載。先從本地倉庫找,如果找不到才會去遠端倉庫找。
遠端倉庫 在公司內部架設一臺私服,其它公司架設一臺倉庫,對外公開。

 解壓Maven後config裡有個setting.xml

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後解壓即安裝完畢

2、配置環境變數

3、配置本地倉庫

在Maven安裝目錄中conf/setting.xml檔案、開啟後、配置本地倉庫存放的磁碟位置

 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安裝成功

三、IDEA建立Maven工程

1、配置工程路徑

-DarchetypeCatalog=internal

所有資源都先從本地倉庫查詢,沒有再去網路。

2、建立Java工程

注意: 初次搭建工程需要聯網,更新maven工程元件。

java工程目錄結構

編寫hello World

3、建立javaweb工程

建立javaweb工程與建立javase工程類似,但在選擇Maven骨架時,選擇maven-archetype-webapp即可:

所以,要手動建立一個java目錄用於編寫java程式碼:手動建立test/java、手動建立resources

Resources用於儲存配置檔案,類似以前的src下存放的配置檔案資訊。

如圖:

然後、

Maven工程目錄和原先的web工程目錄結構對比圖

配置tomcat釋出javaWeb工程

瀏覽器效果

四、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

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 快速完成依賴匯入

例如匯入junit的依賴

3、依賴範圍

開發時,jar的作用範圍,根據jar引入的作用不同,所以定義jar的作用範圍是非常有必要的
測試包junit 開發包,僅僅是在測試時才會使用,當專案釋出時,我們是不需要使用測試包的。
所以我們可以定義junit開發包的作用範圍,僅僅是在開發測試時使用有效即可。

 

maven命令小結:

compile 編譯、測試、執行,A在編譯時依賴B,並且在測試和執行時也依賴

provided 編譯、和測試有效,A在編譯和測試時需要B

 runtime:測試、執行有效

test:只是測試有效,只在單元測試類中用

六、案例maven工程三級聯動

1、建立Maven工程 

如圖:

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;
    }
}