【Maven】
☞Maven入门教程-Maven项目实战☜
六、Maven项目中pom配置文件的使用
1. pom文件的作用
在maven项目中,通过maven来获取和管理第三方的资源。每个maven项目默认是有一个pom文件的。该文件是用来告诉maven当前项目中需要使用的资源的,该文件会被maven自动加载识别。我们需要在pom配置文件中声明需要使用的资源的坐标即可。
注意:
当pom文件被修改的时候,maven会自动的重新加载pom文件,并根据文件的最新内容加载最新的资源。可以理解为maven给pom文件增加了一个onchange的事件。
2. pom文件的配置内容
2.1 modelverson
声明模块的版本
2.2 当前项目的资源坐标
给maven查看,并便于maven查找到该项目给其他项目使用
2.3 配置第三方的资源坐标
让maven根据坐标从本地仓库中引入第三方的资源到项目中使用,如果
本地仓库中没有,则会自动从云仓库中下载。
注意1:
我们可以在https://mvnrepository.com/下来搜索需要的资源坐标,然后当我们将资源坐标变更后,需要点击import changes让maven重新加载pom文件,根据最新的资源坐标获取资源到项目中
注意2:
maven将资源引入到项目中后,在idea的项目视图中是看不到第三方资源的,需要点击idea右侧栏上的maven,进入maven的资源管理视图中,查看当前项目中引入的第三方的资源。
2.4 properties自定义资源版本号管理
一个第三方资源会有很多的版本,比如mybatis,spring等如果我们需要引入的第三方资源过多,当我们对某一个资源的版本号进行修改时,不好修改。可以使用properties标签将资源的版本号单独 的声明在外部,便于我们的修改。
2.5 引入第三方的插件资源
3. jar类型和war类型配置示例
3.1 jar类型的配置示例
<?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>com.bjsxt</groupId>
<artifactId>01_maven_jar</artifactId>
<version>1.0-SNAPSHOT</version>
<!--自定义资源版本号管理-->
<properties>
<junit.version>4.13</junit.version><!--版本号的标签名可以自定义声明,但是建议格式为 资源.version-->
<mysql.jdbc.version>5.1.31</mysql.jdbc.version>
</properties>
<!--引入第三方资源-->
<dependencies>
<!--一个dependency子标签表示一个要引入的资源,内容为要引入的资源的坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!--jdbc的资源坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.jdbc.version}</version>
</dependency>
</dependencies>
</project>
3.2 war类型的配置示例
问题:
在以前的JAVAEE项目中,IDE工具会自动的将JDK以及tomcat的资源依赖到项目中,我们在web-inf下的lib文件夹下声明的是自定义的第三方资源,而maven中的war类型项目中默认是没有给我们引入任何第三方资源的,造成我们在war类型项目中无法直接创建jsp和声明Servlet完成最基本的web开发。
解决:
在war类型的项目的pom文件中配置最基础的web开发相关的第三方的资源坐标:
- servlet的资源坐标
- jsp的资源坐标
- jstl的资源坐标
配置示例:
<?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>com.bjsxt</groupId>
<artifactId>02_maven_war</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--配置版本号-->
<properties>
<servlet-version>3.1.0</servlet-version>
<jsp-version>2.2</jsp-version>
<jstl-version>1.2</jstl-version>
</properties>
<!--配置资源坐标-->
<dependencies>
<!--servlet的资源坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-version}</version>
<scope>provided</scope>
</dependency>
<!--jsp的资源坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-version}</version>
<scope>provided</scope>
</dependency>
<!--jstl的资源坐标-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl-version}</version>
</dependency>
</dependencies>
</project>
七、Maven的war类型项目的本地启动运行
1. 问题
以前我们使用idea工具直接创建javaEE项目,而idea在帮我们创建javaEE项目的时候就已经指定了项目运行所需要的tomcat,我们直接启动tomcat访问项目即可。但是使用maven创建的war类型的项目,在创建的时候并没有指明项目运行所需要的tomcat,那么maven的war类型项目,在功能开发完成后如何启动运行呢?
2. 解决
maven的项目中涉及到的资源需要maven来进行管理。war类型的项目在开发完成后,需要告诉maven去调用一个tomcat来运行我们当前的war项目,而maven的资源都是从本地仓库中加载或者从云仓库中下载,那么能不能我们自己在war类型项目中告诉maven去下载一个tomcat,来运行我们的war项目呢?答案是可以的。
3. 实现
3.1 在war类型项目的pom文件中配置tomcat插件的资源坐标,并配置tomcat的端口号以及项目的访问路径
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>6060</port><!--配置tomcat启动的端口号-->
<path>/my</path><!--配置项目的访问名称-->
</configuration>
</plugin>
</plugins>
</build>
3.2 通过maven启动当前war项目的tomcat容器,运行项目
八、使用Maven完成对用户信息的增删改查功能
1. 功能需求
用户访问用户信息管理页面,在管理页面中显示所有的用户信息,并可以对用户信息进行增加,删除,修改操作。
2. 功能分析
- 用户管理页面创建
- 用户信息的查询
- 用户信息的删除
- 用户信息的增加
- 用户信息的修改
3. 功能实现
3.1 数据库设计
用户信息表:
- 用户Id
- 用户名
- 用户性别
- 手机号
##创建用户信息表
create table t_user(
uid int(10) not null auto_increment,
uname varchar(100) not null,
sex char(4) not null,
phone char(11) not null,
primary key(uid)
);
##添加测试数据
insert into t_user values(default,'张三','男','15566332211');
insert into t_user values(default,'李四','男','15566332212');
3.2 项目开发环境的搭建
3.2.1 使用Maven创建war项目
3.2.2 配置项目的java和resources目录
3.2.3 配置项目的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjsxt</groupId>
<artifactId>04_maven_user</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--配置版本号-->
<properties>
<servlet-version>3.1.0</servlet-version>
<jsp-version>2.2</jsp-version>
<jstl-version>1.2</jstl-version>
<mybatis.version>3.5.2</mybatis.version>
</properties>
<!--配置资源坐标-->
<dependencies>
<!--配置Mybatis的依赖-->
<dependency>
<!--资源坐标-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--配置JDBC的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.23</version>
</dependency>
<!--servlet的资源坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-version}</version>
<scope>provided</scope>
</dependency>
<!--jsp的资源坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-version}</version>
<scope>provided</scope>
</dependency>
<!--jstl的资源坐标-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl-version}</version>
</dependency>
<!--配置Gson的依赖-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
</dependencies>
<!--配置Tomcat插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port><!--配置tomcat启动的端口号-->
<path>/project</path><!--配置项目的访问名称-->
</configuration>
</plugin>
</plugins>
</build>
</project>
3.3.4 在java源码目录下创建MVC的包结构
3.2.5 在pojo包中声明User实体类
package com.bjsxt.pojo;
import java.util.Objects;
public class User {
private Integer uid;
private String uname;
private String sex;
private String phone;
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", uname='" + uname + ''' +
", sex='" + sex + ''' +
", phone='" + phone + ''' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(uid, user.uid) &&
Objects.equals(uname, user.uname) &&
Objects.equals(sex, user.sex) &&
Objects.equals(phone, user.phone);
}
@Override
public int hashCode() {
return Objects.hash(uid, uname, sex, phone);
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public User() {
}
public User(Integer uid, String uname, String sex, String phone) {
this.uid = uid;
this.uname = uname;
this.sex = sex;
this.phone = phone;
}
}
3.2.6 在mapper层将User表的增删该查功能实现
package com.bjsxt.mapper;
import com.bjsxt.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
//查询所有的用户信息
@Select("select * from t_user")
List<User> selAllUserInfoMapper();
//根据ID删除用户信息
@Delete("delete from t_user where uid=#{uid}")
int delUserInfoMapperById(@Param("uid") int uid);
//根据ID修改用户信息
@Update("update t_user set uname=#{uname},sex=#{sex},phone=#{phone} where uid=#{uid}")
int upUserInfoById(User user);
//增加用户信息
@Insert("insert into t_user values(default,#{uname},#{sex},#{phone})")
int insUserInfo(User user);
}
3.2.7 在resources下创建并配置mybatis.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置别名-->
<typeAliases>
<package name="com.bjsxt.pojo"/>
</typeAliases>
<!--配置数据环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/maven"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!--配置mapper扫描路径-->
<mappers>
<package name="com.bjsxt.mapper"/>
</mappers>
</configuration>
3.3 创建用户管理页面
要求:
在页面加载成功后就要显示所有的用户信息
实现:
使用ajax技术来实现,在页面加载成功后,发起ajax请求,请求所有的用户信息。
代码示例:
<%--
Created by IntelliJ IDEA.
User: zyp
Date: 2020/5/6
Time: 17:14
To change this template use File | Settings | File Templates.
--%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<base href="<%=basePath %>"/>
<title>Title</title>
<%--引入jquery文件--%>
<script type="text/javascript" src="js/j.js"></script>
<%--声明js代码域--%>
<script type="text/javascript">
/*声明页面加载事件*/
$(function () {
//发起ajax请求,请求所有的用户信息
$.get("userServlet",function (data) {//"[{uid:1,uname:'zhangsan',sex:'男',phone:'15533662233'},{},{}]"
//使用Eval函数将数据转换为js对象
eval("var us="+data);
//获取tb对象
var tb=$("#tb");
//遍历填充
for(var i=0;i<us.length;i++){
tb.append(" <tr>n" +
" <td>"+us[i].uid+"</td>n" +
" <td>"+us[i].uname+"</td>n" +
" <td>"+us[i].sex+"</td>n" +
" <td>"+us[i].phone+"</td>n" +
" <td><a href=''>删除</a> <a href=''>修改</a></td>n" +
" </tr>")
}
})
})
</script>
</head>
<body>
<h3>用户管理</h3>
<hr>
<table border="1px" cellpadding="10px" cellspacing="0px">
<%--声明表头--%>
<thead>
<tr>
<td>用户编号</td>
<td>用户名</td>
<td>性别</td>
<td>手机号</td>
<td>操作</td>
</tr>
</thead>
<%--声明主体内容--%>
<tbody id="tb"></tbody>
</table>
</body>
</html>
3.4.查询所有用户信息后台功能实现
UserServlet的创建和实现
package com.bjsxt.controller;
import com.bjsxt.pojo.User;
import com.bjsxt.service.UserService;
import com.bjsxt.service.impl.UserServiceImpl;
import com.google.gson.Gson;
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;
import java.util.List;
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
//声明Service方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("utf-8");
//获取请求信息
//处理请求
//创建业务层对象
UserService us=new UserServiceImpl();
//调用业务层对象
List<User> list = us.selAllUserInfoService();
//响应结果
//直接响应
resp.getWriter().write(new Gson().toJson(list));
}
}
UserService接口的创建和实现
package com.bjsxt.service;
import com.bjsxt.pojo.User;
import java.io.IOException;
import java.util.List;
public interface UserService {
//获取所有的用户信息
List<User> selAllUserInfoService() throws IOException;
}
UserServiceImpl的创建和实现
package com.bjsxt.service.impl;
import com.bjsxt.mapper.UserMapper;
import com.bjsxt.pojo.User;
import com.bjsxt.service.UserService;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserServiceImpl implements UserService {
@Override
public List<User> selAllUserInfoService() throws IOException {
//获取SqlSession对象
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
SqlSession session=factory.openSession();
//获取Mapper对象
UserMapper mapper = session.getMapper(UserMapper.class);
//完成查询
return mapper.selAllUserInfoMapper();
}
}
3.5 删除用户信息功能实现
删除功能需求:
用户点击行的删除按钮,发起删除请求,将当前的行数据删除。并在当前页面中显示删除成功提示语,并重新加载用户资源。
功能实现:
① 页面功能实现:
因为点击删除后,要在当前页面中显示删除结果的提示语。所以采用ajax 技术实现。
- 请求地址:/userDelServlet
- 请求数据:uid
- 响应数据:“true”|“false”
② 后台功能实现:
根据用户ID删除用户信息
3.6 更新用户信息功能实现
更新功能需求:
用户点击更新按钮,弹出更新页面,并在页面中显示要更新的用户信息。修改完成后,点击更新按钮,在当前页面中提示用户更新结果。并重新加载表格中的内容。
功能实现:
① 更新子窗口以及数据的回显
1) 点击更新按钮,弹出更新的子窗口
技能:window.open
2) 在更新窗口中回显示要更新的数据
② 更新功能实现
3.7 更新用户信息功能实现
增加的功能需求:
用户在页面中点击增加按钮,弹出用户信息增加窗口。并在窗口中输入用户信 息后点击增加完成用户信息的增加。
功能实现:
- 创建增加增加并完成增加窗口的效果
- 完成用户信息的增加
九、Maven项目java目录下的配置文件不会被编译到项目中
1. 问题
maven的项目,是由maven来进行编译的。maven会将项目编译为以前的javaSE和javaEE的结构来运行。但是maven在编译项目的时候,不会讲java目录下的配置文件编译到项目中。mapper包中除了java代码以外,还有mapper.xml文件,maven是不会将mapper.xml文件被编译到项目中的,造成项目运行失败,怎么办呢?
2. 解决
我们需要告诉maven在编译项目中java代码时,在java目录下除了java代码,还有配置文件,需要将配置文件也编译到项目中使用。我们需要在项目的pom.xml文件中配置相关标签即可
3. 实现
在项目的pom.xml文件的build标签下使用resources子标签来告诉maven需要将源码中的xml文件也进行编译:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>7070</port><!--配置tomcat启动的端口号-->
<path>/ty</path><!--配置项目的访问名称-->
</configuration>
</plugin>
</plugins>
<!--告诉maven将项目源码中的xml文件也进行编译,并放到编译目录中-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
十、使用maven打包自己的项目到本地仓库中
1. 问题
假如我们使用maven在本地同时开发两个项目,分别为项目A和项目B,项目A已经开发完成了。而我们想在项目B中使用项目A的功能,怎么办?
2. 解决
项目B是由Maven进行管理的,项目B中的资源需要通过Maven来获取,而Maven会从本地仓库中加载对应的资源给项目B使用。而本地仓库中是没有项目A的资源。那么能不能让maven讲项目A打包并上传到其自己的本地仓库中一份儿,这样其他的项目就可以通过项目A的资源坐标来获取项目A的资源来 使用了。答案是可以的。
3. 实现
注意:
- jar类型的项目打成jar包放到maven的本地仓库中
- war类型的项目打成war包放到maven的本地仓库中