天天看點

使用AppFuse架構進行開發的總結

AppFuse是一個內建了目前最流行的Web應用架構的一個更高層次的Web開發架構,也可以說是一個Web開發基礎平台,它與它所內建的各種架構相比,它提供了一部分所有Web系統開發過程中都需要開發的一些功能,如登陸、使用者密碼加密,使用者管理、根據不同的使用者可以展現不同的菜單,可以自動生成40%-60%左右的代碼,自帶了預設的一些在CSS中設定的樣式,使用這些樣式能很快的改變整個系統的外觀,還有自動化測試的功能。

它最大的價值就是為我們提供了一個Web開發的新的方式和思路,盡管這些技術在國外都已進很流行了,但在國内能夠将Hibernate、Struts、Spring、DBUnit、Ant、Log4J、Struts Menu、Xdoclet、SiteMesh、Velocity、JUnit、JSTL、WebWork這些技術內建到一個架構中的還不多見,是以即使不使用它的全部功能,它也給我們提供了一個很好的借鑒、學習的機會。

通過關注AppFuse,我們可以看到目前國外的主流開發都使用了哪些技術,開發方式是什麼樣的,可能達到什麼樣的結果,而在以前,是很少能夠看到這樣完整的例子的。

AppFuse的另一個啟示是:我們可以依靠開源軟體的功能降低開發成本,而且可以閱讀開源軟體的代碼提高所在團隊的整體實力。

AppFuse的作者 matt raible是當今開源世界一個比較活躍的開發者,它是AppFuse、Struts Menu的作者,也是XDoclet、DisplayTag等一些著名開源項目的積極參與者,《Hibernate In Action》的作者就在感謝的名單裡面提到他,XDoclet的下載下傳版本中所帶的Hibernate标簽部分的例子就是他寫的,他還是2004年Apache技術年會的主講人之一。(這些都是我這2個多月來搜集到的,呵呵)

但是通過2個月的實際學習和使用,我也遇到一系列的問題,因為AppFuse是将其他的一些類庫或者架構內建在一起的,內建的技術衆多,而且有一些技術在國内甚至很少有人知道,資料也比較少,是以雖然作者經過了一些測試,但都是基于英文編碼的,而對于中文編碼來說,還潛在的存在着一些問題,雖然不是AppFuse的問題,但卻降低了開發速度,下面是我在開發過程中遇到過的問題,有些解決了,有些還沒有解決:

一.Struts

1. AppFuse中預設的MVC架構是Struts,而且使用的是LookupDispatchAction,并且使用的是按鈕(button),在XP下用IE浏覽效果還可以,但如果在2000或者98下,就使外觀很難看,而且當時我還遇到一個問題:如果按鈕顯示中文,則在DisplayTag中翻頁失靈,而且報錯,後來我把BaseAction的相關方法改變了,才可以使用,因為國内的客戶都比較重視界面,是以後來我将那些按鈕都改成圖檔了,當然也要添加一些方法了,有點麻煩!

2. Struts中的标簽如今推薦使用的隻有html部分的标簽了,其他的标簽或者可以使用JSTL替代,或者已經不推薦使用了,而且AppFuse中推薦使用JSTL,而JSTL和struts的标簽的聯合使用時,需要的不是<标簽>,而是<标簽>,這個問題曾經困擾了我整整2天。

3. Struts的Validation的校驗規則并不完善,比如如果使用用戶端的javascript校驗,則在郵箱中輸入漢字根本校驗不出來,到了伺服器端報錯。

4. 最嚴重的問題是AppFuse生成的Struts的validation.xml檔案中有許多多餘的“.”,如果你去掉了,常常在執行ant的deploy任務時又恢複原樣。這樣是送出表單的時候經常會報javascript的腳本錯誤或者缺少對象或者缺少value,是以我會手工的修改這個檔案,然後把修改後的檔案備份,當重新生成有錯誤的檔案時,我會用備份的沒有錯誤的檔案去覆寫。

5. Struts的validatioin對于使用同一個FormBean的Action的校驗方式比較複雜。(待解決)。

二.Hibernate

1. Hibernate是現在受到越來越多的人推崇的一個ORM工具(架構、類庫),它将我們從繁瑣的使用JDBC的開發過程中解放出來,但同時也帶來了新的問題,如學習曲線,執行效率,資料庫設計優化,還有最重要的靈活性。Hibernate不是一個很容易上手的東西,要完全駕馭它還需要讀很多資料,但好的資料卻很少。

2. 使用Xdoclet可以很友善的生成Hibernate中的持久類的配置檔案(*.hbm.xml),但對一些特殊的映射卻無能為力,如使用序列的id生成規則,序列的名字沒有地方寫,是以也隻好先利用它生成主要的内容,然後手工修改。

3. 同樣還是id的生成政策問題,如果使用序列、hilo等需要一些資料庫機制支援的政策時,schemaExport并不能自動生成序列或者儲存目前id的表,這項工作仍然要手工解決。

