隨筆-193  評(píng)論-715  文章-1  trackbacks-0

          SSH流行很久了,一直看到官方文檔和網(wǎng)上都在講如何整合SSH,討論各種整合的優(yōu)缺點(diǎn)。今天我比較閑,也用我的一些想法來(lái)試著整合這三個(gè)最流行的框架。

          本次所用版本為:Struts 1.3.9???Spring 2.5???Hiberante 3.2
          開(kāi)發(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開(kāi)發(fā)Spring的指導(dǎo)思想之一,所以我首先想到的就是如何減少到最低的耦合。
          根據(jù)Spring 2.0官方文檔中推薦的做法,Spring與Struts1.x集成,有采用代理類的方式,也有用ActionSupport的方式,但是我認(rèn)為這兩種方式無(wú)疑都有很強(qiáng)的侵入性和依賴性,這與Spring的思想有些矛盾。
          我采用AutowiringRequestProcessor來(lái)做,這個(gè)類會(huì)自動(dòng)為你裝載你所需要的Service,根據(jù)其Java Doc的提示,其默認(rèn)是byType匹配的,當(dāng)然你也可以用byName的方式,我認(rèn)為以Type的方式就OK了。來(lái)看看兩個(gè)配置文件吧,先來(lái)看看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),跟沒(méi)有與Spring集成時(shí)就一點(diǎn)不一樣,多了一行:
          ?<controller??processorClass="org.springframework.web.struts.AutowiringRequestProcessor" />

          再來(lái)看看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

          這里面也沒(méi)有多余的內(nèi)容,不會(huì)出現(xiàn)代理方式時(shí),多份XML同時(shí)配置的問(wèn)題,減少了維護(hù)量。
          同時(shí),你會(huì)發(fā)現(xiàn),我并沒(méi)有把Hibernate的具體配置放在這里面,而是用Hibernate自身的配置來(lái)管理。

          這樣的話,我們?nèi)龑又g的依賴性會(huì)降到較低,兩頭可以任意換到其中的某一層。

          順便要說(shuō)的是,常見(jiàn)的書籍上面發(fā)現(xiàn)往往不會(huì)有如此深入的探討,難道是怕初學(xué)者看不懂嗎?
          另外,對(duì)于一個(gè)架構(gòu)來(lái)說(shuō),要解決的問(wèn)題決不是指這些,通常我們可以采用RUP的4+1視圖的方法去考慮架構(gòu)的方方面面。我們也可以從以下一些方面來(lái)各個(gè)擊破:安全性,數(shù)據(jù)輸入輸出的校驗(yàn)與轉(zhuǎn)換,國(guó)際化,LOG,異常處理,異構(gòu)系統(tǒng)整合,后臺(tái)運(yùn)行程序等等。如果是多個(gè)數(shù)據(jù)庫(kù),我們還需要更多的考慮事務(wù)控制。

          我想我后面會(huì)去完善這個(gè)整合,并實(shí)現(xiàn)一個(gè)Demo,作為小的簡(jiǎn)單的項(xiàng)目快速開(kāi)發(fā)的基礎(chǔ)。



          整合時(shí)遇到過(guò)如下問(wèn)題:
          問(wèn)題1:?jiǎn)?dòng)時(shí)出現(xiàn) “嚴(yán)重: Error listenerStart ”
          這個(gè)問(wèn)題,網(wǎng)上有很多解決辦法:
          有一種最簡(jiǎn)單的解決辦法是把用Listener初始化Spring改為用Servlet初始化Spring,但這樣的方法不太好,一是沒(méi)有找到根源,二是可能會(huì)帶來(lái)新的問(wèn)題。
          比較好的一種解決辦法是,加上Log4J的相關(guān)配置,然后再啟動(dòng)時(shí),就會(huì)出現(xiàn)各類詳細(xì)信息,這樣可根據(jù)具體信息再來(lái)解決,一般可能是DataSource配置,或環(huán)境配置有問(wèn)題。
          參考網(wǎng)址:http://hi.baidu.com/xht314/blog/item/808ecf13c1dd1820dd5401af.html

          問(wèn)題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

          問(wèn)題3:Struts包與Spring包沖突的問(wèn)題
          我遇到包有沖突,換成Struts需要的優(yōu)先就OK了,現(xiàn)在的JAR檔越來(lái)越麻煩了,很多項(xiàng)目的JAR檔都被開(kāi)發(fā)人員搞得亂七八糟,看來(lái)Maven是個(gè)好東西,至少思想是好的,可能下一步需要研究一下。

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

          評(píng)論:
          # re: 搭建SSH時(shí)的思考和遇到的幾個(gè)問(wèn)題 2008-03-18 17:21 | jetty_xiang
          這個(gè)方法看來(lái)很好,我以前沒(méi)有用過(guò),以前一直用的整合方法是你前面介紹的兩種,不過(guò)我想問(wèn)你問(wèn)題,你的這個(gè)< controller
          processorClass="org.springframework.web.struts.AutowiringRequestProcessor" /> 跟< controller
          processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />好象是同有個(gè)道理,  回復(fù)  更多評(píng)論
            
          # re: 搭建SSH時(shí)的思考和遇到的幾個(gè)問(wèn)題 2008-03-19 14:31 | Robin's Java World
          @jetty_xiang
          對(duì),你說(shuō)得沒(méi)錯(cuò),原理是一樣,實(shí)現(xiàn)的方式不一樣而已。  回復(fù)  更多評(píng)論
            
          # re: 搭建SSH時(shí)的思考和遇到的幾個(gè)問(wèn)題 2008-04-06 13:29 | xx
          用AutowiringRequestProcessor是不是就不用寫beans.xml了?
          自動(dòng)給action里面的xxxService賦值?  回復(fù)  更多評(píng)論
            
          # re: 搭建SSH時(shí)的思考和遇到的幾個(gè)問(wèn)題 2008-04-10 02:25 | Robin's Java World
          @xx
          不太清楚你的beans.xml里面寫的些什么,所以不好回答。
          但在Action中,其***Service是自動(dòng)獲得實(shí)例的,不用再去做任何配置或編寫代碼。這點(diǎn)是可以肯定的。
            回復(fù)  更多評(píng)論
            
          # re: 搭建SSH時(shí)的思考和遇到的幾個(gè)問(wèn)題 2008-04-10 17:28 | xx
          我說(shuō)的beans.xml就是action的真實(shí)type
          我是按照IBM的一篇文章配置的,用時(shí)struts插件。
          struts里面的action type寫的是org.springframework.web.struts.DelegatingActionProxy。
          把真實(shí)的type寫在在beans.xml里。
          增加一個(gè)action,就要在beans.xml里面多寫一個(gè)。
          用了你的方法就少些一步了。  回復(fù)  更多評(píng)論
            
          # re: 搭建SSH時(shí)的思考和遇到的幾個(gè)問(wèn)題 2008-04-11 00:05 | Robin's Java World
          @xx
          明白了,就是我說(shuō)的第一種用代理的方式。
          這樣做我覺(jué)得不僅是配置文件多一個(gè)的問(wèn)題,而且與Struts也綁死了。  回復(fù)  更多評(píng)論
            
          # re: 搭建SSH時(shí)的思考和遇到的幾個(gè)問(wèn)題 2008-06-05 16:42 | 歐小雷
          不知你是javaeye網(wǎng)站的那個(gè)robin嗎?你那個(gè)想法,在Spring in aciton中有描述,與< controller
          processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />是一個(gè)道理,不過(guò)可以問(wèn)你問(wèn)題嗎?ssh整合中聲明式事務(wù)的代碼我理解,可是在eclipse中能自動(dòng)添加嗎?能否給我一個(gè)文檔,里面有詳細(xì)操作,謝謝.我的郵箱:ouxiaolei_niu@tom.com  回復(fù)  更多評(píng)論
            
          # re: 搭建SSH時(shí)的思考和遇到的幾個(gè)問(wèn)題 2008-06-06 17:41 | Robin's Java World
          @歐小雷
          javaeye的那個(gè)牛人是robbin,我是Robin。
          DelegatingRequestProcessor和AutowiringRequestProcessor還是有些區(qū)別的。
          聲明式的事務(wù)管理就是在XML配置文件中進(jìn)行一些配置,所以不需要自動(dòng)添加什么代碼,目前也沒(méi)有什么工具可以自動(dòng)加什么配置,所以也沒(méi)有什么文檔可以發(fā)給你,不好意思啦。  回復(fù)  更多評(píng)論
            
          # 我有個(gè)SSH的怪問(wèn)題, 2008-12-31 22:13 | 式樣
          我總共有5張表,其中 一張表,能冊(cè)能增加能修改,就是不能查詢啊,
          其它表增冊(cè)查改都正常?  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 玛纳斯县| 都江堰市| 元阳县| 剑河县| 恩平市| 明光市| 浦县| 丰宁| 虹口区| 仙游县| 宜章县| 普兰县| 都匀市| 名山县| 德保县| 白水县| 广元市| 莱西市| 沂水县| 宁武县| 新源县| 乐都县| 万州区| 安陆市| 襄城县| 固原市| 稻城县| 方正县| 巴楚县| 抚松县| 区。| 泗阳县| 封开县| 尼勒克县| 崇明县| 丰城市| 商水县| 广饶县| 罗山县| 泰安市| 梁山县|