隨筆-193  評論-715  文章-1  trackbacks-0

          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"
          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

          這個文件中可以發現,跟沒有與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"
          ?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

          這里面也沒有多余的內容,不會出現代理方式時,多份XML同時配置的問題,減少了維護量。
          同時,你會發現,我并沒有把Hibernate的具體配置放在這里面,而是用Hibernate自身的配置來管理。

          這樣的話,我們三層之間的依賴性會降到較低,兩頭可以任意換到其中的某一層。

          順便要說的是,常見的書籍上面發現往往不會有如此深入的探討,難道是怕初學者看不懂嗎?
          另外,對于一個架構來說,要解決的問題決不是指這些,通常我們可以采用RUP的4+1視圖的方法去考慮架構的方方面面。我們也可以從以下一些方面來各個擊破:安全性,數據輸入輸出的校驗與轉換,國際化,LOG,異常處理,異構系統整合,后臺運行程序等等。如果是多個數據庫,我們還需要更多的考慮事務控制。

          我想我后面會去完善這個整合,并實現一個Demo,作為小的簡單的項目快速開發的基礎。



          整合時遇到過如下問題:
          問題1:啟動時出現 “嚴重: Error listenerStart ”
          這個問題,網上有很多解決辦法:
          有一種最簡單的解決辦法是把用Listener初始化Spring改為用Servlet初始化Spring,但這樣的方法不太好,一是沒有找到根源,二是可能會帶來新的問題。
          比較好的一種解決辦法是,加上Log4J的相關配置,然后再啟動時,就會出現各類詳細信息,這樣可根據具體信息再來解決,一般可能是DataSource配置,或環境配置有問題。
          參考網址:http://hi.baidu.com/xht314/blog/item/808ecf13c1dd1820dd5401af.html

          問題2:遇到“Required extension qdox not found”這樣的提示
          網上也有解答,我用的方法是直接把commons-attributes-compiler.jar這個包去掉。當然如果你要用到這個包的話,可以參考下面這個地址:
          http://hi.baidu.com/sky_lei/blog/item/77ee17085543b232e8248824.html

          問題3:Struts包與Spring包沖突的問題
          我遇到包有沖突,換成Struts需要的優先就OK了,現在的JAR檔越來越麻煩了,很多項目的JAR檔都被開發人員搞得亂七八糟,看來Maven是個好東西,至少思想是好的,可能下一步需要研究一下。

          posted on 2007-11-28 19:17 Robin's Programming World 閱讀(3051) 評論(9)  編輯  收藏 所屬分類: Java

          評論:
          # re: 搭建SSH時的思考和遇到的幾個問題 2008-03-18 17:21 | jetty_xiang
          這個方法看來很好,我以前沒有用過,以前一直用的整合方法是你前面介紹的兩種,不過我想問你問題,你的這個< controller
          processorClass="org.springframework.web.struts.AutowiringRequestProcessor" /> 跟< controller
          processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />好象是同有個道理,  回復  更多評論
            
          # re: 搭建SSH時的思考和遇到的幾個問題 2008-03-19 14:31 | Robin's Java World
          @jetty_xiang
          對,你說得沒錯,原理是一樣,實現的方式不一樣而已。  回復  更多評論
            
          # re: 搭建SSH時的思考和遇到的幾個問題 2008-04-06 13:29 | xx
          用AutowiringRequestProcessor是不是就不用寫beans.xml了?
          自動給action里面的xxxService賦值?  回復  更多評論
            
          # re: 搭建SSH時的思考和遇到的幾個問題 2008-04-10 02:25 | Robin's Java World
          @xx
          不太清楚你的beans.xml里面寫的些什么,所以不好回答。
          但在Action中,其***Service是自動獲得實例的,不用再去做任何配置或編寫代碼。這點是可以肯定的。
            回復  更多評論
            
          # re: 搭建SSH時的思考和遇到的幾個問題 2008-04-10 17:28 | xx
          我說的beans.xml就是action的真實type
          我是按照IBM的一篇文章配置的,用時struts插件。
          struts里面的action type寫的是org.springframework.web.struts.DelegatingActionProxy。
          把真實的type寫在在beans.xml里。
          增加一個action,就要在beans.xml里面多寫一個。
          用了你的方法就少些一步了。  回復  更多評論
            
          # re: 搭建SSH時的思考和遇到的幾個問題 2008-04-11 00:05 | Robin's Java World
          @xx
          明白了,就是我說的第一種用代理的方式。
          這樣做我覺得不僅是配置文件多一個的問題,而且與Struts也綁死了。  回復  更多評論
            
          # re: 搭建SSH時的思考和遇到的幾個問題 2008-06-05 16:42 | 歐小雷
          不知你是javaeye網站的那個robin嗎?你那個想法,在Spring in aciton中有描述,與< controller
          processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />是一個道理,不過可以問你問題嗎?ssh整合中聲明式事務的代碼我理解,可是在eclipse中能自動添加嗎?能否給我一個文檔,里面有詳細操作,謝謝.我的郵箱:ouxiaolei_niu@tom.com  回復  更多評論
            
          # re: 搭建SSH時的思考和遇到的幾個問題 2008-06-06 17:41 | Robin's Java World
          @歐小雷
          javaeye的那個牛人是robbin,我是Robin。
          DelegatingRequestProcessor和AutowiringRequestProcessor還是有些區別的。
          聲明式的事務管理就是在XML配置文件中進行一些配置,所以不需要自動添加什么代碼,目前也沒有什么工具可以自動加什么配置,所以也沒有什么文檔可以發給你,不好意思啦。  回復  更多評論
            
          # 我有個SSH的怪問題, 2008-12-31 22:13 | 式樣
          我總共有5張表,其中 一張表,能冊能增加能修改,就是不能查詢啊,
          其它表增冊查改都正常?  回復  更多評論
            
          主站蜘蛛池模板: 唐山市| 门源| 托克逊县| 绥宁县| 盐城市| 抚宁县| 崇信县| 怀宁县| 高台县| 台州市| 岚皋县| 闻喜县| 汝阳县| 广灵县| 利辛县| 襄城县| 屯昌县| 肥乡县| 当涂县| 蒙城县| 寿光市| 修水县| 林口县| 新民市| 延庆县| 新平| 道孚县| 措勤县| 黎川县| 武邑县| 曲阳县| 云林县| 武山县| 宝兴县| 新邵县| 高雄县| 慈利县| 塘沽区| 芦溪县| 枣阳市| 塔城市|