2013-04-07 29 views
3

我已經檢查四周,找不到的FacesServlet是如何解決的URL在web應用文件結構的實際文件的解釋。在servlet的上下文中,我的理解是,URL只是您希望客戶使用的虛構名稱。然後,在web.xml中,將特定的servlet映射到URL模式,但servlet的真實名稱/位置對外部世界是隱藏的......這是針對servlet的。FacesServlet如何知道基於URL呈現哪個facelet?

專門爲JSF 2,我們處理FacesServlet的,這使我對我的第一個問題:是FacesServlet是唯一的servlet我需要提供我的應用程序映射細節(我唯一需要的小服務程序,期限) ?似乎答案是「是的」,但如果出現情況不是這樣的情況,請舉個例子。

通過閱讀關於SO的其他問題,我明白並非所有請求都需要通過FacesServlet,所以基本上請求分爲A)請求靜態內容,不應由FacesServlet處理,B)請求用於需要由FacesServlet處理的動態內容。 那麼,如何獲得靜態內容?只需要一個傳入的請求,其中的URL與FacesServlet的URL模式不匹配,但與應用程序文件結構中的真實文件位置匹配?

最後,我的主要問題:,當請求中,對於FacesServlet的URL模式相匹配,如何FacesServlet的知道哪些瀏覽文件(.xhtml)來呈現?在使用JSF 2時是否有一個約定,我需要按照它使其工作?如果不是,那我就不明白了,因爲就像我在上面提到的「通用」servlet中所提到的那樣,URL可以包含一個與真實文件名無關的名稱,只要它映射到web.xml文件中正確的servlet。我覺得我在這裏錯過了一些顯而易見的(重要的)東西。我能想到的唯一的事情就是URL應該與真實的文件位置相匹配,或者存在另一個映射表或者將URL與視圖文件相關聯的東西。

順便說一句,我看着this question,這是關係但沒有任何答案。

謝謝!

回答

1

提供靜態內容的最簡單方法在servlet specification概述,部分10.5:

一個Web應用程序中存在的目錄結構層次。此層次結構的根目錄用作應用程序一部分文件的文檔根目錄。對於 例如,用於在Web容器與上下文路徑/目錄的Web應用程序, 在Web應用程序層次結構的基礎或在WEB-INF/lib中包括該索引內的JAR文件 index.html文件。 META-INF/resources 目錄下的html可以用來滿足來自/catalog/index.html的請求。如果 index.html存在於應用程序的WEB-INF/lib目錄中的根上下文和META-INF /資源 目錄中,則在根上下文中可用的文件 必須使用。將URL與 上下文路徑匹配的規則在第12章「將請求映射到Servlet」中進行了規定。

名爲「WEB-INF」的應用程序層次結構中存在一個特殊的目錄。此 目錄包含與應用程序相關的所有內容,這些內容不在應用程序的文檔 的根目錄中。大多數WEB-INF節點不是應用程序樹的公共文檔 樹的一部分。除了包裝在駐留在WEB-INF/lib目錄下的JAR文件的META-INF /資源靜態資源和JSP,包含在WEB-INF目錄中沒有其他 文件可以被直接提供給客戶機 集裝箱。

也就是說,要提供靜態內容,只需將內容保存到Web應用程序的相應目錄即可。

Servlet的映射是除了這種「隱性」的servlet。因此大多數JSF應用程序只聲明FacesServlet。 IIRC,在最近的JSF實現中,如果它的聲明被省略,servlet甚至會聲明自己,所以你甚至不需要明確地聲明它。

FacesServlet的如何定位使用在JSF specification定義的視圖定義,尤其是7.6.2節:

術語視圖標識符和viewId可互換下面使用,並且意指上下文相對路徑添加到生成視圖的Web應用程序資源(如JSP頁面或Facelets頁面)。在JSP情況下,這是表示視圖的jsp頁面的上下文相對路徑,例如/foo.jsp。在Facelets案例中,這是代表視圖的XHTML頁面的上下文相對路徑,例如/foo.xhtml。

JSF實現必須提供一個默認ViewHandler實現,與售貨ViewDeclarationLanguage 實現設計,支持包含JSF組件和包含JSF組件Facelets頁JSP頁面的渲染默認ViewDeclarationLanguageFactory實現沿。

默認實現在下面的章節7.6.2.1規定。我省去了你的全部報價。要點是,如果面的Servlet與前綴映射(例如/faces/**)映射的,因此viewId是URL的前綴之後的部分,並且如果面孔Servlet是帶有後綴映射(例如*.jsf)映射的,因此viewId是上下文路徑之後的部分URL,替換爲文件擴展名。舉例來說,如果servlet被映射到*.jsf,對於URL http://host/context/admin/userlist.jsf的請求將在Web應用程序目錄中的文件admin/userlist.xhtml讀取該視圖的定義。

+0

感謝您的規格鏈接。所以,如果我的理解正確,那麼在JSF中存在一個隱含的約定,即URL的viewId部分必須與資源的「真實」相對路徑相匹配,否則什麼都不會發現。這是正確的嗎?這是有道理的,因爲否則我不知道FacesServlet會知道返回哪個facelet。 – neizan 2013-04-07 18:45:24

+0

是的,這是正確的。當然,您可以自定義該慣例,甚至可以從完全不同的源代碼載入視圖定義(JSF的內部工作原理可以自定義),但通常只需使用該約定。 – meriton 2013-04-07 19:19:41

+0

太好了。謝謝您的幫助! – neizan 2013-04-08 05:23:34

相關問題