javascript
JSF请求处理过程(一) FacesServlet初始化
?JSF應(yīng)用中,在web.xml里面配置了一個Servlet,叫做javax.faces.webapp.FacesServlet,于是可以知道,查看、了解一個請求的處理過程可以從這里開始。從官方網(wǎng)站上下載JSF的源代碼,項目名比較古怪,叫做“mojarra”,我看的版本是1.2_12_b01.里面包含了兩個子項目,一個是jsf-api,里面大多是接口以及少量關(guān)鍵類。另外一個項目叫做jsf-ri,對著這個"ri"邪念了半天之后,終于在兄弟提醒之下想明白了是reference implementation的意思。jsf-api是JavaEE標(biāo)準(zhǔn)的一部分,里面的類型包名都是以javax.faces開頭的,而jsf-ri項目是sun針對JSF標(biāo)準(zhǔn)的一個參考實現(xiàn),里面的類型的包名都是以com.sun.faces開頭的。
??? 1.FacesServlet初始化(FacesServlet#init)
??? 系統(tǒng)啟動的時候,會初始化FacesServlet,調(diào)用其中的init方法。里面主要做了兩件事情,一個是初始化FacesContextFactory,另外一個是初始化Lifecycle對象。在jsf-api項目中,FacesServlet類是一個Servlet接口的實現(xiàn)類,而FacesContextFactory和Lifecycle都是接口。在jsf-ri項目中有這兩個接口的實現(xiàn)類,分別是com.sun.faces.context.FacesContextFactoryImpl和com.sun.faces.lifecycle.LifecycleImpl類。一個想當(dāng)然的事實:FacesServlet初始化的時候要根據(jù)一些配置來判斷具體的FacesContextFactory和Lifecycle實現(xiàn)類是什么,也就是在這里,“JSF標(biāo)準(zhǔn)”和“JSF實現(xiàn)”接軌了。想來MyFaces等等的其他JSF實現(xiàn)應(yīng)該不外乎兩種方式,一種是改變FacesServlet的init方法中需要用到的配置的值,于是啟用自己的FacesContextFactory實現(xiàn)和Lifecycle實現(xiàn),后面的處理過程就全部走自己的邏輯了。第二種方法笨一點,可能性不大,就是把FacesServlet覆蓋替換掉,其中也不需要讀什么配置了,直接使用自己的實現(xiàn)類即可——不過這種做法估計不符合JSF規(guī)范,想來只有我等蝦米民眾能做的出來。主要代碼如下:
??? 1 facesContextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
??? 2 LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
??? 回頭再來看初始化的結(jié)果,FacesContextFactory很明顯是用來生產(chǎn)FacesContext這么個東西的。而FacesContext可以看做是一個RequestWrapper(注意這個FaceContext和ServletContext不一樣,ServletContext是一個Web應(yīng)用只有一個的全局對象,對應(yīng)的是一個Web application,而一個FacesContext對應(yīng)的是一個request,另外,RequestWrapper這個說法不嚴(yán)格,實際上FacesContext里面也包裝了ServletContext、Response等)。而LifeCycle可以看做是一個過濾器鏈(類似于servlet規(guī)范里面的Filter Chain)。于是,整個JSF請求處理過程,實際上就是包裝成為FaceContext的用戶請求,通過類似于一個Filter Chain的LifeCycle的過程。
總結(jié)
以上是生活随笔為你收集整理的JSF请求处理过程(一) FacesServlet初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式系统文件
- 下一篇: Define change docume