搭建SSH時(shí)的思考和遇到的幾個(gè)問題的解決方法
更新時(shí)間:2007年12月07日 21:33:17 作者:
SSH流行很久了,一直看到官方文檔和網(wǎng)上都在講如何整合SSH,討論各種整合的優(yōu)缺點(diǎn)。今天我比較閑,也用我的一些想法來試著整合這三個(gè)最流行的框架。
本次所用版本為:Struts 1.3.9 Spring 2.5 Hiberante 3.2
開發(fā)工具和環(huán)境為:Eclipse 3.3+MyEclipse 6.0+JBoss 4.2+Tomcat
用SSH時(shí),我們的架構(gòu)自然就會(huì)分成三層,即表現(xiàn)層,邏輯層和持久層,按照Martin Flower的指導(dǎo)思想,耦合越少越好,下層為上層提供服務(wù),這也是Rod開發(fā)Spring的指導(dǎo)思想之一,所以我首先想到的就是如何減少到最低的耦合。
根據(jù)Spring 2.0官方文檔中推薦的做法,Spring與Struts1.x集成,有采用代理類的方式,也有用ActionSupport的方式,但是我認(rèn)為這兩種方式無疑都有很強(qiáng)的侵入性和依賴性,這與Spring的思想有些矛盾。
我采用AutowiringRequestProcessor來做,這個(gè)類會(huì)自動(dòng)為你裝載你所需要的Service,根據(jù)其Java Doc的提示,其默認(rèn)是byType匹配的,當(dāng)然你也可以用byName的方式,我認(rèn)為以Type的方式就OK了。來看看兩個(gè)配置文件吧,先來看看Struts的配置文件struts-config.xml:
1 <? xml version="1.0" encoding="UTF-8" ?>
2 <! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd" >
3
4 < struts-config >
5 < form-beans >
6 < form-bean name ="loginForm" type ="com.***.ssh.view.login.LoginForm" />
7 </ form-beans >
8
9 < global-exceptions />
10 < global-forwards />
11 < action-mappings >
12 < action name ="loginForm" path ="/login" scope ="request"
13 type ="com.***.ssh.view.login.LoginAction" validate ="false" />
14 </ action-mappings >
15
16 < controller
17 processorClass ="org.springframework.web.struts.AutowiringRequestProcessor" />
18
19 < message-resources parameter ="ApplicationResources" />
20 </ struts-config >
21
22
這個(gè)文件中可以發(fā)現(xiàn),跟沒有與Spring集成時(shí)就一點(diǎn)不一樣,多了一行:
<controller processorClass="org.springframework.web.struts.AutowiringRequestProcessor" />
再來看看Spring的配置文件applicationContext.xml:
1 <? xml version="1.0" encoding="UTF-8" ?>
2 <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
3
4 < beans >
5
6 < bean id ="SSHSessionFactory"
7 class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
8 < property name ="configLocation" >
9 < value > classpath:hibernate.cfg.xml </ value >
10 </ property >
11 </ bean >
12
13 < bean name ="LoginService"
14 class ="com.***.ssh.biz.login.LoginService" singleton ="false" >
15 < property name ="dao" >
16 < ref bean ="UsersDao" />
17 </ property >
18 </ bean >
19
20 < bean id ="UsersDao" class ="com.***.ssh.persistence.UserDao" >
21 < property name ="sessionFactory" >
22 < ref bean ="SSHSessionFactory" />
23 </ property >
24 </ bean >
25 </ beans >
26
這里面也沒有多余的內(nèi)容,不會(huì)出現(xiàn)代理方式時(shí),多份XML同時(shí)配置的問題,減少了維護(hù)量。
同時(shí),你會(huì)發(fā)現(xiàn),我并沒有把Hibernate的具體配置放在這里面,而是用Hibernate自身的配置來管理。
這樣的話,我們?nèi)龑又g的依賴性會(huì)降到較低,兩頭可以任意換到其中的某一層。
順便要說的是,常見的書籍上面發(fā)現(xiàn)往往不會(huì)有如此深入的探討,難道是怕初學(xué)者看不懂嗎?
另外,對(duì)于一個(gè)架構(gòu)來說,要解決的問題決不是指這些,通常我們可以采用RUP的4+1視圖的方法去考慮架構(gòu)的方方面面。我們也可以從以下一些方面來各個(gè)擊破:安全性,數(shù)據(jù)輸入輸出的校驗(yàn)與轉(zhuǎn)換,國際化,LOG,異常處理,異構(gòu)系統(tǒng)整合,后臺(tái)運(yùn)行程序等等。如果是多個(gè)數(shù)據(jù)庫,我們還需要更多的考慮事務(wù)控制。
我想我后面會(huì)去完善這個(gè)整合,并實(shí)現(xiàn)一個(gè)Demo,作為小的簡單的項(xiàng)目快速開發(fā)的基礎(chǔ)。
整合時(shí)遇到過如下問題:
問題1:啟動(dòng)時(shí)出現(xiàn) “嚴(yán)重: Error listenerStart ”
這個(gè)問題,網(wǎng)上有很多解決辦法:
有一種最簡單的解決辦法是把用Listener初始化Spring改為用Servlet初始化Spring,但這樣的方法不太好,一是沒有找到根源,二是可能會(huì)帶來新的問題。
比較好的一種解決辦法是,加上Log4J的相關(guān)配置,然后再啟動(dòng)時(shí),就會(huì)出現(xiàn)各類詳細(xì)信息,這樣可根據(jù)具體信息再來解決,一般可能是DataSource配置,或環(huán)境配置有問題。
參考網(wǎng)址:http://hi.baidu.com/xht314/blog/item/808ecf13c1dd1820dd5401af.html
問題2:遇到“Required extension qdox not found”這樣的提示
網(wǎng)上也有解答,我用的方法是直接把commons-attributes-compiler.jar這個(gè)包去掉。當(dāng)然如果你要用到這個(gè)包的話,可以參考下面這個(gè)地址:
http://hi.baidu.com/sky_lei/blog/item/77ee17085543b232e8248824.html
問題3:Struts包與Spring包沖突的問題
我遇到包有沖突,換成Struts需要的優(yōu)先就OK了,現(xiàn)在的JAR檔越來越麻煩了,很多項(xiàng)目的JAR檔都被開發(fā)人員搞得亂七八糟,看來Maven是個(gè)好東西,至少思想是好的,可能下一步需要研究一下。
本次所用版本為:Struts 1.3.9 Spring 2.5 Hiberante 3.2
開發(fā)工具和環(huán)境為:Eclipse 3.3+MyEclipse 6.0+JBoss 4.2+Tomcat
用SSH時(shí),我們的架構(gòu)自然就會(huì)分成三層,即表現(xiàn)層,邏輯層和持久層,按照Martin Flower的指導(dǎo)思想,耦合越少越好,下層為上層提供服務(wù),這也是Rod開發(fā)Spring的指導(dǎo)思想之一,所以我首先想到的就是如何減少到最低的耦合。
根據(jù)Spring 2.0官方文檔中推薦的做法,Spring與Struts1.x集成,有采用代理類的方式,也有用ActionSupport的方式,但是我認(rèn)為這兩種方式無疑都有很強(qiáng)的侵入性和依賴性,這與Spring的思想有些矛盾。
我采用AutowiringRequestProcessor來做,這個(gè)類會(huì)自動(dòng)為你裝載你所需要的Service,根據(jù)其Java Doc的提示,其默認(rèn)是byType匹配的,當(dāng)然你也可以用byName的方式,我認(rèn)為以Type的方式就OK了。來看看兩個(gè)配置文件吧,先來看看Struts的配置文件struts-config.xml:
1 <? xml version="1.0" encoding="UTF-8" ?>
2 <! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd" >
3
4 < struts-config >
5 < form-beans >
6 < form-bean name ="loginForm" type ="com.***.ssh.view.login.LoginForm" />
7 </ form-beans >
8
9 < global-exceptions />
10 < global-forwards />
11 < action-mappings >
12 < action name ="loginForm" path ="/login" scope ="request"
13 type ="com.***.ssh.view.login.LoginAction" validate ="false" />
14 </ action-mappings >
15
16 < controller
17 processorClass ="org.springframework.web.struts.AutowiringRequestProcessor" />
18
19 < message-resources parameter ="ApplicationResources" />
20 </ struts-config >
21
22
這個(gè)文件中可以發(fā)現(xiàn),跟沒有與Spring集成時(shí)就一點(diǎn)不一樣,多了一行:
<controller processorClass="org.springframework.web.struts.AutowiringRequestProcessor" />
再來看看Spring的配置文件applicationContext.xml:
1 <? xml version="1.0" encoding="UTF-8" ?>
2 <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
3
4 < beans >
5
6 < bean id ="SSHSessionFactory"
7 class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
8 < property name ="configLocation" >
9 < value > classpath:hibernate.cfg.xml </ value >
10 </ property >
11 </ bean >
12
13 < bean name ="LoginService"
14 class ="com.***.ssh.biz.login.LoginService" singleton ="false" >
15 < property name ="dao" >
16 < ref bean ="UsersDao" />
17 </ property >
18 </ bean >
19
20 < bean id ="UsersDao" class ="com.***.ssh.persistence.UserDao" >
21 < property name ="sessionFactory" >
22 < ref bean ="SSHSessionFactory" />
23 </ property >
24 </ bean >
25 </ beans >
26
這里面也沒有多余的內(nèi)容,不會(huì)出現(xiàn)代理方式時(shí),多份XML同時(shí)配置的問題,減少了維護(hù)量。
同時(shí),你會(huì)發(fā)現(xiàn),我并沒有把Hibernate的具體配置放在這里面,而是用Hibernate自身的配置來管理。
這樣的話,我們?nèi)龑又g的依賴性會(huì)降到較低,兩頭可以任意換到其中的某一層。
順便要說的是,常見的書籍上面發(fā)現(xiàn)往往不會(huì)有如此深入的探討,難道是怕初學(xué)者看不懂嗎?
另外,對(duì)于一個(gè)架構(gòu)來說,要解決的問題決不是指這些,通常我們可以采用RUP的4+1視圖的方法去考慮架構(gòu)的方方面面。我們也可以從以下一些方面來各個(gè)擊破:安全性,數(shù)據(jù)輸入輸出的校驗(yàn)與轉(zhuǎn)換,國際化,LOG,異常處理,異構(gòu)系統(tǒng)整合,后臺(tái)運(yùn)行程序等等。如果是多個(gè)數(shù)據(jù)庫,我們還需要更多的考慮事務(wù)控制。
我想我后面會(huì)去完善這個(gè)整合,并實(shí)現(xiàn)一個(gè)Demo,作為小的簡單的項(xiàng)目快速開發(fā)的基礎(chǔ)。
整合時(shí)遇到過如下問題:
問題1:啟動(dòng)時(shí)出現(xiàn) “嚴(yán)重: Error listenerStart ”
這個(gè)問題,網(wǎng)上有很多解決辦法:
有一種最簡單的解決辦法是把用Listener初始化Spring改為用Servlet初始化Spring,但這樣的方法不太好,一是沒有找到根源,二是可能會(huì)帶來新的問題。
比較好的一種解決辦法是,加上Log4J的相關(guān)配置,然后再啟動(dòng)時(shí),就會(huì)出現(xiàn)各類詳細(xì)信息,這樣可根據(jù)具體信息再來解決,一般可能是DataSource配置,或環(huán)境配置有問題。
參考網(wǎng)址:http://hi.baidu.com/xht314/blog/item/808ecf13c1dd1820dd5401af.html
問題2:遇到“Required extension qdox not found”這樣的提示
網(wǎng)上也有解答,我用的方法是直接把commons-attributes-compiler.jar這個(gè)包去掉。當(dāng)然如果你要用到這個(gè)包的話,可以參考下面這個(gè)地址:
http://hi.baidu.com/sky_lei/blog/item/77ee17085543b232e8248824.html
問題3:Struts包與Spring包沖突的問題
我遇到包有沖突,換成Struts需要的優(yōu)先就OK了,現(xiàn)在的JAR檔越來越麻煩了,很多項(xiàng)目的JAR檔都被開發(fā)人員搞得亂七八糟,看來Maven是個(gè)好東西,至少思想是好的,可能下一步需要研究一下。
您可能感興趣的文章:
- SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊
- SSH框架網(wǎng)上商城項(xiàng)目第3戰(zhàn)之使用EasyUI搭建后臺(tái)頁面框架
- ssh項(xiàng)目環(huán)境搭建步驟(web項(xiàng)目)
- java-SSH2實(shí)現(xiàn)數(shù)據(jù)庫和界面的分頁
- Java框架SSH結(jié)合Easyui控件實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)示例解析
- SSH框架網(wǎng)上商城項(xiàng)目第25戰(zhàn)之使用java email給用戶發(fā)送郵件
- Java實(shí)現(xiàn)SSH模式加密
- Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記
- MyEclipse整合ssh三大框架環(huán)境搭載用戶注冊(cè)源碼下載
相關(guān)文章
Jsp+Servlet實(shí)現(xiàn)簡單登錄注冊(cè)查詢
這篇文章主要介紹了Jsp+Servlet實(shí)現(xiàn)簡單登錄注冊(cè)查詢,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09JSP開發(fā)中在spring mvc項(xiàng)目中實(shí)現(xiàn)登錄賬號(hào)單瀏覽器登錄
這篇文章主要介紹了JSP開發(fā)中在spring mvc項(xiàng)目中實(shí)現(xiàn)登錄賬號(hào)單瀏覽器登錄的相關(guān)資料,需要的朋友可以參考下2017-05-05JSP動(dòng)態(tài)輸出Excel及中文亂碼的解決
JSP動(dòng)態(tài)輸出Excel及中文亂碼的解決...2006-10-10jsp中將后臺(tái)傳遞過來的json格式的list數(shù)據(jù)綁定到下拉菜單select
后臺(tái)傳遞過來的json格式的list數(shù)據(jù)如何綁定到下拉菜單,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下2013-10-10JSP頁面中如何用select標(biāo)簽實(shí)現(xiàn)級(jí)聯(lián)
在JSP頁面中如何用select標(biāo)簽實(shí)現(xiàn)級(jí)聯(lián)呢?以下小編就為大家介紹實(shí)現(xiàn)方法,需要的朋友可以參考下2013-07-07