經(jīng)過(guò)一段時(shí)間的學(xué)習(xí),對(duì)jsf的認(rèn)識(shí)也逐漸清晰。總結(jié)了一下jsf和structs的區(qū)別,首先在于分離了請(qǐng)求的處理。使用事件處理機(jī)制來(lái)代替原有的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)來(lái)處理,這一點(diǎn)感覺(jué)和structs還是比較類似的,只是換了一個(gè)概念。
從jsf的規(guī)范來(lái)看,jsf整個(gè)架構(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è)包的功能:
application:從定義上就可以看出來(lái),這是應(yīng)用級(jí)的。中間包括了Application主類,這是主要的程序入口,規(guī)范中最具有重量級(jí)的類,也是用來(lái)連接各個(gè)模塊的。jsf規(guī)范使用工廠的模式,來(lái)創(chuàng)建相應(yīng)的實(shí)現(xiàn)類.當(dāng)然如果需要Application的實(shí)現(xiàn),需要從ApplicationFactory中取得。除了Application類,其中還包括了ViewHandler,這個(gè)主要負(fù)責(zé)View的Renderer調(diào)配工作。而許多jsf實(shí)現(xiàn)框架,如果想定義自己的行為,一般上都會(huì)使用自身的ViewHandler,如facelets。NavigationHandler的工作,不用說(shuō)已經(jīng)很明顯,就是用來(lái)負(fù)責(zé)頁(yè)面之間的導(dǎo)航。包中,還包括了view狀態(tài)管理類--StateManager,主要用于恢復(fù)view,以及保存view。目前一般使用Session來(lái)保存相應(yīng)的view,當(dāng)然也可以使用客戶端來(lái)保存。其實(shí),對(duì)于view狀態(tài)的保存,非議還是挺多的,而且問(wèn)題也比較多。
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都需要引用此類
lifecycle:這是jsf最大的特色,劃分了請(qǐng)求的相應(yīng)的處理階段。規(guī)范中,只有兩個(gè)類Lifecycle和LifecycleFactory。Lifecycle管理整個(gè)jsf請(qǐng)求的生命周期。通過(guò)指定的順序執(zhí)行相應(yīng)的階段。
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)組件的包。