|
Struts |
JSF |
Tapestry |
ASP.NET |
Architecture |
跳轉模型 MVC |
跳轉模型 Front Controller+組件化編程 |
頁面模型 Page Controller+組件化編程 |
頁面模型 Page Controller+組件化編程 |
Programming Model |
業務邏輯: Struts1中需要繼承基類;Struts2是POJO的模型; 頁面邏輯: 有很不同實現,可以是JSP,也可以是通過模版引擎渲染。 |
業務邏輯: POJO的編程風格; 頁面邏輯: 主要是JSP,也可以用HTML風格。 |
業務邏輯: Taperstry4需要繼承基類;但Taperstry5就是POJO風格; 頁面邏輯: 普通的HTML。 |
業務邏輯: 需要繼承基類; 頁面邏輯: 類似JSP,但不同的是,該頁面實際是業務邏輯類的子類。 |
Request Process |
|
由官方定義的六個步驟組成; |
取決于Engine Service。 |
由官方定義的15個步驟組成。 |
Navigation |
Path和Action綁定,需要配置文件解析。 |
通過faces-config.xml配置文件完成。 |
URL是全局的,沒有額外的配置文件; 除非顯式跳轉,所以行為都在本Page上。 而跳轉分兩種: 1. DirectLink寫在頁面上 2. 在代碼邏輯中定義頁面跳轉邏輯。 |
同Tapestry類似。 |
Event handling |
無 |
頁面定義事件發起;兩種方式參數傳遞方式:一種分離傳遞;另一種通過FacesContext。 |
頁面定義事件發起;直接賦予參數,沒有參數個數限制;除此外還有內置的生命周期相關的event |
類似Swing的事件控制方式。 |
Component State |
無 |
沒有狀態維護機制,每次request都從建組件。 |
提供組件狀態的維護機制。 |
提供組件狀態的維護機制。 |
Component Dev |
無 |
基于JSP Tag的開發方式。 |
開發方式類似Page, 邏輯代碼和頁面分離,頁面輸出使用HTML。 |
開發方式類似Page;邏輯代碼和頁面分離;頁面輸出可以復用已有的組件 |
View |
有很不同實現,可以是JSP,也可以是通過模版引擎渲染。 |
主要是JSP,也可以用HTML風格。 |
HTML |
類似JSP頁面。 |
Validation and Conversion |
|
提供了多種方式支持,但客戶端驗證支持不好,同時在form一級的支持不好,通常需要項目自己定制。 |
同樣提供多種方式支持;此外提供客戶端的Validation;天然地支持form一級支持。 |
類似Tapestry。 |
I18N |
較好的支持。 |
較好的支持。 |
很好的支持,額外提供預覽功能。 |
|
Testability |
Struts1的測試不容易,Strut2測試容易簡單。 |
測試支持簡單容易。 |
Tapestry4的測試不容易,不過Tapestry5的測試可以很簡單。 |
不容易測試。 |
Extensibility |
|
良好 |
良好 |
良好 |
Industry Momentum |
廣泛使用,目前各種資源都不錯。 |
JSF業界標準,業內廠商支持會比較多,不過未必不會出現EJB2的結局。 |
應用范圍小于Struts,之前的版本學習曲線太高。 |
微軟地主老財,有大把的錢;此外,大量的第三方公司提供支持。 |
Migrate |
|
從Struts遷移不難; |
從Struts或者JSP遷移難度較大些。 |
|
因為工作原因,最近一直在使用Spring Web Flow,與之上幾個Web框架對比優點是:
1. 頁面流程明確, 除去JSF外,其它幾類框架要明確獲取頁面流程信息并不容易. 對于企業開發來說,這點其實蠻重要的. 一般的互聯網網站沒有特別的好處.
2. 不需要再寫Action等Web控制類. 雖然Struts2,JSF和Tapestry都是POJO了,但依然存在屬于Web層范疇的類,而Spring Web Flow不需要,邏輯寫在Flow文件中, 直接訪問Service對象,獲取Domain Model(我們還同時省略了VO). 當然這點可能有同學持反對意見.仁者見仁了!
3. Spring Web Flow提供單元測試能可以容易覆蓋頁面流程了.
Spring下的另一個項目