了解JSF整體架構(gòu)
經(jīng)過一段時(shí)間的學(xué)習(xí),對(duì)JSF的認(rèn)識(shí)也逐漸清晰??偨Y(jié)了一下JSF和structs的區(qū)別,首先在于分離了請(qǐng)求的處理。使用事件處理機(jī)制來代替原有的 request分發(fā)。其次在頁(yè)面的展示上,采用組件的概念,而不是到處散落的html標(biāo)記。再有,JSF對(duì)于請(qǐng)求的生命周期重新進(jìn)行了劃分,對(duì)于每個(gè)階段都可以派遣事件,這使得整個(gè)請(qǐng)求的處理比較的清晰。最后,JSF對(duì)于頁(yè)面的流轉(zhuǎn)使用Navigation系統(tǒng)來處理,這一點(diǎn)感覺和structs還是比較類似的,只是換了一個(gè)概念。
從JSF的規(guī)范來看,JSF整體架構(gòu)還是比較清晰,各個(gè)層次分的也挺明顯。從總體上看,規(guī)范主要?jiǎng)澐至薬pplication,context, lifecycle,render,component,validator,event,el幾個(gè)部分,當(dāng)然少不了主要的入口Servlet。有一點(diǎn)不太明白,大多數(shù)的類都是抽象類而不是接口,可能是為了規(guī)定層次吧,不允許多層次繼承。下面簡(jiǎn)單以下介紹各個(gè)包的功能:
1.application:從定義上就可以看出來,這是應(yīng)用級(jí)的。中間包括了Application主類,這是主要的程序入口,規(guī)范中最具有重量級(jí)的類,也是用來連接各個(gè)模塊的。JSF規(guī)范使用工廠的模式,來創(chuàng)建相應(yīng)的實(shí)現(xiàn)類.當(dāng)然如果需要Application的實(shí)現(xiàn),需要從 ApplicationFactory中取得。除了Application類,其中還包括了ViewHandler,這個(gè)主要負(fù)責(zé)View的 Renderer調(diào)配工作。而實(shí)現(xiàn)許多JSF整體架構(gòu),如果想定義自己的行為,一般上都會(huì)使用自身的ViewHandler,如facelets。 NavigationHandler的工作,不用說已經(jīng)很明顯,就是用來負(fù)責(zé)頁(yè)面之間的導(dǎo)航。包中,還包括了view狀態(tài)管理類-- StateManager,主要用于恢復(fù)view,以及保存view。目前一般使用Session來保存相應(yīng)的view,當(dāng)然也可以使用客戶端來保存。其實(shí),對(duì)于view狀態(tài)的保存,非議還是挺多的,而且問題也比較多。
2.context:包括了主要的上下文環(huán)境類,如FacesContext和ExternalContext,前者是JSF的主要Context類,包括對(duì) message的管理,Application的取得,以及ResponseWrite的引用。后者主要類似于作為外部環(huán)境的引用類,如 ServletContext和PortletContext.ResponseWriter,主要的服務(wù)端Writer,用于輸出相應(yīng)的html, xml內(nèi)容,所有的Renderer都需要引用此類
3.lifecycle:這是JSF最大的特色,劃分了請(qǐng)求的相應(yīng)的處理階段。規(guī)范中,只有兩個(gè)類Lifecycle和LifecycleFactory。Lifecycle管理整個(gè)JSF請(qǐng)求的生命周期。通過指定的順序執(zhí)行相應(yīng)的階段。
4.webapp:定義了主要的Servlet,F(xiàn)acesServlet,主要的請(qǐng)求分發(fā)類,用于轉(zhuǎn)換相應(yīng)得faces為實(shí)際的資源。在規(guī)范中, Servlet并不是主要的初始化類,JSF 的初始化工作主要由具體的實(shí)現(xiàn)完成。在RI實(shí)現(xiàn)中,基本上由ConfigureListener完成初始化工作。而Servlet的任務(wù)只是簡(jiǎn)單的傳遞請(qǐng)求參數(shù)而已,以及調(diào)用相應(yīng)的Lifecycle而已。
這里主要講了JSF整體架構(gòu)包,下面主要分析一下JSF相關(guān)組件的包。
這次主要分析一下JSF的相關(guān)組件包,也是JSF和structs主要不同的地方。JSF 規(guī)范中,對(duì)于組件的設(shè)計(jì),和其他組件架構(gòu)一樣,分離表現(xiàn)層和模型層。對(duì)于組件的render由具體的Renderer來處理,這也達(dá)到了Model和 View分離的原則。
◆component:所有的基本組件都在其中,如下的主要類圖,對(duì)于各個(gè)組件就不一一詳細(xì)介紹了。主要介紹一下幾個(gè)接口:
◆StateHolder:用于表示在請(qǐng)求之間需要保存相應(yīng)的狀態(tài)信息,必須實(shí)現(xiàn)saveState和resotreState方法。
◆ValueHolder:用于支持本地值的保持,用于訪問model數(shù)據(jù),通過表達(dá)式,支持轉(zhuǎn)換。
◆EditableValueHolder:用于表示那些可以編輯的組件值
◆ActionSource:由UIComponet實(shí)現(xiàn),用于作為ActionEvent的事件源,支持默認(rèn)的ActionListener調(diào)用
◆ActionSource2:這是最近的規(guī)范中增加的,提供了對(duì)于MethodExpression的支持。
◆ContextCallback:用于組件執(zhí)行相應(yīng)的回調(diào)
◆NamingContainer:標(biāo)志接口,表示容器組件
◆convert:包括了主要的Convert接口,以及內(nèi)置的Convert實(shí)現(xiàn)類,主要的作用用于在頁(yè)面值綁定時(shí),進(jìn)行類型的轉(zhuǎn)換工作
◆validator:主要的驗(yàn)證包,定義了通過的Validator接口,以及簡(jiǎn)單的幾個(gè)驗(yàn)證類。默認(rèn)情況下,JSF都是進(jìn)行服務(wù)端驗(yàn)證,如果想需要客戶端驗(yàn)證,暫時(shí)從規(guī)范中,還沒有找出相應(yīng)的解決方案。不過現(xiàn)在已經(jīng)是Ajax時(shí)代了,使用異步的傳輸,從效果上已經(jīng)接近于客戶端之間驗(yàn)證。
◆event:主要的事件體系。個(gè)人覺得JSF的事件體系還是比較弱的。和強(qiáng)大的Swing事件體制相比,那簡(jiǎn)直差遠(yuǎn)了。而且JSF默認(rèn)使用一個(gè) ActionListener來委派所有的客戶端動(dòng)作觸發(fā)。大多數(shù)的調(diào)用都是使用MethodExpression來進(jìn)行。
◆model:只是加強(qiáng)了對(duì)于DataTable的支持,以及SelectItems。
◆render:主要的展示包,當(dāng)然只是提供規(guī)范,具體由實(shí)現(xiàn)類提供。對(duì)于Renderer,都需要一套R(shí)enderKit.而RenderKit由 RenderKitFactory管理。ResponseStateManager,作為StateManager的幫助類,進(jìn)行主要的State操作。
基本上,規(guī)范也就這么些東東。從整體來看,并不算太復(fù)雜??上КF(xiàn)在的JSF實(shí)現(xiàn)實(shí)在太多了,而且各個(gè)實(shí)現(xiàn)并不一定兼容,導(dǎo)致了JSF世界的龐大。
【編輯推薦】