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