JavaServer Faces簡(jiǎn)介
對(duì)于RAD 工具的四個(gè)層次, JavaServer Faces 定義了其中3個(gè):一個(gè)組件架構(gòu),一個(gè)標(biāo)準(zhǔn)的UI 部件集,以及一個(gè)應(yīng)用架構(gòu)。JSF的組件架構(gòu)定義了通用的方式來(lái)建立UI 部件。此架構(gòu)能驅(qū)動(dòng)標(biāo)準(zhǔn)的JSF UI 組件(按鈕,超鏈接,復(fù)選框,文本框等等),也為第3方組件留了空間。組件是面向事件的,所以JSF 允許你處理客戶產(chǎn)生的事件 (如,文本框中值的變化或者點(diǎn)擊了按鈕)。
因?yàn)閷?duì)Web應(yīng)用來(lái)說(shuō),不象其桌面應(yīng)用堂兄弟,它必須總是要滿足多個(gè)客戶 (比如桌面瀏覽器,移動(dòng)電話和PDA等), JSF 有一個(gè)強(qiáng)大的架構(gòu)來(lái)以不同的方式顯示組件。它也有一個(gè)可擴(kuò)展的機(jī)制來(lái)進(jìn)行輸入校驗(yàn) (如字段長(zhǎng)度) 以及在顯示字符串和對(duì)象之間進(jìn)行轉(zhuǎn)換。
Faces 也能夠自動(dòng)的保持你的UI 組件和收集用戶輸入值的Java 對(duì)象之間的同步,并且通過(guò)調(diào)用后臺(tái)Bean來(lái)對(duì)事件進(jìn)行響應(yīng)。另外,它有一個(gè)強(qiáng)大的導(dǎo)航系統(tǒng)并且全面支持多語(yǔ)言特征。這些特征構(gòu)成了JSF的應(yīng)用基礎(chǔ)架構(gòu)—即對(duì)新應(yīng)用系統(tǒng)必不可少的基本構(gòu)建塊。
JavaServer Faces 定義了工具支持的基礎(chǔ),但是其實(shí)現(xiàn)留給了工具廠商,這是Java的習(xí)慣。你可以自行選擇業(yè)界領(lǐng)導(dǎo)提供的工具,它們都可以是你能夠像使用其他RAD 開(kāi)發(fā)工具如Visual Studio. NET一般可視化的布局和設(shè)計(jì)你的Web UI。 (如圖1.1, 1.2, 和 1.3 分別展示了在IBM, Oracle, 和 Sun的IDE開(kāi)發(fā)工具中開(kāi)發(fā)JSF是什么樣子) 。或者,如果你愿意在沒(méi)有設(shè)計(jì)工具下開(kāi)發(fā)Faces 應(yīng)用。
在這些贊美之詞之后,我們應(yīng)該指出JavaServer Faces 和桌面UI 框架如Swing 或者SWT之間的關(guān)鍵不同之處: JSF 是運(yùn)行在服務(wù)器之上。因此, Faces 應(yīng)用將運(yùn)行在一個(gè)標(biāo)準(zhǔn)的Java web 容器之中,如Apache Tomcat [ASF, Tomcat],Oracle Application Server [Oracle, AS],或者IBM WebSphere Application Server [IBM, WAS],然后向客戶顯示HTML 或者其他標(biāo)記語(yǔ)言。
如果你點(diǎn)擊一個(gè)Swing 應(yīng)用中的按鈕,它將產(chǎn)生一個(gè)事件,而你可以直接在駐留在桌面中的代碼來(lái)處理該事件。相反, web 瀏覽器并不知道JSF組件和其事件的任何東西;它僅僅知道顯示HTML而已。所以當(dāng)你點(diǎn)擊一個(gè)Faces 應(yīng)用按鈕,它將產(chǎn)生一個(gè)請(qǐng)求,有瀏覽器發(fā)送到服務(wù)器。Faces 負(fù)責(zé)將該請(qǐng)求轉(zhuǎn)換成一個(gè)可以被服務(wù)器中的應(yīng)用邏輯所處理的事件。它也負(fù)責(zé)保證你在服務(wù)器所定義的每一個(gè)UI 部件都正確顯示給瀏覽器。
圖1.4 顯示了一個(gè)Faces 應(yīng)用的高階視圖。你可以看到,應(yīng)用運(yùn)行在服務(wù)器上可以和其他子系統(tǒng)集成,如EJB服務(wù)或者數(shù)據(jù)庫(kù)服務(wù)。當(dāng)然, JSF還提供許多其他服務(wù)可以幫助你你更小的代價(jià)構(gòu)建強(qiáng)大的Web應(yīng)用。
JavaServer Faces 有一個(gè)特定的目標(biāo):使web 開(kāi)發(fā)更快更容易。它允許開(kāi)發(fā)人員以組件,事件,后臺(tái)Bean以及它們之間的交互來(lái)進(jìn)行思考,而不是請(qǐng)求,響應(yīng)和標(biāo)記。換句話說(shuō),它掩蓋了Web開(kāi)發(fā)的大量的復(fù)雜性,是開(kāi)發(fā)人員能夠集中于如何使他們的應(yīng)用做的最好。
工業(yè)支持
對(duì)JCP社區(qū)和Sun 擴(kuò)展Java的方式來(lái)說(shuō),最好的事情莫過(guò)于有大量的公司,組織和個(gè)人投身其中。通過(guò)JCP 產(chǎn)生一種規(guī)范實(shí)際上算不上快速,但結(jié)果卻是非常好的。JavaServer Faces 在2001年5月通過(guò)Java 規(guī)范請(qǐng)求(JSR) 127 引入;規(guī)范的最終版本,JSF 1.0,在2004年3月3日才發(fā)布。而JSF 1.1 (維護(hù)發(fā)布版) 則是2004年5月27日發(fā)布的。參與開(kāi)發(fā)Faces的公司和組織 (除Sun之外)包括Apache軟件基金, BEA 系統(tǒng), Borland 軟件,IBM,Oracle,Macromedia,等等。
這些公司開(kāi)發(fā)的產(chǎn)品可分為3類(某些可能適合不止一類):J2EE 容器,開(kāi)發(fā)工具,和UI 框架。因?yàn)镴avaServer Faces是一個(gè)與工具一起工作和運(yùn)行于J2EE 容器中的UI框架,這樣做則非常之好。最重要的是這些公司中包括許多業(yè)界巨頭。這意味著你可以期望JSF 具有大量的工業(yè)支持。并且,如果你的供應(yīng)商不支持JSF,你也可以免費(fèi)下載Sun的參考實(shí)現(xiàn) [Sun, JSF RI]。
要跟蹤最新的JSF 新聞,文章,產(chǎn)品和供應(yīng)商,請(qǐng)?jiān)L問(wèn)JSF Central [JSF Central],本書(shū)作者所運(yùn)作的一個(gè)社區(qū)站點(diǎn)。
JSF,Struts,和其他框架
我們面對(duì)這一情況:有大量的Java web 框架可用。它們中某些,如Struts [ASF, Struts] 和 WebWork [OpenSymphony, WebWork],有助于表單處理和其他問(wèn)題,比如遵循Model 2,集成數(shù)據(jù)源,以及通過(guò)XML配置文件中心化控制引用的所有應(yīng)用資源。這些基本框架提供了廣泛的基礎(chǔ)設(shè)施,但是還沒(méi)有屏蔽基本的HTTP請(qǐng)求響應(yīng)處理。
其他框架,象Tapestry [ASF, Tapestry],Oracle的應(yīng)用開(kāi)發(fā)框架 (ADF) UIX [Oracle, ADF UIX],以及SOFIA [Salmon, SOFIA],都提供一個(gè)UI 組件模型和某些事件處理機(jī)制。這些UI 框架,包括JSF,目的是簡(jiǎn)化整體變成模型。經(jīng)常,基礎(chǔ)架構(gòu)和UI 框架具有重疊的功能。
為了理解這種重疊,你可以想象web 應(yīng)用架構(gòu)師一個(gè)服務(wù)棧。靠近棧底部的服務(wù)沒(méi)能抽象基礎(chǔ)協(xié)議的許多細(xì)節(jié);它們更像粗加工品。棧中靠近頂部的服務(wù)則隱藏了更多討厭的細(xì)節(jié),提供更高級(jí)別的抽象。最低層的服務(wù)由web servers,Servlet API,和JSP處理。大部分框架都提供一些附加服務(wù)的子集。圖1.6顯示了這個(gè)棧,以及與JSF,Struts,servlets,JSP,和典型的web server的關(guān)系。
你可以從圖中看到JSF 支持足夠多的服務(wù),這也使得它自己成為強(qiáng)大的框架。在大多數(shù)情況下,這就是你需要的東西。后續(xù)發(fā)布的Faces極有可能也會(huì)包括傳統(tǒng)的服務(wù)。
然而,即使Faces 與Struts這樣的框架有些重疊,也并不是必須替代它們。 (事實(shí)上,如Struts的領(lǐng)導(dǎo), Craig McClanahan, 是JavaServer Faces的開(kāi)發(fā)指導(dǎo)) 如果你將他們集成起來(lái),你就可以訪問(wèn)棧中的所有服務(wù)(第 14 章將包含Struts 集成)。你也可以和其他框架一起使用JSF,比如Spring [Spring-Faces]。
對(duì)于面向UI的框架,JSF 和他們很多功能都有重疊。這些項(xiàng)目的某些申明將在其未來(lái)版本中支持JSF。Faces 的獨(dú)特之處在于有通過(guò)JCP的工業(yè)巨頭參與的開(kāi)發(fā)聯(lián)盟,以及將成為J2EE的一部分。作為結(jié)果,它將分享受強(qiáng)有力的工具支持,并將隨很多J2EE server一起交付。
組件無(wú)處不在
令人悲哀的是,“組件”一詞的過(guò)度使用在今天已經(jīng)到處蔓延了。操作系統(tǒng)是一個(gè)組件,應(yīng)用程序是一個(gè)組件,EJBs 是組件,庫(kù)是組件,甚至廚房的水槽也是。有大量的書(shū)論及組件,有好的書(shū)指出組件有好多定義存在。
如果你知道他的確實(shí)意義,對(duì)這個(gè)詞的濫用,你就不會(huì)感到陌生。如果你在詞典中查找“組件(component)”這個(gè)詞,你就會(huì)看到他有一個(gè)同義詞供選—整體的一個(gè)部分。因此,如果你使用這個(gè)詞的字面意思,在一個(gè)分布式應(yīng)用歡迎用,操作系統(tǒng)確實(shí)是一個(gè)組件。
更有趣的是,從概念上講,廚房水槽對(duì)操作系統(tǒng)相比對(duì)Faces組件來(lái)說(shuō)更有共通之處。你不用自己從頭制造它—你只需要購(gòu)買一個(gè)符合你需要的水槽:尺寸,顏色,材料,容器數(shù),等等。對(duì)其他廚房用品也是如此,比如櫥柜和工作臺(tái)面。所有這些組件都有特定的接口可以使他們能夠和其他東西進(jìn)行集成,但是依賴于特定的環(huán)境服務(wù)。(例如,接口管)。最終結(jié)果可能是獨(dú)特的,但整體是由獨(dú)立可重用的部件組成。
如果我們采用廚房組件的概念,并應(yīng)用到軟件商,我們會(huì)得出這個(gè)定義:
廚房的“環(huán)境依賴性”就是諸如房間本身,配管,電路等等的因素。本質(zhì)上,環(huán)境是所有組件的容器。一個(gè)容器是擁有組件,并且提供一系列允許進(jìn)行組件操作的服務(wù)的系統(tǒng)。有時(shí),這種操作在IDE (設(shè)計(jì)時(shí))中進(jìn)行,有時(shí)則在部署環(huán)境中運(yùn)行,比如J2EE server之中 (運(yùn)行時(shí))。
短語(yǔ)“獨(dú)立部署” 意味著一個(gè)組件是一個(gè)自包含的單元,可以被安裝到一個(gè)容器中。廚房水槽是一個(gè)獨(dú)立的,自包含的組件,可以安裝在工作臺(tái)中。
當(dāng)你改造你的廚房時(shí),你雇用一個(gè)承包商,由他來(lái)組裝你所選擇的組件 (櫥柜,抽屜,水槽等等) 成為一個(gè)完整的廚房。我們使用組件構(gòu)建軟件時(shí),我們也是將各種組件組裝起來(lái),創(chuàng)建能夠運(yùn)行的軟件系統(tǒng)。
JSF 組件, Swing 組件, servlet, EJB, JavaBean, ActiveX 控件,以及Delphi 可視組件庫(kù) (VCL) 組件都符合這個(gè)定義。但這些組件卻集中于不同的事情。JSF 和Swing 組件單獨(dú)針對(duì)UI 開(kāi)發(fā),而ActiveX 和 VCL 控件可以也可以不影響UI。Servlets 和 EJBs 則更粗糙一些— 他們?cè)趹?yīng)用和業(yè)務(wù)邏輯領(lǐng)域提供大量的功能。
因?yàn)镴SF 著眼于UI 組件,我們來(lái)相應(yīng)窄化我們的組件定義。
如果你是在開(kāi)發(fā)傳統(tǒng)的GUI應(yīng)用,那么UI 組件的概念應(yīng)該對(duì)你非常熟悉了。JavaServer Faces 的精彩之處在于將標(biāo)準(zhǔn)的UI 組件模型引入到Web世界。
posted on 2005-04-28 10:16 鐵手 閱讀(2470) 評(píng)論(4) 編輯 收藏 所屬分類: Java 、JSF系列