自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JSF和Tapestry全面比較

開發(fā) 后端
本文先介紹JSF和Tapestry簡介,之后對JSF和Tapestry進行三大全面比較,如處理生命周期等。

目前應(yīng)用很廣泛而且也很成熟的Struts應(yīng)用開發(fā)框架,在未來幾年里將會逐漸淡出,其基于Action(action-based)的開發(fā)模型也將被活躍的java社區(qū)所推崇的新的開發(fā)模型所替代,對于java開源社區(qū)來說,追求***是很多人的理想。在2000年初誕生的Struts以及其他類似的 MVC(Model View Controler)框架主要都是以操作為中心,且都是無狀態(tài)的開發(fā)模型,而現(xiàn)在,基于組件(component-based)和事件驅(qū)動(event- driven)的開發(fā)模型逐漸流行起來,在很多時候都成了Struts的有利競爭者,這其中來自jcp的jsr127-JavaServer Faces(JSF)以及來自apache的Tapestry是其中的佼佼者。

在這篇文章中,我們將把這兩種框架JSF和Tapestry進行詳細的對比。我們的比較將涉及到兩種框架的設(shè)計、運行環(huán)境以及如何開發(fā)。比較的目的在于讓讀者了解這兩種框架各自的優(yōu)缺點,以便于在自己的項目中,根據(jù)實際情況,選擇合適的框架。該文章的內(nèi)容基于JSF1.1和Tapestry3.0.3 (在個別地方由于需要會談到Tapestry4.0)。

JSF和Tapestry簡介 

JSF源于JCP(Java Community Process)的JSR127規(guī)范。Sun公司自己同時也對該規(guī)范提供了一個實現(xiàn),目前的版本是1.1,而且該項目的設(shè)計者之一正是Struts的作者 Craig McClanahan。另外一個JSF的實現(xiàn),就是Apache的一個項目MyFaces。目前,幾個主流的java開發(fā)工具廠商都在其java ide中提供了對jsf的支持,比如Sun、Oracle、IBM、Borland等,而且JSF的后續(xù)版本JSF1.2也將成為J2EE5.0的一個組成部分。   

Tapestry最初于2000年在SourceForge注冊,來自于Apple WebObjects,隨后,于2003年成為Apache的一個項目。與JSF不同的是,Tapestry并不是某一個jsr規(guī)范的實現(xiàn),它僅僅是一個開源項目,當前版本是3.0.3。4.0版本預(yù)計也將在后面的一段時間內(nèi)推出。

JSF和Tapestry作為MVC框架,在一些基本特性上是非常類似的:
◆它們都讓開發(fā)者不再直接與Servlet API打交道,而是讓開發(fā)者在一個更高的抽象層上思考問題;
◆它們都將web頁面上的顯示元素綁定到一個java對象的某個屬性上,這些屬性可能是字符串、數(shù)字、日期或者其他類型,并且由該對象來維護其狀態(tài)。用戶在頁面上的交互行為(比如用鼠標點擊一個按鈕或者鏈接)都直接映射為java類中的一個事件處理方法;
◆兩種框架都支持組件式的開發(fā)方式,并且開發(fā)的組件可被其他開發(fā)者重用。兩種框架都自帶一個標準組件庫,提供web開發(fā)的常見通用功能。

在下面的章節(jié)里面,我們將會看見這兩個框架在各自的實現(xiàn)方式上是有很大區(qū)別的。對于大多數(shù)程序員來說,基于兩種框架做開發(fā),將是非常不同的兩種體驗。

Sidebar: 例子程序在下面本文提供了一個例子程序,該程序的代碼大部分都將在這片文章中做出詳細的描述。這個程序主要就是一個管理個人假期的工具,它的主要功能包括:
◆一個home界面, 列出所有登記的假期,包括假期開始時間、天數(shù)以及一下描述信息;
◆一個detail界面,用于瀏覽某一登記假期的詳細信息;
◆一個new界面,用于添加一個假期信息。

下面這幅圖展示了該程序的主體流程和功能:

