JSF應用中在webxml裡面配置了一個Servlet叫做javaxfaceswebappFacesServlet於是可以知道查看了解一個請求的處理過程可以從這裡開始從官方網站上下載JSF的源代碼項目名比較古怪叫做mojarra我看的版本是__b裡面包含了兩個子項目一個是jsfapi裡面大多是接口以及少量關鍵類另外一個項目叫做jsfri對著這個ri邪念了半天之後終於在兄弟提醒之下想明白了是reference implementation的意思jsfapi是JavaEE標准的一部分裡面的類型包名都是以javaxfaces開頭的而jsfri項目是sun針對JSF標准的一個參考實現裡面的類型的包名都是以comsunfaces開頭的
FacesServlet初始化(FacesServlet#init)
系統啟動的時候會初始化FacesServlet調用其中的init方法裡面主要做了兩件事情一個是初始化FacesContextFactory另外一個是初始化Lifecycle對象在jsfapi項目中FacesServlet類是一個Servlet接口的實現類而FacesContextFactory和Lifecycle都是接口在jsfri項目中有這兩個接口的實現類分別是ntextFacesContextFactoryImpl和comsunfaceslifecycleLifecycleImpl類一個想當然的事實FacesServlet初始化的時候要根據一些配置來判斷具體的FacesContextFactory和Lifecycle實現類是什麼也就是在這裡JSF標准和JSF實現接軌了想來MyFaces等等的其他JSF實現應該不外乎兩種方式一種是改變FacesServlet的init方法中需要用到的配置的值於是啟用自己的FacesContextFactory實現和Lifecycle實現後面的處理過程就全部走自己的邏輯了第二種方法笨一點可能性不大就是把FacesServlet覆蓋替換掉其中也不需要讀什麼配置了直接使用自己的實現類即可——不過這種做法估計不符合JSF規范想來只有我等蝦米民眾能做的出來主要代碼如下
facesContextFactory = (FacesContextFactory)FactoryFindergetFactory(FactoryFinderFACES_CONTEXT_FACTORY)
LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFindergetFactory(FactoryFinderLIFECYCLE_FACTORY)
回頭再來看初始化的結果FacesContextFactory很明顯是用來生產FacesContext這麼個東西的而FacesContext可以看做是一個RequestWrapper(注意這個FaceContext和ServletContext不一樣ServletContext是一個Web應用只有一個的全局對象對應的是一個Web application而一個FacesContext對應的是一個request另外RequestWrapper這個說法不嚴格實際上FacesContext裡面也包裝了ServletContextResponse等)而LifeCycle可以看做是一個過濾器鏈(類似於servlet規范裡面的Filter Chain)於是整個JSF請求處理過程實際上就是包裝成為FaceContext的用戶請求通過類似於一個Filter Chain的LifeCycle的過程
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26271.html