ssh(Struts+spring+Hibernate)三大框架整合-简述
ssh(Struts+spring+Hibernate)三大框架配合使用來開發(fā)項目,是目前javaee最流行的開發(fā)方式,必須掌握;
注意:
為了穩(wěn)健起見,每加入一個框架,我們就需要測試一下,必須通過才行;
?
框架整合的具體步驟:
創(chuàng)建web項目
1.??????先搞定spring
2.??????引入Spring開發(fā)包
3.??????編寫applicationContext文件(也可以是其他名字),暫時先放src目錄下
4.??????測試一下spring是否ok--->工作正常
5.??????加入hibernate開發(fā)包
6.??????因?yàn)槲覀兪莝sh,所以我們hibernate的核心,就被spring接管了,hibernate.cfg.xml文件,對象映射文件,SessionFactory在spring的配置文件中配置即可。
7.??????配置數(shù)據(jù)源
<!-- 配置數(shù)據(jù)源對象 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName"value="oracle.jdbc.driver.OracleDriver"/><property name="url"value="jdbc:oracle:thin:@127.0.0.1:1521:orahsp8"/><property name="username"value="scott"/><property name="password"value="tiger"/><!-- 連接池啟動時的初始值 --><property name="initialSize" value="3"/><!-- 連接池的最大值 --><property name="maxActive"value="500"/><!-- 最大空閑值.當(dāng)經(jīng)過一個高峰時間后,連接池可以慢慢將已經(jīng)用不到的連接慢慢釋放一部分,一直減少到maxIdle為止 --><property name="maxIdle" value="2"/><!-- 最小空閑值.當(dāng)空閑的連接數(shù)少于閥值時,連接池就會預(yù)申請去一些連接,以免洪峰來時來不及申請 --><property name="minIdle" value="1"/>
</bean>
8.???????配置SessionFactory
<!-- 配置會話工廠對象 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mappingResources"><list><value>cn/xxx/bean/Person.hbm.xml</value></list></property><property name="hibernateProperties"><value>hibernate.dialect=org.hibernate.dialect.OracleDialecthibernate.hbm2ddl.auto=updatehibernate.show_sql=false</value></property>
</bean>
9.???????編寫domain對象和映射文件,Employee.hbm.xml--->測試spring和hibernate能不能結(jié)合使用
10.????考慮分層
?
11.???使用事務(wù)管理器來統(tǒng)一管理事務(wù).
注意如果使用事務(wù)管理器來統(tǒng)一管理事務(wù)時,則不要配置
hibernate.current_session_context_class=thread這一屬性
不然會報:createQuery is not valid without activetransaction 錯誤!
<!-- 使用事務(wù)管理器來統(tǒng)一管理事務(wù). -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"ref="sessionFactory"/>
</bean>
<!-- 啟用事務(wù)注解 @Transactional -->
<tx:annotation-driven transaction-manager="txManager"/>
?
詳情可查看文檔[中間層數(shù)據(jù)訪問->聲明事務(wù)管理->使用@Transactional]
?
?
12.???配置我們的hibernate二級緩存 [ehcache? /? oscache ]并引入二級緩存開發(fā)包和對應(yīng)的配置文件;
在sessionFactory中配置hibernateProperties屬性如下:
<property name="hibernateProperties"><value>hibernate.dialect=org.hibernate.dialect.OracleDialecthibernate.hbm2ddl.auto=updatehibernate.show_sql=falsehibernate.cache.use_second_level_cache=truehibernate.cache.provider_class=org.hibernate.cache.EhCacheProviderhibernate.generate_statistics=true <!—緩存統(tǒng)計策略--> </value>
</property>
?
12.0???在需要使用二級緩存的對象domain對象配置文件*.hbm.xml中配置二級緩存策略:
<class ………..>
<!-- 使用二級緩存策略 -->
<cache usage="read-write"/>
... ..</class>
12.1???添加二級緩存開發(fā)包。
12.2???將我們的ehcache的配置文件放到 src目錄
12.3???證明二級緩存生效
?
13.??整合struts
13.1 引入struts開發(fā)包
13.2 創(chuàng)建struts-config.xml? 方法 /WEB-INF 目錄下
配置如下:
14.??在web.xml中配置struts
<?xml version="1.0"encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param><param-name>debug</param-name><param-value>3</param-value></init-param><init-param><param-name>detail</param-name><param-value>3</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>
?
15.??在web.xml文件中初始化我們的Spring容器
?
<!-- 指定spring的配置文件,默認(rèn)從web根目錄尋找配置文件,我們可以通過spring提供的classpath:前綴指定從類路徑下尋找 -->
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 對Spring容器進(jìn)行實(shí)例化 -->
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
16.???讓Spring接管我們struts(action控件)
?
當(dāng)把action交給了spring管理后,其實(shí)可以以注解的方式自動注入action,如果全部
以注解的方式注入就要求action、service全部都配置注解,還需要啟用“組件掃描配置“
也就是說如果需要的話,我們完全可以使用基于注解注入的方式來完成注入;
步驟:(1)啟用注解
<!-- 啟用注解 -->
<context:annotation-config/>
?
?
(2)到需要注入的源碼初步進(jìn)行元注解標(biāo)記注入
如 下圖:
(甚至可以做到action、service都無需配置到容器中,而是采用注解的方式完成)
詳情用法可查看spring文檔》》
?
16.1在struts-config.xml中配置 (代理請求處理)把實(shí)例化action組件轉(zhuǎn)交給spring
<!-- 配置代理請求處理DelegatingRequestProcessor ,它的用處是當(dāng)ActionServlet中心控制器查找對應(yīng)的action時,它如果發(fā)現(xiàn)struts-config.xml中有如下配置,則不會在本配置中查找,而是到spring 的applicationContext中去找,并實(shí)例化--><controller><set-property property="processorClass"value="org.springframework.web.struts.DelegatingRequestProcessor"/></controller><action path="/login" name="empForm"attribute="empForm" input="/login.jsp" parameter="flag" "><!—這里要注意的是type則無需再配置了因?yàn)榻挥蓅pring管理--><forward name="ok"path="/WEB-INF/mainframe.jsp"></forward><forward name="err"path="/login.jsp"></forward></action>
16.2在spring配置容器中applicationContext.xml中作如下配置:
?? 例子:當(dāng)瀏覽器請求為:http://……../login.do;
???????? 那么對于在spring則應(yīng)如下配置,其他action同理;
<!-- 配置action對象,這里把 scope='prototype'可以有效地解決了action的單例問題,達(dá)到非單例的效果 -->
<bean name="/login" class="com.sx.web.actions.LoginAction"></bean>
?
16.3 這我們就可以通過spring容器來獲取action,和配置action的一些屬性
16.4 通過使用sping來接管我們的action,還有一個好處,可以解決action 是單例的問題.通過在applicationContext.xml文件中配置屬性 ??
<bean scope=”singlton/prototype/request/sesssion/global session”/>
?
- 解決中文亂碼的問題
思路1:
①?? :可以使用以前的辦法,如使用過濾器;
②?? :重寫ActionServlet,重寫它的protected void process(HttpServletRequest request, HttpServletResponse response)方法重新設(shè)置編碼
思路2:
使用spring框架提供的處理中文亂碼的過濾器,直接配置到web.xml中即可(其實(shí)跟前面的過濾器實(shí)現(xià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>
?
?
18. 對ssh整合的特別說明:
18.1.??????spring可以啟用注解的方式來配置屬性.
?
???????????重新這樣配置bean
<bean id="employeeService"class="com.hsp.service.imp.EmployeeService"/>
在EmployeeService的屬性sessionFactory中添加一個注解 @Resource
在applicationContext.xml中啟用注解
<context:annotation-config/>
?
此時還必須啟用注解掃描如使用了@service、Controler...等
<context:component-scanbase-package="com.shop"/>
詳情可見,spring查詢文檔的:? 核心技術(shù)—> IoC(控制反轉(zhuǎn))容器 --->對受管組件的Classpath掃描
?
測試->ok
?
?
18.2.?????? ssh整合的時候,如何解決懶加載問題
問題? 如果我們的雇員都屬于一個部門
Class Department{privateInteger id;private String name;
}
?
目前我們把測試數(shù)據(jù)作出了.
?
具體問題?如果我們在?mainFrame.jsp中要求顯示該雇員所在部門的時候
?
${loginuser.department.name}? 時候,懶加載問題出現(xiàn):
解決思路:
1. 明確初始化
???????? 在session還沒有關(guān)閉時,訪問一次xxx.getXxx(),強(qiáng)制訪問數(shù)據(jù)庫?;蛘?Hibernate.initialize(xxx)
2????????在對象映射文件中 取消懶加載? <lazy=”false”/>
上面方法問題是: 不管你在jsp中使不使用 部門的名稱,它都有向數(shù)據(jù)庫發(fā)出select 請求.
3.?????? spring專門提供了opensessioninview的方法來解決懶加載.
需要在web.xml文件中添加如下配置:
這是針對Hibernate的
<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>
這是針對JPA的
? ?
<!-- 懶加載 --><filter><filter-name>Spring?OpenEntityManagerInViewFilter</filter-name><filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class></filter><filter-mapping><filter-name>Spring?OpenEntityManagerInViewFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
該方法可以有效的減少對數(shù)據(jù)庫的查詢,缺點(diǎn)是和數(shù)據(jù)保持的session,時間延長了.
?
18.3.??????如果想獲取到Spring管理的session時,我們可以使用回調(diào)函數(shù)完成;(好處是,session無需我們?nèi)ス芾?#xff0c;而是由Spring包辦了)
?
18.4 ? ? Hibernate與Spring整合后可以使用處理事務(wù)的方法有:
(1)?????? 繼承Spring給hibernate所提供的dao類 extends HibernateDaoSupport? 然后使用其提供給我們的HibernateTemplate對象即可對數(shù)據(jù)庫進(jìn)行一系列的操作,而無須關(guān)系事務(wù)的事情,如果想得到spring管理的下的session則要使用回調(diào)函數(shù):上面1點(diǎn)所述;詳情可查看spring查詢文檔;
(2)?????? 可以使用配置的方式管理事務(wù):
方法①:
首先在容器中啟用事務(wù)管理器
<!-- 啟用注解 -->
<context:annotation-config/><!-- 配置統(tǒng)一管理事務(wù)-->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory">
</property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
?
這時候則在對應(yīng)需要事務(wù)處理的類文件中做如下注解(@Transactional):
這樣spring則會自動幫我們管理事務(wù),而無需我們自己去管理;
?
方法②:
①事物管理器
②advice通知(這里可以指定把事物應(yīng)用到那個方法,使用哪種級別傳播方式)
③aop切面
<!-- 事務(wù)配置方法② --><!-- 事務(wù)管理器 --><bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property></bean><!-- 配置通知 --><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="update*" propagation="REQUIRED"/></tx:attributes></tx:advice><!-- 配置切面 --><aop:config><!-- 配置切入點(diǎn) --><aop:pointcut expression="execution(*com.s2sha.web.biz.impls.*.*(..))" id="usrBizOperaction"/><!-- 織入通知 --><aop:advisor advice-ref="txAdvice" pointcut-ref="usrBizOperaction"/></aop:config>
總結(jié)
以上是生活随笔為你收集整理的ssh(Struts+spring+Hibernate)三大框架整合-简述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts2 与 sping 整合 控
- 下一篇: java写游戏的聊天怎么写_怎么用JAV