Sidebar程序  

對比1: 頁面開發(fā)(Page Development)

一個web應(yīng)用實際上就是后端用java代碼獲取相應(yīng)數(shù)據(jù),并將數(shù)據(jù)傳遞給前端表現(xiàn)層代碼,然后最終返回給終端用戶。因此,在一個開發(fā)人員看來,當他初次接觸JSF和Tapestry時,最直接的感覺就是JSF的表現(xiàn)層是基于JSP的模板技術(shù),而Ta pestry的表現(xiàn)層模板基本就可以看作是一個HTML。

JSF
JSF采用JSP的技術(shù)作為其表現(xiàn)層技術(shù)。與標準兼容的JSF實現(xiàn)必須實現(xiàn)一個核心組件的JSP標簽集。含有JSF標簽的html頁面不能在標準瀏覽器中預(yù)覽。要想瀏覽,必須使用JSF設(shè)計工具或者直接部署到應(yīng)用中,在真實運行環(huán)境中瀏覽。

對于JSF技術(shù)來說,其表現(xiàn)層技術(shù)就是JSP,但是這不是唯一的解決方法。Hans Bergsten的文章介紹了可供選擇的其他的方法,讀者可閱讀該文章獲取詳細信息,Improving JSF by Dumping JSP 。 Bergsten的文章中指出了混合JSF和JSP標簽暴露出的一些問題。當然,這些問題在JSF1.2和JSP2.1中會得到解決。

Tapestry
對于大多數(shù)的Tapestry應(yīng)用來說,Tapestry的表現(xiàn)層模板看起來就是一個簡單的規(guī)則的Html,只不過其中加入了一些Tapestry的屬性。

大家可以嘗試把代碼放入一個Html的body標簽當中,你會發(fā)現(xiàn)瀏覽器可以正常的觀看它。
上面的例子中,jwcid = "@componentName"屬性就是定義了一個Tapestry標簽。
Tapestry的模板不僅僅可以用HTML作為載體,它也支持其他的一些標記語言,Tapestry標簽是具有良好格式的標簽,即必須成對出現(xiàn)。 Tapestry模板技術(shù)支持的標記語言典型的就是HTML以及用于無線應(yīng)用的WML。其***的一個特點 就是,可脫離Servlet容器,直接預(yù)覽。
事實上JSF標簽由于不是標準的html標簽,使得它對于初學(xué)者來說,是難于使用的。而對于很多java程序員來說,他們喜歡編輯HTML代碼,至少是樂意編寫html代碼。

JSF技術(shù)宣稱的一個技術(shù)優(yōu)點就是,可使用同一個模板編寫運行在不同設(shè)備上的應(yīng)用,由此帶來很大的靈活性。然而,這樣做,由于要協(xié)調(diào)不同設(shè)備間的表現(xiàn)差異性,那么很可能同一個模板,將不能正好表現(xiàn)你的輸出。同時,你不得不學(xué)習(xí)新的標簽庫的使用方法,并且搞懂它們是怎樣映射到html的。隨著時間的推移, JSF標簽的簡潔可幫助你很快的編寫表現(xiàn)層代碼,同時也降低了開發(fā)者對jsf設(shè)計工具的依賴。

本文認為,JSF的學(xué)習(xí)成本高于其技術(shù)優(yōu)點。在大多數(shù)情況下,我們并不需要編寫適應(yīng)于不同設(shè)備的應(yīng)用。盡管JSF設(shè)計工具提供了簡單的圖形化的方法來構(gòu)建和預(yù)覽JSF應(yīng)用,但是在一個開發(fā)中,頁面設(shè)計人員更多的是喜歡用流行的HTML設(shè)計工具來編寫和預(yù)覽頁面,這就發(fā)生了一個沖突,即只有將更多的頁面工作轉(zhuǎn)移到j(luò)ava程序員身上,因為一個頁面設(shè)計人員通常情況下是不樂意去操作JSF設(shè)計工具的。

