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>
省
<select onchange="changeCities(this.value)" id="province" name="province">
<option value="">--請選擇--</option>
</select>
市
<select id="city" name="city" onchange="changeZone(this.value)">
<option value="">--請選擇--</option>
</select>
區
<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;
}
}