也有些Web框架是直接設計出來的,很多Web框架在設計的時候也都借鑒了別的框架,吸取優點,修改不足,并根據自己的框架的定位,在特定方面有自己的發揮,形成了自己的特點,比如有的web框架追求的是松耦合性,層次,結構之間都不密切綁定,有的Web框架則追求敏捷性,強調約定而不是配置。
Java 的 Web框架雖然各不相同,但基本也都是遵循特定的路數的:使用Servlet或者Filter攔截請求,使用MVC的思想設計架構,使用約定,XML或 Annotation實現配置,運用Java面向對象的特點,面向抽象實現請求和響應的流程,支持Jsp,Freemarker,Velocity等視圖。
JSF
優點:
Java EE標準,這意味著有很大的市場需求和更多的工作機會
上手快速并且相對容易
有大量可用的組件庫
缺點:
大量的JSP標簽
對REST和安全支持不好
沒有一個統一的實現。既有SUN的實現,又有Apache的實現——MyFaces。
國內的OperaMasks還支持AJAX,以及有開發工具 支持
Spring MVC
優點:
對覆蓋綁定(overriding binding)、驗證(validation)等提供生命周期管理
與許多表示層技術/框架無縫集成:JSP/JSTL、Tiles、Velocity、FreeMarker、Excel、XSL、PDF 等
便于測試——歸功于IoC
缺點:
大量的XML配置文件
太過靈活——沒有公共的父控制器
沒有內置的Ajax支持
Stripes
優點:
不需要書寫XML配置文件
良好的學習文檔
社區成員很熱心
缺點:
社區比較小
不如其他的項目活躍
ActionBean里面的URL是硬編碼的
Struts 2
優點:
架構簡單——易于擴展
標記庫很容易利用FreeMarker或者Velocity來定制
基于控制器或者基于頁面的導航
缺點:
文檔組織得很差
對新特征過分關注
通過Google搜索到的大多是Struts 1.x的文檔
Tapestry
優點:
一旦學會它,將極大地提高生產率
HTML模板——對頁面設計師非常有利
每出一個新版本,都會有大量的創新
缺點:
文檔過于概念性,不夠實用
學習曲線陡峭
發行周期長——每年都有較大的升級
Wicket
優點:
對Java開發者有利(不是Web開發者)
頁面和顯示綁定緊密
社區活躍——有來自創建者的支持
缺點:
HTML模板和Java代碼緊挨著
需要對OO有較好的理解
Wicket邏輯——什么都用Java搞定
在Java的Web框架中,我使用過Struts1,Struts2,試用過Stripes,Wicket,了解過JSF,SpringMVC。以我使用的經驗,我覺得看一個Java Web框架應看看下面幾個方面:
1.設計理念
一個框架設計出來應該有一個基本的思路,它為什么要要被設計出來?有的框架的目標 就是提高效率,有的框架的目標的給用戶充分的選擇,有的框架的目標是充分了解實際需求,給用戶一個盡量合理的默認選擇,有的框架是要給使用者開發桌面程序的感覺。應該說,一個好的框架應該是實現了預期目標,體現出了自己的設計理念的。
2.設計的合理性
設計的合理性表現在框架在一些關鍵問題上的處理,比如靈活性和敏捷性之間的權衡,硬編碼和文本配置之間的權衡。靈活性指的是可以適應用戶多樣的需求,很特殊的要求也能得到支持,有的框架的實現基于太多的約定,使得用戶只能遵循。而敏捷性指的是用戶在解決絕大多數常規問題的時候,能盡量少做工作,提高效率。框架設計者只能在這兩者見達到一個平衡點,權衡的怎么樣,就很見水平了。硬編碼和文本配置之間的權衡也很有意思,文本配置的意義在于Java是一個編譯語言,強調代碼的封閉,講究擴展而不是修改,這種情況下文本配置信息可以很方便的在不修改程序的情況下改變程序行為,但是隨著一些靈活的腳本語言實現的 Web框架的出現,人們發現在這樣的框架中,腳本語言即做程序編碼語言,也做配置語言,還做視圖上的標記語言,這使我們對Java實現的框架有了一番新的審視,既然配置文件并沒有消除對程序的修改,為什么不能在應編碼上下下功夫呢?
3.設計的平衡性
設計的平衡性指的是,框架在設計流程中各階段,各層次的實現方式時,所達到的上述權衡(靈活性和敏捷性之間的權衡等)應該是具有一致的水平。一個在控制上過分靈活,而視圖上具有非常大限制的框架是不能算做一個好的框架的。
4.框架真的解放了開發者嗎
框架的目的是讓開發者把更多的精力放在領域問題,而非Web的請求和響應的處理問題上。而事實上框架都做到這一點了嗎?不可否認,框架的使用提高代碼的可維護性,但是框架在解放開發者這點上就未必了,有時還給開發者帶來了額外的負擔。事實上,直接使用Servlet,只要維持好代碼風格,一樣可以很有效率,當然,直接使用Servlet的靈活性就不用說了。
在我接觸的Web框架中,我最推崇的是Struts2,設計優雅,偏重靈活,也基本不造成額外的負擔,當然這些評價是和我參與的項目的規模有關的,其他規模的項目Struts2就未必合適了。我希望Struts2能在下面幾個方面有些改善:
1.在提供文本配置方式的基礎上給一個約定配置的方式,讓開發者在大多數情況下可以不配置。
2.配置也支持硬編碼,因為有時候維護可修改的硬編碼是很有效率的。
3.在攔截請求上,能借鑒下ROR,Django的思路,適應新的Url的需求,考慮大家對“?”后添加屬性的回避,支持帶占位符的Url。