SSH流行很久了,一直看到官方文檔和網上都在講如何整合SSH,討論各種整合的優缺點。今天我比較閑,也用我的一些想法來試著整合這三個最流行的框架。
本次所用版本為:Struts 1.3.9 Spring 2.5 Hiberante 3.2
開發工具和環境為:Eclipse 3.3+MyEclipse 6.0+JBoss 4.2+Tomcat
用SSH時,我們的架構自然就會分成三層,即表現層,邏輯層和持久層,按照Martin Flower的指導思想,耦合越少越好,下層為上層提供服務,這也是Rod開發Spring的指導思想之一,所以我首先想到的就是如何減少到最低的耦合。
根據Spring 2.0官方文檔中推薦的做法,Spring與Struts1.x集成,有采用代理類的方式,也有用ActionSupport的方式,但是我認為這兩種方式無疑都有很強的侵入性和依賴性,這與Spring的思想有些矛盾。
我采用AutowiringRequestProcessor來做,這個類會自動為你裝載你所需要的Service,根據其Java Doc的提示,其默認是byType匹配的,當然你也可以用byName的方式,我認為以Type的方式就OK了。來看看兩個配置文件吧,先來看看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"
13type ="com.***.ssh.view.login.LoginAction" validate ="false" />
14</ action-mappings >
15
16< controller
17processorClass ="org.springframework.web.struts.AutowiringRequestProcessor" />
18
19< message-resources parameter ="ApplicationResources" />
20 </ struts-config >
21
22
這個文件中可以發現,跟沒有與Spring集成時就一點不一樣,多了一行:
<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"
7class ="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"
14class ="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
這里面也沒有多余的內容,不會出現代理方式時,多份XML同時配置的問題,減少了維護量。
同時,你會發現,我并沒有把Hibernate的具體配置放在這里面,而是用Hibernate自身的配置來管理。
這樣的話,我們三層之間的依賴性會降到較低,兩頭可以任意換到其中的某一層。
順便要說的是,常見的書籍上面發現往往不會有如此深入的探討,難道是怕初學者看不懂嗎?
另外,對于一個架構來說,要解決的問題決不是指這些,通常我們可以采用RUP的4+1視圖的方法去考慮架構的方方面面。我們也可以從以下一些方面來各個擊破:安全性,數據輸入輸出的校驗與轉換,國際化,LOG,異常處理,異構系統整合,后臺運行程序等等。如果是多個數據庫,我們還需要更多的考慮事務控制。
我想我后面會去完善這個整合,并實現一個Demo,作為小的簡單的項目快速開發的基礎。
整合時遇到過如下問題:
問題1:啟動時出現 “嚴重: Error listenerStart ”
這個問題,網上有很多解決辦法:
有一種最簡單的解決辦法是把用Listener初始化Spring改為用Servlet初始化Spring,但這樣的方法不太好,一是沒有找到根源,二是可能會帶來新的問題。
比較好的一種解決辦法是,加上Log4J的相關配置,然后再啟動時,就會出現各類詳細信息,這樣可根據具體信息再來解決,一般可能是DataSource配置,或環境配置有問題。
參考網址:
問題2:遇到“Required extension qdox not found”這樣的提示
網上也有解答,我用的方法是直接把commons-attributes-compiler.jar這個包去掉。當然如果你要用到這個包的話,可以參考下面這個地址:
問題3:Struts包與Spring包沖突的問題
我遇到包有沖突,換成Struts需要的優先就OK了,現在的JAR檔越來越麻煩了,很多項目的JAR檔都被開發人員搞得亂七八糟,看來Maven是個好東西,至少思想是好的,可能下一步需要研究一下。
新聞熱點
疑難解答