国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Web框架對比: Wicket vs Struts

2019-11-18 15:55:08
字體:
來源:轉載
供稿:網友

一、概貌

Wicket是基于web應用框架的高級組件,其主要特點:
    * 在Html和java之間的明確分隔
    * OO組件模式
    * 自動狀態治理
    * 高度生產化
    * 低學習投入
    * 屏蔽Servlet API、HTTP協議細節
    * 無需xml配置文件
    * 易于構造可重用組件
Struts是以Model2 MVC 為藍本構建的web應用框架。其工作圍繞著處理HTTP請求的action類來完成。配置方式采用XML文件。
下文將對Wicket和Struts在體系、HTTP請求處理、Servlet API和HTTP協議抽取、狀態治理、配置這六方面進行比較。

二、比較第一方面:體系

Struts體系基于解釋每個HTTP請求并將其定向到某個處理該類型請求的指定Action類。每個Action類將處理后的結果返回,并決定下一步走向——通過轉發或者重定向到另一個Action或者將控制權交給輸出HTML的jsp頁面。從技術較大來講,雖然每個部分之間做到了很好的解耦,但是基于HTTP請求的處理模式可謂與時代不符(與wicket相比就是過時了)。兩大原因如下:
    * Struts并不是真正意義上的純粹面向對象,每個Action類定義了一個abstraction(抽取),但是abstraction是由HTTP協議的請求機制決定的,而并非面向對象的分析。
    * 除非我們在java代碼中直接輸出HTML(當然除非我們瘋了),那么為了輸出HTML我們就要學習另外的主流技術,比如JSP和自定義tag。使用在JSP中使用tag并非易事,尤其是當我們把這項工作交給美工小組時,這會直接導致兩個結果:JSP代碼被他人作的一沓糊涂,或者是我們自己完成這項任務。

而Wicket的處理方式則不同,從整體來講應該說是更加優雅些。它采用面向對象的組件技術實現web與用戶的交互(這點有些如Swing)。在Wicket中的每一頁是由若干的使用組合設計模板生成的組件構成。頁面和組件各自渲染自己,并直接或者間接的與markup文件(標識文件,形式就像JSP)關聯。當HTTP請求到來時,這些請求被轉換、傳遞到組件上的相應事件中來,這一點與微軟的VS很相象。所以Wicket能夠解決struts體系中存在的問題:
    * Wicket是完全面向對象的。我們可以利用組件的繼續性設計自己的應用。這里不需要為處理HTTP協議的請求/響應而作任何工作。
    * Wicket所使用的markup文件與純粹的HTML很接近,所以輕易上手使用。Wicket在markup文件中所引入的內容非常整潔,并符合XHTML標準。任何了解HTML的開發者都可以如編輯HTML文件那樣編輯Wicket的markup文件,就好似他并不知道這是Wicket的markup文件一樣。

三、HTTP請求處理

在Struts中,一個HTTP請求被接收后,Struts將在配置文件中查找request path和相應的Action類。假如這些已經被配置好了,它將將提取請求參數放入到ActionForm bean中,并執行一些驗證。然后HTTP請求、回應和ActionForm對象都將作為參數傳入到Action類中。從這點可以看出Action的開發者把握著應用的方方面面:他們必須處理HTTP session,維護HTTP請求和session的屬性,并在action執行完時建立需要返回的信息,最后還要返回相應的ActionForward以使struts知道下一步在哪里。假如此時ActionForward將控制權交給了JSP頁面,開發者就要使用struts自定義的tag庫編寫JSP代碼。如此繁復的工作環節很輕易出現錯誤,而且struts還需要三個位置保持一致:struts XML配置文件、java Action類、JSP自定義tag。

而在Wicket中,一個HTTP請求被接收后,Wicket將確認HTTP所請求的那個頁面和在這個頁面關聯的組件。假如請求的目的是form,Wicket將自動提取請求參數、驗證參數、進行一些預先規定好的類型轉換、設置form組件中的model(模式,這里用法與MVC中類似,但有不同)值;接著轉化請求為相應類型的事件、調用目標組件上的相應事件偵聽器,這樣就會導致事件處理代碼運行來執行業務邏輯;然后,事件處理器還將指定下一步頁面的位置,被指定的頁面將初始化(假如頁面從未被初始化的話)并自動渲染;渲染處理將按照順序訪問每個頁面組件,要求它們進行自我渲染。在markup文件中能夠組件僅通過名字與HTML元素進行映射。