JSF開發(fā)者一直在尋找一種解決這些問題的方法。JSF技術(shù)設(shè)計良好的擴展體系,使得這成為可能,其中一個技術(shù)浮現(xiàn)出來,那就是表現(xiàn)層控制器。一個非常有前途的表現(xiàn)層控制器的實現(xiàn)就是Facelets ,由java.net創(chuàng)建的開放源代碼項目。Facelets的靈感就來源于Tapestry的模板模型,這使得JSF不再依賴于JSP技術(shù)。Facelets允許開發(fā)者創(chuàng)建Tapestry風格的標簽。

在未來的一段時間內(nèi),F(xiàn)acelets將會被開發(fā)者所采用,或許會影響JSF未來的版本。和JSF比較,Tapestry在表現(xiàn)層方面基于HTML代碼,可被標準瀏覽器所瀏覽,這正是它在表現(xiàn)層上的優(yōu)勢所在。

比較2: java編程模型(Java Programming Model)

在前面我們提到Tapestry和JSF都允許表現(xiàn)層的模板直接和一個Java類中的屬性和方法進行交互,那這些類的實例在運行時是怎么創(chuàng)建和管理的呢?

Tapestry
Tapestry的一個完整過程通常都要包括三個部分:用于顯示的頁面模板(一般就是html),帶有相關(guān)屬性和方法的java類,用于定義頁面模板上的控制元素和java類的關(guān)系的頁面定義文件。Tapestry有著一套特殊的訪問HttpSess ion、ServletContext的體系。

在一個頁面定義文件中描述所有的數(shù)據(jù)綁定是可以的,但是一個頁面控制元素卻不能在request周期內(nèi),綁定一個java類。在request周期內(nèi)只能通過一個page類訪問一些屬性和方法。這其中最主要的限制就是關(guān)于page類的問題,一個pag e類必須是BasePage或者AbstractPage的派生類。從另一方面來說,這就意味著你所編寫的表現(xiàn)層邏輯的代碼將會和框架本身的實現(xiàn)有著非常緊密的耦合。不過,Tapestry未來的版本就會減少這種耦合,努力成為一個松耦合的編程模型。

JSF
在JSF應(yīng)用中沒有頁面定義文件。它只有一個全局的配置文件,命名為:faces-config.xml,里面通常都定義了一堆"managed beans"。這些managed beans都是帶有屬性和事件監(jiān)聽器的定義良好的java bean。在faces-config.xml中定義的后端bean都有三個參數(shù):一個標識符、一個java類名、一個bean的生存周期,生存周期可以是request、session、application中的一種。一旦在 faces-config.xml中定義好了一個managed bean,那一個前端頁面上的顯示控制元素就可以使用標識符來關(guān)聯(lián)這個bean。managed bean也可以配置為引用另外一個managed bean。

JSF和Tapestry都可以方便的與其他的中間層技術(shù)整合,比如Spring。JSF managed bean facility 是一個IoC(Inversion of Control)。通過諸如 JSF-Spring 這樣的擴展技術(shù),我們可以方便將其和Spring很好的整合在一起,使得JSF的表達式可以調(diào)用Spring的bean的方法。雖然Spring可以與 Tapestry3.0整合,但是在Tapestry4.0當中才能更好的充分發(fā)揮IoC特性;Tape stry的領(lǐng)導(dǎo)Howard Lewis Ship已經(jīng)在Tapestry啟動了IoC框架的工作。Spring的bean將會很輕松的注入到Tapestry應(yīng)用的類中。

JSF的編程模型提供了更大的靈活型,因為你可以通過組合的方式來豐富你的代碼功能。比如,你可以設(shè)定一個指定的managed bean完成頁面的某些功能,同時,你也可以在這些bean里引用其他的managed bena,從而可在頁面間共享一些功能。
而Tapestry必須使用類繼承的方法,也就是說,Tapestry應(yīng)用中的一個頁面類必須從框架指定的基類中派生(包含一大堆框架指定的狀態(tài)),這并不是一個理想的方法。

