spring2.5+hibernate3.3
所需jar文件
hibernate核心安裝包下的
hibernate3.jar
lib\required\*.jar
lib\optional\ehcache-1.2.2.jar
hibernate注解安裝包下的
lib\test\slf4j-log4j12.jar
spring安裝包下的
dist\spring.jar
dist\modules\spring-webmvc-struts.jar
lib\jakarta-commons\commons-logging.jar
lib\aspectj\aspectjweaver.jar、aspectjrt.jar
lib\cglib\cglib-nodep-2.1_3.jar
lib\j2ee\common-annotations.jar
lib\log4j\log4j-1.2.15.jar
struts
下載struts-1.3.8-lib.zip,需要使用到解壓目錄下的所有jar,
把jstl-1.0.2.jar和standard-1.0.2.jar更換為1.1版本。
spring中已經(jīng)存在一個(gè)antlr-2.7.6.jar,所以把struts中的antlr-2.7.2.jar刪除,
避免jar沖突
數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar
------------------------------------------
把sessionFacory交給spring管理
在xml文件 中加入
<!-- 配置sessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> //用spring包裝的sessionFactory來(lái)管理session
<property name="dataSource" ref="dataSource"/> //配置數(shù)據(jù)源,引用前面已配置好的數(shù)據(jù)源
<property name="mappingResources">
<list>
<value>cn/itcast/bean/Person.hbm.xml</value>//orm映射配置文件,可配置多個(gè)
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto = update
hibernate.show_sql = false
hibernate.format_sql = false
</value>
</property>
</bean>
<!--
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionMana
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置事務(wù)采用的聲明方式,這里使用注解方式..這里要配置一下事務(wù)管理器,采用前面配置好的事務(wù)管理器-->
<tx:annotation-driven transaction-manager="txManager"/>
-------------------------------------------------------------
實(shí)例化spring容器
通過(guò)配置web.xml的listener
<!--指定spring的配置文件,默認(rèn)從web目錄尋找配置文件,可以通過(guò)spring提供的classpath前綴指定從類路徑下尋找-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<!-- 對(duì)spring容器進(jìn)行實(shí)例化-->
<listener>
</listener>
-------------------------------------------
集成struts1.3,加載struts1.3/lib下的所有.jar,與spring重復(fù)的那個(gè)不要,如前所述
在Action中要調(diào)用 spring中實(shí)例bean,因此要先得到spring容器
如果action沒(méi)有交給spring管理時(shí),通過(guò)下面語(yǔ)句獲取spring容器實(shí)例
WebApplicationContext ctx=WebApplicatinContextUtil
spring容器實(shí)例呢,是通過(guò)web.xml中的listener初始化而來(lái)的,放到了application作用范圍,存到了servletContext中
//////
把a(bǔ)ction交給spring管理后,可以使用依賴注入在action中注入業(yè)務(wù)層的bean。確保action的path屬性值與bean的名稱相同。
<action path="/person/list" ..>
</action>
spring配置
<bean name="/person/list" class="cn.itcast.web.action.PersonAction"/>
在struts配置文件中添加進(jìn)spring的請(qǐng)求控制器,該請(qǐng)求控制器會(huì)先根據(jù)action的path屬性值到spring容器中
尋找跟該屬性值同名的bean。如果尋找到即使用該bean處理用戶請(qǐng)求
<controller>
<set-property property="processorClass">
------------------------------------------------------------
配置hibernate的二級(jí)緩存
<!--設(shè)置是否起用二級(jí)緩存-->
hibernate.cache.use_second_level_cache=true
<!--設(shè)置是否起用查詢緩存,因查詢緩存使用效率并不高,一般不用開(kāi)啟-->
hibernate.cache.use_query_cache=false
<!--設(shè)置緩存產(chǎn)品的驅(qū)動(dòng)類,采用EhCacheProvider產(chǎn)品要用到lib\optional\ehcache-1.2.3.jar-->
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
//////////////
使用EhCache,要配置其ehcache.xml文件(放在類路徑下)
<ehcache>
<diskStore path="D:\cache"/>
<defaultCache maxElementsInMemory="1000" etemal="false" overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
diskPersistent="false"
diskExpiryThreadInterval
<!--針對(duì)cn.itcast.bean.Person這個(gè)區(qū)域名設(shè)置,區(qū)域名對(duì)應(yīng)與Person.hbm.xml中的區(qū)域名設(shè)置相同-->
<cache name="cn.itcast.bean.Person" maxElementsInMemory="100" eternal="false"
overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" diskPersistent="false"/>
</ehcache>
path 設(shè)置緩存在硬盤(pán)上的路徑
defaultCache 節(jié)點(diǎn)為缺省的緩存策略
maxElementsInMemory內(nèi)存中最大允許存在的對(duì)象數(shù)量
eternal設(shè)置緩存中的對(duì)象是否永遠(yuǎn)不過(guò)期
overflowToDisk是否把溢出的對(duì)象存放到硬盤(pán)上
timeToIdleSeconds 指定緩存對(duì)象空閑多長(zhǎng)時(shí)間就過(guò)期,過(guò)期的對(duì)象會(huì)被清除掉
timeToLiveSeconds 指定緩存對(duì)象總的存活時(shí)間
diskPersistent 當(dāng)jvm結(jié)束時(shí)是否持久化對(duì)象
diskExpiryThreadInterval
///////////////////
在Person.hbm.xml中配置緩存策略
<cache usage="read-write" region="cn.itcast.bean.Person"/>
usage設(shè)置緩存策略,read-write是讀寫(xiě)策略,當(dāng)并發(fā)訪問(wèn)時(shí),一個(gè)在寫(xiě)的時(shí)候,另一個(gè)只能讀
region緩存區(qū)域名,在區(qū)域里存放緩存對(duì)象,定義為實(shí)體類的全稱
/////////////////
設(shè)置了緩存之后,當(dāng)它第一次獲取到記錄后,第二次再去獲取這條記錄,它會(huì)從內(nèi)存里獲取,而不是從數(shù)據(jù)庫(kù)獲取
-----------------------------------------------------------------------------------------------------------------
spring解決struts1.3亂碼問(wèn)題
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-------------------------------------------
使用spring解決hibernate因session關(guān)閉導(dǎo)致的延遲加載例外問(wèn)題
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-----------------------------------------------------------------
spring2.5+JPA+struts1.3整合
這里JPA實(shí)現(xiàn)采用hibernate
hibernate核心包(8個(gè)文件)
hibernate3.jar
lib\bytecode\cglib\hibernate-cglib-repack-2.1_3.jar
lib\required\*.jar
hibernate注解包(3個(gè)文件) hibernate-annotations-3.4.0.GA
hibernate-annotations.jar
lib\ejb3-persistence.jar、hibernate-commons-annotations.jar
hibernate針對(duì)JPA實(shí)現(xiàn)包(3個(gè)文件) hibernate-entitymanager-3.4.0.GA
hibernate-entitymanager.jar
lib\test\log4j.jar、slf4j-log4j12.jar
+++++++++++++++++++++
spring安裝包下的
dist\spring.jar
dist\modules\spring-webmvc-struts.jar
lib\jakarta-commons\commons-logging.jar
lib\aspectj\aspectjweaver.jar、aspectjrt.jar
lib\cglib\cglib-nodep-2.1_3.jar
lib\j2ee\common-annotations.jar
lib\log4j\log4j-1.2.15.jar
+++++++++++++++++++++++++
struts1.3同上
在web.xml文件中添加
<servlet>
<servlet-name>struts</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name> <!-- 指定struts配置文件所在路徑 -->
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>struts</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
++++++++++++++++++++++++++++++++++++++++++
將struts-config.xml拷貝到WEB-INF目錄下
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts-config PUBLIC
<struts-config>
<controller><controller>
<set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcess
</controller>
</struts-config>
++++++++++++++++++++++++++++++++++++++++++++++++++++
spring解決struts1.3亂碼問(wèn)題
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
+++++++++++++++++++++++++++
使用spring解決JPA因EntityManager關(guān)閉導(dǎo)致的延遲加載例外問(wèn)題
<filter>
<filter-name>SpringEntityManagerViewF
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerViewFil
</filter>
<filter-mapping>
<filter-name>SpringEntityManagerViewF
<url-pattern>/*</url-pattern>
</filter-mapping>
+++++++++++++++++++++++++++++++
應(yīng)注意的是:
struts1.3的Action都是單例模式,存在線程安全的問(wèn)題,因此可以在spring配置文件中
把涉及到線程安全的action配上scope="prototype"
--------------------------------------------------------------------------------------------------------------
spring2.5+hibernate3.3+struts2整合開(kāi)發(fā)
struts2
使用到struts2的lib目錄下所有不帶-plugin結(jié)尾的jar文件,antlr-2.7.2.jar也不要(spring已自帶)
但除了struts2-spring-plugin-2.0.11.1.jar例外
spring
同前面所講,但是不用加dist\modules\spring-webmvc-struts.jar
hibernate
同前面所講。
數(shù)據(jù)庫(kù)驅(qū)動(dòng).jar
++++++++++++++++++++++
web.xml配置
用來(lái)實(shí)例化spring容器,配置listener
引入struts2控制器 配置filter
使用spring解決JPA因EntityManager關(guān)閉導(dǎo)致的延遲加載例外問(wèn)題 配置filter
struts2.xml文件配置
<struts>
<!--指定web應(yīng)用的默認(rèn)編碼集,相當(dāng)于調(diào)用HttpServletRequest的setCharacterEncoding方法-->
<constant name="struts.i18n.encoding" value="utf-8"/>
<!--指定struts2處理的請(qǐng)求后綴,默認(rèn)為.action,如果要指定多個(gè)后綴,則多個(gè)后綴以英文的逗號(hào)(,)隔開(kāi)-->
<constant name="struts.action.extension" value="do"/>
<!--設(shè)置瀏覽器是否緩存靜態(tài)內(nèi)容,默認(rèn)值為true(生產(chǎn)環(huán)境下用),開(kāi)發(fā)階段最好關(guān)閉-->
<constant name="struts.seve.static.browserCache" value="false"/>
<!--當(dāng)struts的配置文件修改后,系統(tǒng)是否自動(dòng)重新加載該文件,默認(rèn)值為false(生產(chǎn)環(huán)境下用),開(kāi)發(fā)階段最好設(shè)為true-->
<constant name="struts.configuration.xml.reload" value="true"/>
<!--開(kāi)發(fā)模式下使用,這樣可以打印更詳細(xì)的錯(cuò)誤信息-->
<constant name="struts.devMode" value="true">
<!--默認(rèn)的視圖主題-->
<constant name="struts.ui.theme" value="simple"/>
<!--與spring集成,由spring生成action實(shí)例-->
<constant name="struts.objectFactory" value="spring"/>
<package name="person" namespace="/person" extends="struts-default">
<global-results>
<result name="message">/WEB-INF/page/message.jsp</result>
</global-results>
<action name="action_*" class="personList" method="{1}">
<result name="list">/WEB-INF/page/persons.jsp</result>
<result name="add">/WEBINF/page/add_person.jsp</result>
</action>
</package>
</struts>
這里的personList是對(duì)應(yīng)spring配置beans.xml里的bean配置
<bean id="personList" class="com.feihu.action.PersonAction">
++++++++++++++++++
請(qǐng)求的執(zhí)行過(guò)程是,客戶發(fā)送request請(qǐng)求,經(jīng)總控制器進(jìn)入strust2
找到請(qǐng)求對(duì)應(yīng)的class一看,是引用的spring里的對(duì)應(yīng)的bean,于是轉(zhuǎn)
到spring容器找到相應(yīng)的Action實(shí)例,進(jìn)行處理.