Wicket出色的原因:
    * 每個組件知道如何處理自己事件。因此我們只需要將組件放到頁面上,編寫事件處理器就行了。假如一個頁面中存在20個能引發事件的不同的組件,我們除了進行將它們添加到頁面上的工作外沒有別的工作。但假如在struts中,我們可能需要建立20個不同的Action類或者一個具有20個分支語句的Action類,并要在XML配置中逐一添加。
    * Wicket帶給了我們考慮組件/事件重用的機會。而不用將注重力放到如何處理HTTP請求和回應上。
    * 與struts相比使用Wicket會降低我們的代碼量,這正是重用組件帶來的益處。Wicket本身不使用任何的XML配置文件。只需要修改web容器的web.xml文件中的servlet聲明部分。

假如我們曾經編寫過Windows API、并用過Visual Basic或者Borland Delphi的話,下面的比較會更加讓人印象深刻。使用struts開發就像使用Windows API一樣:接收原始消息,解碼原始消息,然后再處理這些消息。由于Windows API是基于消息循環工作的,所以系統除了消息回應外不期望任何的返回值。

從另一方面看,Dephi在Tapplication類中隱藏了Windows消息循環,使開發人員圍繞著TApplication類建立其他的類。原始的系統消息就這樣被Dephi內建類接收,被內建類解析并被確定其接納者。消息被轉換為一個事件,并被傳送到某個特定的對象。

如Windows應用程序一樣,Wicket應用也具有服務于文本和HTML模板的資源文件。從這點看,Wicket象用Delphi做桌面開發一樣被用來做web開發。

四、Servlet API和HTTP協議的抽取

Struts沒有隱藏Servlet API和HTTP協議的細節。為了使用Struts,我們必須樂于和HTTPServletRequest、HttpServletResponse 和HttpSession類打交道。并圍繞著請求和回應建立應用。這便是所有Model2 MVC wen框架與生俱來的弱點。

正如上面說的,Wicket隱藏了Servlet API和HTTP協議的細節。對于一些應用,我們甚至觸及不到這些細節。甚至對于非常復雜的應用,我們也僅使用適當的Wicket協議抽取類。而經常用到的是java組件類、POJO業務模型、純HTML標記文件。

五、狀態治理

使用Struts開發,我們將獲得全部的狀態治理權。這對于建立大規模的、高升級空間的、集群應用來講是很好的,因為我們將獲得對HttpSession上每件事物的控制權。但是對于中小型應用,我們將沒有緣由編寫一些額外的代碼。這樣將導致應用變得復雜和編寫費時。

在狀態治理上,Wicket可以作為一個不錯的選擇。Wicket框架默認代管所有的組件狀態。這對于中小型應用,在狀態治理上的代碼量幾乎為0。但是Wicket也提供了一些API使我們進行標準狀態治理和實現自己的狀態治理。這樣,即使是大型應用,我們也能夠全權把握狀態治理。事實上,即使在使用Wicket編寫大型應用時,通常也是先讓Wicket代管所有的狀態,然后再慢慢的實現自己定義的狀態治理以提高應用性能。

六、配置

不言自明,Struts需要一個XML文件:定義對HTTP請求和響應的映射和所有的ActionForm對象等。這個文件可能非常大而且復雜。而新版本的Struts提供了將這個文件分解為多個模塊的方法,雖然這樣可以將模塊分類,但是這樣同樣要維護許多的小文件。

Wicket不需要配置文件。Wicket通過一個簡單的應用配置類或者通過編寫web容器的web.xml文件中Servlet init參數來完成程序的初始化。而HTTP請求到組件事件的映射、組件如何輸出HTML等被包含在了Wicket的應用邏輯里,從而極大地簡化了配置。

七、Wicket1.2的RoadMap

    * javascript support
    * CSS support
    * Markup inheritence
    * EXPerimental Ajax support
    * ImPRoved URL handling
    * Include of external markup
    * Simplified Choice component
    * Improved Feedback support
    * Thread safe validation (bug fix)
    * Immediate button support for Forms
    * Panel support for TreeView
    * Date picker component
    * Component reference examples
    * AJAX support
    * Portlet support (JSR 168)
    * Clean and pretty URL's
    * JAAS/Acegi/other security integration

八、參考資料
http://wicket.sourceforge.net/
http://www.wicket-wiki.org.uk/wiki/index.php/Newuserguide

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盖州市| 南宫市| 伊宁县| 勃利县| 商河县| 凤山县| 陆河县| 栖霞市| 垫江县| 方山县| 萍乡市| 云浮市| 新巴尔虎左旗| 达拉特旗| 蕲春县| 蕉岭县| 晴隆县| 财经| 锦屏县| 个旧市| 资阳市| 武胜县| 措美县| 招远市| 宜州市| 石河子市| 宜昌市| 云安县| 江孜县| 普安县| 威信县| 昌图县| 华亭县| 锦州市| 玉龙| 定西市| 阿坝县| 沙湾县| 肃北| 五原县| 毕节市|