1.创建web工程,整合struts2
1,添加四个文件的jar包:struts,spring,hibernate,common
2.添加jar包到lib文件夹下:
3.添加jar包到lib文件夹下:Deployment Assembly Directive--Java Build Path Entries--全选
(需要导入哪些jar包参?以下是jar包清单
通用包(7个):
commons-dbcp2-2.1.jar
commons-logging-1.1.3.jar
commons-pool2-2.3.jar
commons-collections4-4.0.jar
aopalliance-1.0-20100517.210215-13.jar
mysql-connector-java-5.1.33-bin.jar
aspectjweaver-1.6.9.jar
struts包(13+1)
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
log4j-api-2.2.jar
log4j-core-2.2.jar
ognl-3.0.6.jar
struts2-core-2.3.24.jar
xwork-core-2.3.24.jar
struts2-spring-plugin-2.3.24.jar
hibernate包(10个)
antlr-2.7.7.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.5.Final.jar
hibernate-core-4.3.10.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.1.3.GA.jar
jboss-logging-annotations-1.2.0.Beta1.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar
spring包(10个)
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-aop-4.1.6.RELEASE.jar
spring-web-4.1.6.RELEASE.jar
spring-orm-4.1.6.RELEASE.jar
spring-tx-4.1.6.RELEASE.jar
spring-jdbc-4.1.6.RELEASE.jar
spring-aspects-4.1.6.RELEASE.jar
)
4.引入框架的配置文件:
struts: web.xml struts.xml
hibernate: hibernate.cfg.xml
spring: applicationContext.xml
5.整合struts与spring只需一步
需要在web.xml中添加spring整合标签
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListener实现ServletContextListener接口,所以在服务器启动时就会加载,这个时候就会默认自动载入置于WEB-INF目录下的Spring配置文件applicationContext.xml,以此形成了struts&Spring的结合。
6.测试环境搭建:运行一个空白页面,成功即可
1.创建web工程,整合struts2
到这里,struts与spring就已经整合好了。
现在先介绍一下Spring的特点:
1.注入:
struts负责控制Service(业务逻辑处理类),从而控制了Service的生命周期,这样层与层之间的依赖很强,属于耦合。
这时,使用spring框架就起到了控制Action对象(Strus中的)和Service类的作用,两者之间的关系就松散了,Spring的Ioc机制(控制反转和依赖注入)正是用在此处。
Spring的Ioc(控制反转和依赖注入)
控制反转:就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控
控制反转:就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控
依赖注入:组件之间的依赖关系由容器在运行期决定 ,由容器动态的将某种依赖关系注入到组件之中 。
2.事务的处理:
在以往的JDBCTemplate中事务提交成功,异常处理都是通过Try/Catch 来完成,而在Spring中。Spring容器集成了TransactionTemplate,她封装了所有对事务处理的功能,包括异常时事务回滚,操作成功时数据提交等复杂业务功能。这都是由Spring容器来管理,大大减少了程序员的代码量,也对事务有了很好的管理控制。Hibernate中也有对事务的管理,hibernate中事务管理是通过SessionFactory创建和维护Session来完成。而Spring对SessionFactory配置也进行了整合,不需要在通过hibernate.cfg.xml来对SessionaFactory进行设定。这样的话就可以很好的利用Sping对事务管理强大功能。避免了每次对数据操作都要现获得Session实例来启动事务/提交/回滚事务还有繁琐的Try/Catch操作。这些也就是Spring中的AOP(面向切面编程)机制很好的应用。一方面使开发业务逻辑更清晰、专业分工更加容易进行。另一方面就是应用Spirng AOP隔离降低了程序的耦合性使我们可以在不同的应用中将各个切面结合起来使用大大提高了代码重用度
1.引入申明式事务支持的xml命名空间
既然要使用Spring封装事务的功能,首先需要引入命名空间(引入方式跟之前ioc注解引入相同,这里不做赘述)
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
2.配置数据源
之前数据访问是在hibernate.cfg.xml中进行设定,现在Spring将它接手过来做
1.常用数据源
(i)apache的数据源 org.apache.commons.dbcp.BasicDataSource (这里用Apache的dbcp)
所用到的包(可在Apache的官网里下载):
(ii)阿里巴巴的数据源 com.alibaba.druid.pool.DruidDataSource
(iii)c3p0 com.mchange.v2.c3p0.ComboPooledDataSource
(iv)Proxool
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 初始化连接数量; -->
<property name="initialSize" value="0" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="20" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="20" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="0" />
<!-- 最大等待时长 -->
<property name="maxWait" value="60000" />
<!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超过时间限制多长; -->
<property name="removeAbandonedTimeout" value="180"/>
<!-- 数据源连接参数配置; -->
<property name="username" value="${db.username}"/>
<property name="url" value="${db.url}"/>
<property name="password" value="${db.password}"/>
<property name="driverClassName" value="${db.driverClassName}"/>
</bean>
数据源连接参数配置的信息就不直接在上面改了,而是通过读取外部文件dataSource.properties来填充入占位符里。
怎么读取dataSource.properties外部文件呢?添加读取的标签
<context:property-placeholder location="classpath:dataSource.properties"/>
2.建立外部文件
既然要通过外部文件设置属性,在src根目录下新建一个
dataSource.properties文件,添加以下属性信息:
3.配置sessionFactory
要想连hibernate还得需要sessionFactory配置,之前通过HinbernateUtils来获取sessionFactory信息,现在将他从hibernate转手给Spring,添加以下配置信息:
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="net.xinqushi.model.model"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
</props>
</property>
</bean>
占位符的信息通过dataSource设置
这里有一个要注意的就是class=“的内容”,可能不同的地方不一样,至于要怎么确定里面的内容呢?
这个类的内要在jar包里面可以找到的(全文的class都是)
而ref=“的内容”要对应上面基础数据源的id名,这里为dataSource。
3.配置事务管理功能
数据访问做好之后就要开始做事务管理了
1.首先配置事务管理器
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
相同的,class的内容也需要找到
因为事务管理用到了sessionFactory,所以里面也声明了之前配置的sessionFactory
2.配置事务管理
<!-- 定义切面 -->
<aop:config>
<aop:pointcut expression="execution(* net.xinqushi.service.impl.*.* (..))" id="txPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
<!-- 声明式事务 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
切入点是:(* net.xinqushi.service.impl.*.* (..)),对该包下面的所有类进行事务管理,所有add开头或者get开头的都要受事务控制。
aop:advisor用的是别人编好的切面类,transaction-manager指向前面的事务管理
4.使用事务管理功能
1.注入
hibernateTemplate
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
2.DAOimpl层使用
在DAOimpl声明H
ibernateTemplate
hibernateTemplate。
其对象形成通过Spring注入,所以需要为其设置setter方法,容器中没有使用自动装配,所以还需要在setter方法前添加@Resource进行装配
(如果使用ioc注入对象之后还new对象就会出现hibernateTemplate空指针异常问题)