4. Hibernate中提供了幾種關聯,一對一、一對多、多對多,但對于怎樣調整效率卻沒有一個很明确的提示,還要根據情況判定,這就帶來和一些彈性的設計。

5. Hibernate中可以選擇的操作資料庫的方式有3種,其中HQL功能最強大,但有些功能使用标準查詢可能會更友善,但會有一些限制,是以雖然它很靈活,但易用性不如JDBC好。

三.Spring

在AppFuse的過程中,Spring完全隐藏在幕後,除了一些配置外,幾乎感覺不到它的存在,是以我在使用它的過程中并沒有遇到什麼麻煩,這裡隻是簡單的介紹一下它在AppFuse中起到的作用。

1. Spring在AppFuse中起到的主要作用是對Hibernate的Session和事務的管理,利用Spring封裝的Hibernate模闆類,我們大大地減少了實作DAO的代碼行數。

2. Spring還起到了連接配接映射檔案和類之間的關聯,及接口和實作類之間的關聯,這些都依賴于Spring的IoC的機制的實作。

3. 對于字元進行編碼和解碼部分用到了Spring自帶的Filter,隻需要在配置檔案中配置就好了。

四.SiteMesh

SiteMesh是一個基于Decorator模式的技術,它可以修飾傳回的網頁檔案,它的工作方式受到越來越多的人的推崇,這點從Manning出版的一些技術書籍中可以看出來。

我在使用SiteMesh的過程中并不順利,我參考了《Java Open Source Programming》,這本書中說SiteMesh在預設的情況下不對下載下傳檔案進行裝飾,但我在下載下傳檔案時發現,我的檔案内容被丢棄了,取而代之的是SiteMesh的模闆的内容,後來我通過修改SiteMesh的配置檔案解決了這個問題,但感覺還有一些不太清楚的地方需要學習。

五.DisplayTag

DisplayTag是一個優秀的顯示内容的标簽,從SourceForge的通路量來看,它是很活躍的項目,僅次于Ant、Hibernate、Xdoclet等幾個著名的項目,我總結,它的主要功能有4項:顯示、分頁、排序、将顯示的資料寫入指定類型的檔案中,然後下載下傳。

1. 據我使用的情況看,我隻使用了分頁和顯示的功能,因為當時我沒有很好的解決中文編碼的問題,是以排序會有問題,直到昨天,我在朋友的幫助下解決了這個問題,至此我可以放心使用的功能又增加了排序(我昨天簡單的測試了一下是可以的)。

2. 但對于将顯示的内容生成到一個指定格式的檔案中的功能卻有着很多缺陷,如:

(1) 生成的檔案中隻有顯示的資料,那些沒有顯示在界面上的的資料,則不會被寫到檔案中。

(2) 如果修改了DisplayTag的顯示的内容,比如添加一列,在這列中的内容不是字元,而是HTML的标簽,則生成的檔案隻有這些HTML标簽,而沒有資料。

(3) 即使DisplayTag中沒有我們定制的HTML腳本,生成的檔案偶爾也有問題,比如:它會把“007”生成為“7”,把字元串自動的轉換為整型值。有時候還生成空白内容的檔案。

(4) DisplayTag生成的Excel檔案相容性不好,有時在Excel2003中不能正常打開,或者在XP下打開報錯。

後來,我看了作者寫的《Spring Live》,書中說如果想實作穩定的Excel,推薦使用POI,于是我使用POI生成Excel,穩定性和相容性都不錯。

六.DBUnit

DBUnit是一個可以被Ant內建的向資料庫中添加資料和備份資料的一個類庫,配置很友善,因為AppFuse已經內建好了,是以使用也很容易。

但是如果你使用EditPlus之類的工具手工修改了AppFuse生成的内容,則執行Ant的setup、setup-db或者deploy的任務時,常常報錯,說無效的格式,這是因為這個被手工修改的檔案再次被AppFuse執行後,它的第一行的檔案聲明的前幾個字母是無效的,是因為本地的字元集編碼的原因而引起了亂碼,如果把這幾個無效的字母去掉,問題就解決了。

七.Struts Menu

Struts Menu也是AppFuse的作者開發的一個開源軟體,它可以根據配置檔案讀取目前使用者可以使用的功能菜單,這個功能是我一直以來都想要的,我也找到了一些代碼,但實作的都不如這個完善,沒什麼好說的,使用簡單,配置容易,很好的解決了我的問題。

問題是我隻使用了AppFuse提供的2個角色,對于多個角色的實驗我還沒有做。

八.XDoclet

在AppFuse中,使用Xdoclet生成了幾乎一切的配置檔案:Struts-config.xml、web.xml、validation.xml、*.hbm.xml等檔案,如果使用AppGen的話,還會生成更多的檔案,這一切都是使用Xdoclet實作的。

問題是我在Struts部分提到的,生成的Validation.xml檔案中會多生成一個“.”,另外在生成資源檔案時也會多生成一個“.”,目前我沒有很好的閱讀這段代碼,不知道是不是Xdoclet的問題。

