参考:http://www.cnblogs.com/whgk/p/7121336.html
项目代码下载地址:https://download.csdn.net/download/cyn_653620/10866776
一、maven父工程与子模块的拆分与聚合原理
问题描述:将ssh工程拆分为多个模块开发
1.1、拆分原理
创建一个maven project(pom),然后在创建四个子模块(maven moudule),其中四个子模块,分别为 domain、dao、service、web,也就是将四层的内容分别独立为一个项目,进一步将耦合性降低,其中如何将他们连接起来了,看下图。
为什么需要创建parent父工程来管理其下四个子模块呢?并让其子模块继承他呢?
继承是为了消除重复,如果将domain、dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定spring的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义
将四层都独立分开来了,web层如何调用service层代码?service层又如何调用dao层的代码呢?
这个在没有maven之前是不可以这样做的,但是有了maven一切都不一样了,web层调用service层的代码其实很简单,因为service是一个完整的项目,那么我们在web层这个项目中想要使用别得项目中的代码,只需要通过maven的pom.xml文件编写对应的坐标,将其jar包加入进来即可达到目的,因此,看图中,ssh-web依赖ssh-service,ssh-service依赖ssh-dao,其中的原理就是我说的这样,所以才能将这四层分开成独立的项目,并且进一步抽取其公有依赖的jar包,统一交由父工程来管理,这就maven带来的效果。
1.2、聚合原理
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:domain、dao、service、web四个工程最终会打一个独立的war运行
二、案例实现
问题描述:使用maven将ssh项目进行分模块,并且实现从web到domain层的数据实体的CRUD进行测试。
2.1、创建maven-parent父模块
点击next
点击next
创建好之后的父工程如图
从它的目录结构可以看出,父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用jar的坐标了。
在父工程的pom.xml中抽取一些重复的配置的,比如:锁定jar包的版本、设置编译版本等,一般这种都不需要我们自己临时配置,网上或者公司都有已经写好了的,每次使用就直接丢过来即可。
4.0.0
com.cyn
crm_ssh_parent
0.0.1-SNAPSHOT
pom
使用maven进行管理的基于ssh的客户关系管理系统
4.2.4.RELEASE
2.3.24
5.0.7.Final
1.6.6
1.2.12
1.2.3
3.0.1
0.9.1.2
5.1.6
org.springframework
spring-context
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework
spring-web
${spring.version}
org.hibernate
hibernate-core
${hibernate.version}
org.apache.struts
struts2-core
${struts2.version}
org.apache.struts
struts2-spring-plugin
${struts2.version}
org.apache.httpcomponents
httpclient
4.4
com.alibaba
fastjson
1.1.37
commons-beanutils
commons-beanutils
1.9.1
commons-fileupload
commons-fileupload
1.3.1
jstl
jstl
1.2
org.aspectj
aspectjweaver
1.6.8
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-core
${spring.version}
org.apache.struts
struts2-core
${struts2.version}
javassist
javassist
org.apache.struts
struts2-spring-plugin
${struts2.version}
org.apache.struts
struts2-json-plugin
${struts2.version}
org.apache.struts
struts2-convention-plugin
${struts2.version}
org.hibernate
hibernate-core
${hibernate.version}
org.hibernate
hibernate-entitymanager
${hibernate.version}
org.hibernate
hibernate-validator
5.2.1.Final
c3p0
c3p0
${c3p0.version}
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
commons-lang
commons-lang
2.6
org.codehaus.xfire
xfire-core
1.2.6
dom4j
dom4j
1.6
junit
junit
3.8.1
test
mysql
mysql-connector-java
${mysql.version}
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
net.sf.ehcache
ehcache-core
2.6.6
crm_ssh_parent
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.7
UTF-8
true
2.2、创建maven-dao子模块
点next进入如下图
点击next,如下图
点击finish,完成,查看父工程中的pom.xml文件
最后多出一段这个
crm_ssh_dao
查看crm_ssh_dao中的pom.xml文件,会发现多了一个 parent结点,并且内部所包含的结点,其实就是父工程的坐标
crm_ssh_parent
com.cyn
0.0.1-SNAPSHOT
..
1.查看crm_ssh_dao的目录结构
因为是在dao层,和数据库打交道,那么就在这个项目中,需要配置数据源,至于实体,另开一个domain专门管理实体,和hibernate的实体和数据库的映射关系。
2.applicationContext-dao.xml文件配置内容
3.db.properties配置内容
jdbc.user=root
jdbc.password=199420
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
jdbc.initPoolSize=5
jdbc.maxPoolSize=10
2.3、创建maven-domain子模块
方法同crm_ssh_dao模块创建方法一样,模块名称为crm_ssh_domain。
查看crm_ssh_domain的详细目录结构
2.hibernate.cfg.xml文件配置内容
org.hibernate.dialect.MySQLDialect
true
true
update
2.4、创建ssh_service子模块
方法同ssh_dao模块创建方法一样,模块名称为crm_ssh_service。
看crm_ssh_service和crm_ssh_parent的pom.xml文件,会出现和crm_ssh_dao创建时一样的情况,crm_ssh_service多出一个parents结点,crm_ssh_parent多个一个module结点
1.查看crm_ssh_service的详细目录结构
2.applicationContext-service.xml文件配置内容
2.5、创建ssh_web子模块
方法同maven-dao模块创建方法,模块名称为crm_ssh_web,注意:打包方式为war,而不再是jar包了,因为该层需要放到tomcat中去。与浏览器交互,就是web项目了,所以打成war包
和前面一样,crm_ssh_parent的pom.xml中增加一个module结点,而crm_ssh_web的pom.xml中增加一个parent结点
这个也很简单,就是跟写普通的struts2是一样的,只不过是和spring的结合,有什么对象,都通过spring来给予,并且这里多做一个事情,就是将之前的applicationContext配置文件进行结合,看下图
applicationContext-web.xml文件配置内容
struts.xml配置文件内容(目前版本为注解动态匹配)
web.xml文件配置内容(配置struts2的过滤器和spring的监听器)
crm_ssh_web
login.jsp
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
前端界面文件包含login.jsp和hello.jsp
1)login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
登录页面
2)hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="utf-8"%>
Hello,SSH
Hello,${user.username}
2.6、总结与启动
父工程和子模块都写完之后,目录结构如图: