一、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
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工程目录结构对比图
pom模板中没有配置过依赖、可以通过http://mvnrepository.com/ 在线搜索坐标写法
配置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 快速完成依赖导入
可到https://mvnrepository.com/网站选择相应的版本写在pom.xml中即可
例如导入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;
}
}