JSF能夠非常直觀的管理session和application周期內(nèi)的狀態(tài): 頁面代碼可以方便的訪問managed bean,而不管其生命周期是request、session還是application。而Tapestry在這方面就相對差點,不過, Tapestry4.0在這方面做了很大的改進,引入了類似于JSF managed bean的技術(shù),同時,還支持Java 5.0的annotaions技術(shù),減少對XML配置文件的依賴,從而降低應(yīng)用配置的復(fù)雜性。

JSF在編程模型上來看,與Tapestry相比具有更大的靈活性。

對比3:請求處理生命周期(Request Processing Life Cycle)

請求處理生命周期在一個web應(yīng)用中是很重要的,它反映了一個請求從提交到將信息返回給客戶端的處理過程。當然,請求處理生命周期必須能以某種優(yōu)雅的方式,在正確的地方插入用戶定制的請求處理操縱邏輯。

JSF
JSF的請求處理生命周期清晰的定義成六個步驟:Restore View、Apply Request Values、 Process Validations、 Update Model Values、 Invoke Application 和 Render Response。從第二步Apply Request Values開始,可以直接跳到***一步Render Response,甚至可以直接返回給客戶端并且通知JSF運行時,響應(yīng)操作已經(jīng)完成了。有些方法要訪問JSF的FacesContext對象,比如狀態(tài)監(jiān)聽器(phase listeners)、事件操縱器(event handlers)、轉(zhuǎn)換器(converters)、驗證器(validators)等,這都可能忽略請求處理生命周期中的某些步驟。

Tapestry
JSF有一個單一的生命周期模型,而Tapestry的生命周期依賴于其調(diào)用的引擎服務(wù)(engine service)。每一個引擎服務(wù)(engine service)都有其自己的生命周期。比如,Tapestry中的Direct Service控制標單的提交,而Page Service用于渲染頁面,并且不需要額外的服務(wù)端操作。每一個引擎服務(wù)(engine service)都被設(shè)計成在自身的生命周期內(nèi)完成一些特定的任務(wù)。這就意味著,對于一個特定的需求,你可以創(chuàng)建一個對應(yīng)的引擎服務(wù)(engine service),并且可自己定制生命周期。

JSF的生命周期概念更容易理解,而Tapestry可對一個特定的操作定義一個生命周期,這在某些問題的解決上,可能會提供更優(yōu)雅的解決方案。

【編輯推薦】

  1. 了解JSF整體架構(gòu)
  2. 詳細介紹JSF和MVC
  3. JSF通過URL來傳遞參數(shù)
  4. Facelets使用JSF組件
  5. BackingBean和JSF配置文件
責任編輯:佚名 來源: JavaEye
相關(guān)推薦

2009-06-22 14:22:41

JSF和Tapestr

2009-06-23 14:01:27

StrutsTapestryJSF

2009-06-23 16:29:51

JSFSpring MVCStruts 2

2009-07-03 14:46:42

JSP開發(fā)框架JSFTapestry

2009-06-23 15:51:00

JSF框架

2009-06-26 14:37:10

EJB和Spring

2009-07-15 16:39:51

AWT和Swing

2009-08-11 14:57:11

比較C#和Java

2009-07-14 14:16:03

Tapestry 5.Tapestry教程Tapestry頁面

2009-06-26 13:48:57

G4JSFGWTJSF

2009-06-24 16:42:17

JSF和Facelet

2011-06-30 10:20:38

JSFMVC

2009-06-24 17:43:24

Struts和JSF

2009-06-23 13:21:26

JSF和Spring

2009-06-24 13:50:29

JSF和MVC

2009-06-29 18:04:13

Tapestry5

2022-02-14 09:00:00

SQLNoSQL數(shù)據(jù)庫

2009-07-14 16:30:41

Swing與SWT

2009-06-24 14:17:00

BackingBeanJSF配置文件

2009-06-25 14:26:33

JSFDojo小部件
點贊
收藏

51CTO技術(shù)棧公眾號