在SSH框架的JAVAweb項目的開發過程當中,WEB層一般使用的是Struts2+jsp,service層使用的是javaBean,DAO層使用的是hibernate,而spring的使用覆蓋三層。java
使用了spring框架以後,咱們能夠把對象交給spring來管理。在WEB層中,全部action對象的建立和管理均可以交給spring來完成,這樣Struts2就不用本身來new一個action,這一切均可以交給spring,直接向spring來要action對象。mysql
在DAO層中hibernate框架,在這一層中hibernate--SessionFactory對象,包括session的得到,AOP事務,均可以交給spring,這樣使用hibernate只須要作一些業務操做就能夠了,web
把其餘的關於事務以及對象的管理都交給spring來完成。spring
簡單的說,三大框架整合,就是把Struts2整合到spring當中,把hibernate整合到spring當中。sql
下面咱們來進行三大框架整合:數據庫
整合的第一步,咱們首先須要作的就是導包,導入三個框架須要用到的jar包,這是三大框架整個中的第一步,也是最重要的一步,導包完成後,咱們的三大框架整合就已經完成了百分之六十。express
若是三大框架所用到的jar包文件壓縮包沒有,能夠去各個框架的相關網站上下載。apache
hibernate包:session
在hibernate中的lib下的required包中jar文件,都須要拿過來。架構
/lib/jpa java持久化規範
Struts2包:
Struts-black.war/WEB-INF/lib/*
若是有重複,刪除版本低的那個。
Struts整合spring插件包
若是導入這個包,Struts在啓動的時候就會尋找spring容器,若是尚未配置spring容器,單單是啓動Struts,項目就會拋出異常。若是隻是用Struts框架時,
這個包能夠不須要導入。
spring包:
基本包:
整合web須要的web包
整合aop:4個包
整合JDBC事務
整合Junit4測試
截止到這裏,用到的包就導入完了,可是若是須要使用的是eclipse,標籤庫的包仍是須要本身導入一下。
標籤庫包:
導包完成
導包完成以後,就須要進行三大框架的整合步驟,首先是單獨爲項目配置每個框架
單獨配置spring容器
建立配置文件,並導入約束(4個)beans|context|aop|tx
首先,建立spring配置文件applicationContext.xml
而後切換到設計視圖
首先導入一個約束
而後再繼續導入剩餘的4個約束
beans約束
context約束
而後aop,tx 這樣四個命名空間就導入完成了
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd "> <bean name="userAction " class="com.test.web.action.UserAction "></bean> </beans>
截止到這裏,spring的約束以及命名空間也導入完成。
這樣spring容器就配置好了,可是咱們想讓spring隨着項目的啓動而啓動,就須要在web.xml文件中配置一個監聽器。
web.xml
<!-- 讓spring隨web啓動而建立的監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置spring配置文件位置參數 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
這個時候啓動項目,項目不報錯,說明spring容器隨着項目的啓動而啓動配置沒有錯誤。
單獨配置Struts2
1. 配置Struts2主配置文件
<?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> <!-- # struts.objectFactory = spring 將action的建立交給spring容器 struts.objectFactory.spring.autoWire = name spring負責裝配Action依賴屬性 --> <constant name="struts.objectFactory" value="spring"></constant> <package name="crm" namespace="/" extends="struts-default" > <action name="UserAction_*" class="userAction" method="{1}" > <result name="toHome" type="redirect" >/index.htm</result> <result name="error" >/login.jsp</result> </action> </package> </struts>
主配置文件寫好以後,須要配置Struts2的核心過濾器
在web.xml文件中配置Struts2的核心過濾器
代碼以下:
<filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <!-- struts2核心過濾器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
須要注意的是:配置到這裏,仍是建議從新的啓動項目,看看是否配置正確,咱們在這裏須要注意的是,每配置一步,咱們就啓動項目測試一下,看看該步是否正確
防止,等最後咱們配置完的時候,出現錯誤的時候,不方便進行檢查。
配置完spring到web項目,以及配置完Struts2到web項目,下面須要作的就是整合Struts2到spring中
1. 須要導包,導入spring與Struts2整合包,這個包咱們在第一步已經導入過了struts2-spring-plugin-2.3.24.jar
2. 配置常量:
(1)struts.objectFactory = spring 將action的建立交給spring容器 (2)struts.objectFactory.spring.autoWire = name spring負責裝配Action依賴屬性
咱們只須要配置第一個常量便可,由於第二個默認是打開的,不用配置。第一個常量是將action的建立交給spring容器 ,咱們須要在Struts.xml文件中配置
<!-- # struts.objectFactory = spring 將action的建立交給spring容器 struts.objectFactory.spring.autoWire = name spring負責裝配Action依賴屬性 --> <constant name="struts.objectFactory" value="spring"></constant>
下面進行Struts2與spring整合
整合有兩種方案
第一種方案:class屬性上仍然配置action的完整類名,struts2仍然建立action,由spring負責組裝Action中的依賴屬性
使用這種方案,就是在配置文件中action class依舊使用完整的類名,這樣能夠當作是Struts與spring配合進行對象建立。struts2仍然建立action,由spring負責組裝Action中的依賴屬性
不過這種方法不推薦使用,不推薦理由:最好由spring完整管理action的生命週期.spring中功能才應用到Action上.
第二種方案:
class屬性上填寫spring中action對象的BeanName,BeanName是在applicationContext.xml文件中定義的,徹底由spring管理action生命週期,包括Action的建立注意:須要手動組裝依賴屬性
注意:須要手動組裝依賴屬性,由於這樣配置的話,spring就不能自動組裝,須要手動組裝依賴屬性
手動組裝依賴屬性的意思就是,在applicationContext.xml文件中,把各個對象的依賴手動配置進去。
在Struts.xml文件中,class屬性只須要寫beanName就能夠了
注意:scope="prototype" Action對象做用範圍必定是多例的.這樣才符合struts2架構
<!-- action --> <!-- 注意:Action對象做用範圍必定是多例的.這樣才符合struts2架構 --> <bean name="userAction" class="com.test.web.action.UserAction" scope="prototype" > <property name="userService" ref="userService" ></property> </bean> <!-- service --> <bean name="userService" class="com.test.service.impl.UserServiceImpl" > </bean>
到這裏,Struts整合spring完成了
下面須要作的是。進行單獨配置hibernate,而後把hibernate與spring進行整合:
單獨配置hibernate
建立hibernate配置文件hibernate.cfg.xml,配置相關實體以及數據庫的鏈接
<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 數據庫url --> <property name="hibernate.connection.url">jdbc:mysql:///shop</property> <!-- 數據庫鏈接用戶名 --> <property name="hibernate.connection.username">root</property> <!-- 數據庫鏈接密碼 --> <property name="hibernate.connection.password">123456</property> <!-- 數據庫方言 注意: MYSQL在選擇方言時,請選擇最短的方言. --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 將hibernate生成的sql語句打印到控制檯 --> <property name="hibernate.show_sql">true</property> <!-- 將hibernate生成的sql語句格式化(語法縮進) --> <property name="hibernate.format_sql">true</property> <!-- 自動導出表結構. 自動建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 引入實體配置文件 --> <mapping resource="com/test/domain/Customer.hbm.xml" /> <mapping resource="com/test/domain/LinkMan.hbm.xml" /> <mapping resource="com/test/domain/User.hbm.xml" /> </session-factory> </hibernate-configuration>
整合原理:將sessionFactory對象交給spring容器管理
applicationContext.xml文件中加載hibernate框架配置文件有兩種方式,下面咱們對這兩種方式作簡要的介紹:
第一種方案:仍然使用外部的hibernate.cfg.xml配置信息,applicationContext.xml文件中
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" > <property name="configLocation" value="classpath:hibernate.cfg.xml" ></property> </bean> -->
這樣配置的話,sessionFactory就會從classpath:hibernate.cfg.xml 配置文件中加載配置信息,使用的是該文件中的全部配置信息
這種方案不推薦使用,由於這樣的話會使hibernate的配置增多,咱們的初衷應該是把一些配置交給spring,應該往spring中挪一挪,name請看第二種方案
第二種方案:在spring配置中放置hibernate配置信息
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" > <!-- 將鏈接池注入到sessionFactory, hibernate會經過鏈接池得到鏈接 --> <property name="dataSource" ref="dataSource" ></property> <!-- 配置hibernate基本信息 --> <property name="hibernateProperties"> <props> <!-- 必選配置 --> <prop key="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</prop> <prop key="hibernate.connection.url" >jdbc:mysql:///crm</prop> <prop key="hibernate.connection.username" >root</prop> <prop key="hibernate.connection.password" >123456</prop> <prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop> <!-- 可選配置 --> <prop key="hibernate.show_sql" >true</prop> <prop key="hibernate.format_sql" >true</prop> <prop key="hibernate.hbm2ddl.auto" >update</prop> </props> </property> <!-- 引入orm元數據,指定orm元數據所在的包路徑,spring會自動讀取包中的全部配置 --> <property name="mappingDirectoryLocations" value="classpath:com/test/domain" ></property> </bean>
這一種方案是推薦方案,咱們把sessionFactory交給spring容器來管理
在三大框架整合中,這些是最基本的整合操做,下面將對整合中剩餘的的細節進行補充:
使用C3P0鏈接池:
1.配置db.properties
jdbc.jdbcUrl=jdbc:mysql:///crm jdbc.driverClass=com.mysql.jdbc.Driver jdbc.user=root jdbc.password=123456
2.引入鏈接池到spring中
<!-- 讀取db.properties文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 配置c3p0鏈接池 --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" > <property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property> <property name="driverClass" value="${jdbc.driverClass}" ></property> <property name="user" value="${jdbc.user}" ></property> <property name="password" value="${jdbc.password}" ></property> </bean>
有了鏈接池後,直接從鏈接池中讀取配置信息,因此能夠在spring容器applicationContext.xml文件中,。就不用配置數據庫鏈接信息了
3.將鏈接池注入給SessionFactory
<!-- 將鏈接池注入到sessionFactory, hibernate會經過鏈接池得到鏈接 --> <property name="dataSource" ref="dataSource" ></property>
到這裏,配置信息配置的都已經差很少了,下面須要作的是使用DAO方法操做數據庫了。