21 August 2005

這幾天搞 Framework 搞到頭昏了,連作夢都會夢到 framework....

Struts 用了一段時間,也摸的差不多了... 缺點說來還真是多... 長久以來,一直想找新的解決方案取代它:一個內建 AJAX、更加簡單、好寫測試的 web framework。JSF 我從一開始就沒有考慮了,原因是它的背景、條件、開發方式、都很像 EJB -- 一個失敗的 standard。而且 JSF 出了這麼久,也沒看到有什麼跟 Unit Test 的東西。再來是 WebWork 和 Spring MVC,這兩個我沒用過,只看了一些文章... 但是呢,這兩個骨子裡還是 request-based 的,跟 struts 沒啥兩樣,頂多簡潔一點、彈性多一點而已,開發者還是要煩惱一些 request/session/url 什麼的。下個候選是 Tapestry,它是 component-based,而且已經很成熟了,但也開始有了一些包袱。我曾經在一個個人的專案中用過... 還不錯用啦,不用再去想那些 URL 之類的問題,page persistence 的功能蠻強大。不過他比 Struts 複雜許多,非常的難學... (它是我學過最難的 framework... 比 Hibernate 還難) 而它的 page 都是 abstract 的,以測試角度來看這是很差的practice... 光是難學這項,就沒辦法在 team 裡面推廣了,以後找人維護也很困難。剩下的 framework,像是 echo 之類的,這些 framework 發展有好一段時間了,但使用人數一直沒有上來,也一直沒有書藉... 因此完全不納入考慮。

那麼還有什麼選擇呢?難道一定要用 JSF 嗎?儘管我不大願意見到 JSF 大流行 (只會苦了我們這些開發人員)但由於它是 standard,Java EE 5.0 也納入 JSF 1.2 了... 它未來很有可能會取代 Struts。拿它來跟 EJB 的經驗相對照 -- 以現在的技術眼光來看,EJB 是失敗的,但從另一方面來看,EJB 也是一大堆人和產品在用。JSF 會不會也是個失敗,但是大家一窩蜂靠攏的技術呢?若單單考慮生涯規畫的問題,採用 JSF 對 team 的成員來說是比較好的。試想,同時擁有 Struts 和 JSF 的實戰經驗,在職場上應該算很吃香 (指 java 方面的工作)。話說回來,從 Struts, Hibernate 和 Spring 的成功模式來看,似乎草根式起家的 open source 才是未來真正的主流。

草根式的 open source framework 中,有誰能對抗 JSF 呢?真是傷透腦筋啊...

我找到了一個候選,可能算是最後一個機會吧 -- WicketTheServerSide有一些相關的討論。這是一個 component-based framework,跟 Tapestry/JSF 最大的差異就是它完全不用寫 xml,只要 html + java 兩個檔案就能搞定一個網頁。它吸收了很多 Tapestry 的觀念,但是簡化非常非常多。現在 Wicket 的文件很缺乏,但原作者群算很有心在推這個專案,知道 open source 成功的關鍵之一是在文件上,目前一直在趕工中。而有沒有人在用這個framework?在這個 Java web framework 氾瀾的年代,算是有點能見度了,它的Mailing List 有不少人在討論。Unit Test 方面,作者群是回我有特殊的測試方案啦... 我找了很久還沒找到實際的範例。不過應該不會太難,畢竟 wicket 的 component 全部都是 java code。而 AJAX 方面,目前 1.1 版已經有實驗性的 component 可用。跟Spring 的整合現在已經有了,但作者群還沒有作最後的定案,最近打算重新討論。

昨天一整天一直在試這個新玩意,後來也完成了一個 CRUD 的小程式,而且還包含 validation/ 分頁 sorting / i18n 等等功能。雖然還有很多細部的東西還沒搞懂,整體來看它的學習曲線很短,如果要替 Team 成員訓練,我想兩天就很足夠。它的優點就不提啦,就是 Wicket 首頁裡講的那些。講講昨天使用發現的缺點吧:

  • html 上的和 java code 裡兩邊都要寫個 String 的 component id,而且要兩邊寫的要一模一樣,常常會有一邊寫錯。Duplicate Hard Code String 怎麼樣都不算是個好 practice。
  • Validation 的 java code 太過複雜,如果真要用的話,大概還要寫個 Util 來簡化吧…
  • 跟 Swing 一樣,是 Component based。自然地,也跟 Swing 一樣會有一大堆 inner class。java 基礎不好的人學起來有點累。
  • 基本上它是 page-oriented 的架構,page 所有的元件都寫在 java code 裡。如果要找哪一個 page 會走到哪個 page 時,就要去 java code 裡挖... 但偏偏又是一大堆 inner class... 有時真的搞不大清楚整個流程是怎麼走的... 相對於 Struts 這種以 Controller 為主題的設計,從 struts-config 就可以很清楚看出網頁的 flow,wicket 網頁的流程控管算是比較弱一點... 真是有得必有失啊。

雖然有這些缺點,個人還是把最後的希望放在它身上,畢竟優點還是很吸引人。如果文件齊了,Test 也能寫了,就找個小專案實際試試。


回響

可以用 Tag <I>、<B>,程式碼請用 <PRE>