一、Maven依赖管理
Maven中的pom.xml文件指的是项目对象模型,把项目当作对象来管理。
所谓依赖管理就是对项目所有依赖的jar包进行规范化管理。
(1)grouoId:一般用包名来表示,表示项目是由那个组织开发的。
(2)artifactId:项目的名称
(3)version:jar的版本
maven的优点:
(1)依赖管理:通过包名,项目名以及版本号去Maven仓库找相应的jar包。
(2)一步构建:一个命令就可以完成项目的构建。
(3)maven跨平台,可以在window、linux上使用
(4)maven遵循规范开发有利于提高团队的开发效率,降低项目的维护成本。
1.maven下载及包结构
(1)下载地址
http://maven.apache.org/
(2)包结构
2.maven仓库
(1)本地仓库
(2)远程仓库
(3)中央仓库
(4)本地仓库的配置
去F:\Maven\maven-3.3.9\conf下面的setttings.xml中,使用标签
< localRepository>url< /localRepository>
进行配置
maven找jar包先从本地仓库找,本地仓库没有就去远程仓库找,如果远程仓库没有就会去中央仓库去下载。最终的使用都是使用的本地仓库的jar包。
3.maven的目录结构
4.maven常用命令
(1)mvn compile
将src/main/java下的文件编译为class文件输出到target目录下。
(2)mvn test
test是maven工厂的测试命令,执行src/test/java下的单元测试类
(3)mvn clean
清理命令,执行clean会删除target目录的内容
(4)mvn package
打包命令,对java工厂打包成jar包,对web工程打包war包
(5)mvn install
安装命令,执行install将maven打包成jar或war包发布到本地仓库
5.maven的生命周期
6.maven的概念模型
maven包含了一个项目对象模型(Project Object Model)、一组标准集合、一个项目生命周期(Project Lifecycle)、一个依赖管理系统(Dependency Management System)、和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
maven概念模型图:
具体解释
7.maven工程创建
(1)相关工程
jar::java工程
war:web工程
pom:聚合工程
(2)创建步骤
Maven Project
注意项目在初次创建web工程时会报错,那是因为缺少WEB-INF和web.xml,去src/main/webApp下创建就好了。
配置Jdk版本
pom.xml
<!-- 配置jdk版本 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
update project,项目不正常报错,都update一下就可以了。
配置tomcat
<!-- 配置tomcat -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<path>/</path>
<port>8080</port>
</configuration>
</plugin>
8.maven添加依赖管理的方式
(1)网址搜索
搜索相应的包
(2)pom.xml的dependence
搜索,前提是本地仓库有
9.依赖的作用范围
依赖的范围由强到弱的顺序是:compile>provided>runtime>test
<scope>provided</scope>
10.常用的maven命令
11.pom基本配置
二、Maven工程
1.工程拆分
将项目的模块拆分成不同的工程,在用到的地方引入就好了。类似于把不同的工程搭在一起,如果一个工程写的通用的话,可以用到很多地方。比如:dao
2.工程聚合
通过一个父工程把各个子工程聚合在一起形成一个完整的项目。
3.工程间继承
由于工程之间也有继承关系,所以只需要在父工程中引入所有依赖就可以了,子工程继承父工程就可以了。
4.举个例子
1.创建工程
以crm系统为例,里面由dao\service\web三个模块。
(1)创建父工程crm:new一个maven工程,选择pom
(2)创建子工程crm_dao:new 一个maven模型,选择jar
(3)创建子工程crm_service:new 一个maven模型,选择jar
(4)创建子工程crm_web:new 一个maven模型,选择war
子工程中的pom.xml
父工程中的pom.xml文件
2.添加模块之间的依赖
(1)service层依赖dao层
ctrl+s保存
这样在service中就可以包含dao层中的类了,web层依赖service层也一样的操作。
注意:依赖具有传递性,web层依赖service层的时候,也会加入dao是应为service层依赖了dao层。
3.使用execution排除jar包冲突
在引入jar包依赖的时候会可能产生jar包冲突,这时可以在pom视图下进行操作
4.依赖传递的原则
(1)第一声明者优先:谁在pom文件中声明在上面,就用谁。
(2)路径近者优先,在jar包中层级越低就越先被引用,类似于目录层级。
4.使用版本锁定来解决jar包冲突
5.定义版本常量
好处:在升级的时候直接换常量的版本号就可以了,不用每个都改。
6.maven的依赖管理
三、小结
1.PO持久化对象
2.分模块开发ssh
dao
在dao层编写实体映射的xml(放的地方要和实体的包名一样,在src/main/resources下),以及spring的配置文件(在src/main/resources下),还有hibernate.cfg.xml(在src/main/resources下,最外层)。
(1)src/main/resources/pers/zx/ssh/domian/Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="cn.itcast.crm.domain.Customer" table="customer" >
<id name="custId" type="java.lang.Long">
<column name="cust_id" />
<!-- 6种生成策略 : identity,native,sequence,uuid,increment, assigned -->
</id>
<property name="custName" type="string">
<column name="cust_name" length="32" not-null="true"></column>
</property>
<property name="custUserId" column="cust_user_id"></property>
<property name="custCreateId" column="cust_create_id"></property>
<property name="custIndustry" column="cust_industry"></property>
<property name="custLevel" column="cust_level"></property>
<property name="custLinkman" type="string">
<column name="cust_linkman" length="64"></column>
</property>
<property name="custPhone" type="string">
<column name="cust_phone" length="64"></column>
</property>
<property name="custMobile" type="string">
<column name="cust_mobile" length="16"></column>
</property>
</class>
</hibernate-mapping>
(2)src/main/resources/spring/applicationContext-dao.xml,编写数据源,和sessionFactory并向dao中注入sessionFactory
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/crm?characterEncoding=utf-8"></property>
<property name="user" value="root"></property>
<property name="password" value="root"/>
</bean>
<!-- sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
<property name="mappingLocations" value="classpath:pers/zx/ssh/domain/*.hbm.xml"></property>
</bean>
<!-- 数据访问层 -->
<bean id="customerDao" class="cn.itcast.crm.dao.impl.CustomerDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>
(3)src/main/resources/hibernate.cfg.xml,其中是hibernate的一些配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
<session-factory>
<!-- 方言 -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">false</property>
<property name="hbm2ddl.auto">none</property>
<!-- 懒加载 -->
<property name="hibernate.enable_lazy_load_no_trans">true</property>
<!-- 实体类的验证 -->
<property name="javax.persistence.validation.mode">none</property>
</session-factory>
</hibernate-configuration>
service
需要编写spring的配置文件applicationContext.xml,其中编写事务,注入dao
(1)src/main/resources/spring/applicationContext-services.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd ">
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 通知 -->
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<aop:pointcut expression="execution(* pers.zx.ssh.service.impl.*.*(..))" id="myPointCut"/>
<aop:advisor advice-ref="advice" pointcut-ref="myPointCut"/>
</aop:config>
<!-- 业务 -->
<bean id="customerService" class="cn.itcast.crm.service.impl.CustomerService">
<property name="customerDao" ref="customerDao"></property>
</bean>
<!-- 仅供测试用 -->
<!-- <import resource="classpath:spring/applicationContext-dao.xml"/> -->
</beans>
web
编写web层的spring文件,以及struts.xml配置action,还有web.xml配置过滤器。
(1)struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts
PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd" >
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="custsomer_*" class="customerAction" method="{1}">
<result name="list">/list.jsp</result>
</action>
</package>
</struts>
(2)applicationContext-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 整合struts-->
<bean id="customerAction" class="pers.zx.ssh.web.action.CustomerAction" scope="prototype">
<property name="customerService" ref="customerService"></property>
</bean>
</beans>
(3)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>crm07_web</display-name>
<!-- 加载spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- openSessionInView -->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- struts -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
小结
三个spring文件的注入是通用的在service注入了的对象,可以直接在web层使用id名进行注入。
三个spring的分工:
dao:注入数据源,映射文件和hibernate.cfg.xml
映射文件:实体映射
hibernate.cfg.xml:hibernate的一些配置,包括方言等。不加入映射是因为在spring中加入。
数据源:数据库所需的连接
其他的就是sessionFactory用来管理实体类和注入配置文件
在dao中注入sessionFactory
dao的实现类要继承相应的模板类
service:编写事务管理,注入service类并为其注入dao对象属性
事务中要注入dao层的sessionFactory属性
注入dao属性
web:注入action类并注入service属性
注意:该方法还可以整合不要hibernate.cfg.xml文件,配置在dao中的spring中,
别忘了在相应的类中要设置set方法。
配置文件一环套一环,
dao需要dataSource以及映射文件和hibernate.cfg.xml,而这三个放在sessionFactory中,所以dao注入sessionFactory。可以实现对数据库的操作。
service的事务管理的是数据库数据事务,而整个数据库有关的操作都在sessionFactory中,所以在service层的事务中要注入sessionFactory。事务又要和切面关联,可以完成对数据库操作的事务管理,而service层又要用到dao层的方法,所以service类注入dao。
在web层需要注入service层,这是因为要用到其中的方法。