父控制器的存在就是为了去除重复,一个项目存在多个模块,可能由多个人开发,比如abc3个模块,3个模块都是基于spring的那么3个开发都需要引入spring的核心jar包,这样就引入了3份,但是使用父子工程,则只需要在父工程中引入了,则子工程自动继承。
按照以往的创建项目方式,一个maven项目就是一个大工程,一开始还能进行简单的测试编译,但是随着项目的不断变大和复杂化,后期再做改动则可能牵一发而动全身。但是使用父子工程,每个模块都是独立的,他们通过父控制器聚合在一起,这样当你要改动一个模块的时候你改动的也只是这一个模块而已,并不会影响其他的模块。
父子工程说白了就是利用Maven的继承,依赖传递性来为我们省略一些重复的配置,通常配置在父模块中,为子模块提供使用,这样可以做到一处声明,处处使用。
是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定spring的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义。
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行。
项目需求:使用maven父子工程完成登录并跳转到首页列表
提示:父工程只需要pom.xml文件,要将src目录删除。
#### 3.1.2、在父工程中以module的形式创建domain层子模块
因为domain层不需要页面所以创建控制台项目即可
注意:要在父工程上右键创建模块
#### 3.1.3、在父工程中以module的形式创建dao层子模块
因为dao层不需要页面所以创建控制台项目即可
注意:要在父工程上右键创建模块
#### 3.1.4、在父工程中以module形式创建service层子模块
因为service层不需要页面所以创建控制台项目即可
注意:要在父工程上右键创建模块
#### 3.1.5、在父工程中以module形式建web层子模块
注意:web层中包含controller和页面,所以web层要创建maven web工程
创建成功后,父工程的pom.xml中会自动引用所有的子模块
### 3.2、建立继承和依赖关系
在开发中,service要调用dao中的数据,而web又要调用service的数据,且domain又要被其他三层所调用,他们之间的调用关系如下:web->service->dao->domain
但是现在四个子工程相互是没有任何关系的,没有关系就不能调用。我们应该将他们之间关联起来
提示:maven项目之间的引用是通过本地仓库中的jar包进行引用,所以引用前要先将对应的模块打成jar包到本地仓库
jar
#### 3.2.2、在dao子模块的pom中添加domain子模块的引用关系
#### 3.2.3、在service子模块的pom中添加dao子模块的引用关系
#### 3.2.4、在web子模块的pom中添加service子模块的引用关系
注意:web子模块的打包方式为war包
注意:在maven父子工程中父子工程不用直接建立关系,继承关系是先天的不用建立依赖关系。 平级之间的直接引用叫依赖,依赖不是先天的,需求要后天建立
将项目所需的公共坐标添加到父工程的pom文件中
4.0.0 cn.woniu maven-parent 1.0-SNAPSHOT maven-domain maven-dao maven-service maven-web pom UTF-8 1.8 1.8 5.3.6 junit junit 4.12 test org.springframework spring-context ${spring.version} org.springframework spring-aspects ${spring.version} org.springframework spring-test ${spring.version} cglib cglib 3.3.0 org.springframework spring-tx ${spring.version} org.projectlombok lombok 1.18.20 ${basedir}/src/main/java **/*.xml **/*.properties ${basedir}/src/main/resources **/*.xml **/*.properties
创建实体类,注意实体类要实现序列化接口Serializable
package cn.woniu.domain;import java.io.Serializable;
import java.math.BigDecimal;/**
* 用户实体类
*/
public class User implements Serializable {private int id;private String userName;private String passwd;//省略Getter和Setter
实体类编写完成后,由于需要被 其他模块引用所以要将实体类发布到本地仓库中
打包完成后本地仓库的cn/woniu目录下就会生成一个maven-domain.jar
### 3.5、编写dao子模块代码
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test_mybatis?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=Aa123123.