九.Ant

Ant并沒有什麼問題,但在執行作者寫的Ant任務的時候,有一些任務不能正常執行,比如,運作模拟對象測試的任務,作者也在1.7版本的修複清單中提到以前版本有些ant任務不能執行,在1.7中修改了一些ant任務,使他們能夠正常的執行了。

實際上,我們如果使用AppGen進行開發的話,使用的任務一般不超過8個。

十.JSTL

JSTL是個好東西,我常用的有和部分的标簽,但是如果使用JSTL進行邏輯判斷,我并沒有感覺比使用JSP的代碼塊優雅多少。另外,熟悉JSTL也需要一段時間,我就經曆了面對着JSP頁面不知道該怎麼寫JSTL文法的困境。當然,AppFuse中使用的基本都是JSTL,包括向DisplayTag傳遞顯示的資料,使用的都是JSTL文法,這方面的資料挺多,我參考的是電子工業出版社出的《JSP2.0技術》,說的很詳細。

十一.Tomcat

你也許會說:“Tomcat就不用說了吧?”,是的,Tomcat一般都會使用,但是?D?D?D?D?D?D?D?D?D?D?D?D?DTomcat5和Tomcat4.X對于中文編碼使用了不同的機制,這個問題困擾了我好久,我解決了頁面上寫入漢字顯示亂碼的問題,我也曾經以為DisplayTag對漢字不能排序,也不能正常分頁是因為DisplayTag的開發者都是老外,是因為他們沒有考慮中文的關系的原因。

直到昨天,我才知道這一切都是因為Tomcat5對漢字編碼的實作的方式和Tomcat4不一樣的原因,如果感興趣,可以看看這個文章: http://www.javaworld.com.tw/jute/post/view?bid=9&id=44042&sty=1&tpg=1&age=0

十二.Javascript

Javascript簡單易學,但想運用自如就不太容易了。AppFuse中嵌入了幾個js檔案,裡面包含了許多函數,值得我們好好的研究一下,比如,如果有一個必填字段沒有填寫,AppFuse會自動的聚焦在那個input上,類似的小技巧有很多,你可以自己去翻看。

但AppFuse自帶的Javascript腳本有一個Bug,就是當DisplatyTag中沒有可以顯示的資料時,你用滑鼠單擊,它會報Javascript錯誤,你仔細研究一下function highlightTableRows(tableId) 就知道了:我的解決辦法是在location.href = link.getAttribute("href");前面添加一行判斷:if (link != null)。

十三.資源檔案國際化

對于Struts和DisplayTag都涉及到資源檔案國際化AppFuse1.6.1很好的解決了Struts資源映射檔案國際化的問題,你隻需要在對應本國語言的資源檔案中寫入漢字,Ant中有一項執行native2ascii的任務,AppFuse自動的為你進行了資源檔案的編碼轉換,而對于DisplayTag的資源檔案問題,還要自己執行native2ascii指令,為了避免每次都輸入一串指令,我用Delphi寫了個小工具,可視化的選擇資源檔案,點選按鈕自動執行該指令,底層依賴于JDK。

經過2個多月的學習,我感覺這個架構非常不錯,它為我以後的項目開發指出了一個新的方向,但如果想很熟練的使用這個架構進行開發,至少要對以下幾種技術比較熟練:Struts(或者WebWork、Spring及其他的已經整合進來的MVC架構)、Hibernate(或者ibatis)、JSTL,當然其他的技術至少也要知道一點,否則遇到問題都不知道出在哪裡。

目前我還沒有解決的問題有:

1. 如何在翻頁的時候才讀取下面的資料?

2. 怎樣對使用同一個FormBean的多個Form進行用戶端校驗?

3. 怎樣優化Hibernate的效率?《Hibernate In Action》中提供了多種政策,有些時候應該使用lazy,有些時候應該使用outer-join。

4. 在什麼時機生成導出檔案?目前我是在查詢的Action中同時生成了導出檔案,否則,到了下一頁,我就不知道查詢條件了,當然,如果把拼裝後的HQL存儲在Session或者Hidden中也可以解決這個問題,但是這樣就破壞了DAO的封裝,要把DAO封裝後的HQL發送給Action,然後發送的到Web界面層,是以目前我還在猶豫生成導出檔案的時機選擇在哪裡?

5. 什麼時候應該自己擷取資料庫連接配接,執行native SQL?具體需要注意些什麼?

6. SiteMesh的模闆優化?

7. DisplayTag的底層實作?

每個問題都比較棘手,要一個一個解決!

這個架構的優點是:如果熟悉了開發流程,可以大幅度的提高開發速度,如果業務不是很複雜,使用AppGen可以生成60%左右的代碼,而且程式可維護性好,因為作者使用了多個設計模式對各個層面進行了封裝,是以不同的子產品代碼風格出奇的一緻,有利于開發人員快速上手,也有利于接收其他開發人員遺留的代碼。

轉載于:https://www.cnblogs.com/shili_cn/archive/2010/12/15/1906824.html