[英]What is the difference between creating JSF pages with .jsp or .xhtml or .jsf extension
我看到一些示例創建擴展名為.jsp
的JSF頁面,其他示例使用.xhtml
擴展創建它們,其他示例選擇.jsf
。 我只是想知道在使用JSF頁面時上述擴展之間的區別是什么,以及如何選擇適當的擴展名?
JSP是一種舊的視圖技術,並與JSF 1.x結合使用。 Facelets(由一些人過度概括為XHTML )是JSP的繼承者,並於2009年底作為JSF 2.x的默認視圖技術引入。當您看到JSP時,您可能正在閱讀過時的書籍,教程或針對JSF 1的資源。X。 在使用JSF 2.x進行開發時,通常應該忽略它們,然后轉向針對JSF 2.x的資源,否則您可能最終會感到困惑,因為Facelets上的JSF 2.x中的許多內容都有所不同。
*.jsf
只是web.xml
FacesServlet
映射的廣泛使用的URL模式之一。 其他的是*.faces
和/faces/*
,但這些都來自JSF 1.0 / 1.1時代。 它們都不代表具體的文件擴展名/路徑,而只是一個虛擬文件擴展名/路徑,並且只能在URL中指定http://example.com/contextname/page.jsf 。 如果您熟悉基本Servlet ,那么您應該知道當請求URL與servlet的URL模式匹配時,servletcontainer將調用servlet。 因此,當請求URL與*.jsf
匹配時,將以這種方式調用FacesServlet
。 使用JSP時,它實際上會執行page.jsp
。 使用Facelets時,實際上會編譯page.xhtml
。
從JSF 2.x開始,您還可以使用*.xhtml
作為URL模式。 這樣,您在指定URL時就不必感到困惑。 在使用Facelets 1.x的JSF 1.x中使用*.xhtml
作為URL模式是不可能的,因為FacesServlet
將在每次調用自身的無限循環中運行。 使用的另外一個優點*.xhtml
是,終端用戶將無法看到原始JSF的源代碼,只要最終用戶有意改變來自例如在瀏覽器地址欄中的URL擴展.jsf
到.xhtml
。 不可能使用*.jsp
作為URL模式,因為這樣已經使用該URL模式的容器的內置JspServlet
將被覆蓋,然后FacesServlet
將無法再以JSP為基礎。
.jsp
文件通常用於使用JavaServer Pages定義的JSF視圖。 .xhtml
文件通常用於使用Facelets定義的JSF視圖。
這可以通過配置更改(例如,請參閱javax.faces.DEFAULT_SUFFIX
和javax.faces.FACELETS_SUFFIX
配置參數。)
其他擴展映射( *.jsf
, *.faces
)傾向於用於通過FacesServlet
處理請求。 這是JSF運行時將處理的視圖的邏輯映射。 如何處理映射在web.xml
定義(不必使用擴展來完成;經常使用/faces/*
映射。
從規格:
Servlet映射
基於將URL模式(如Java Servlet規范中所定義)與選擇此Web應用程序的上下文路徑之后的請求URL部分進行匹配,對Web應用程序的所有請求都映射到特定的servlet。 JSF實現必須支持定義
<servlet-mapping>
Web應用程序,該應用程序將任何有效的url-pattern映射到FacesServlet。 可以使用前綴或擴展映射。 使用前綴映射時,建議使用以下映射,但不是必需的:<servlet-mapping> <servlet-name> faces-servlet-name </servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
使用擴展映射時,建議使用以下映射,但不是必需的:
<servlet-mapping> <servlet-name> faces-servlet-name </servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping>
除了FacesServlet之外,JSF實現還可以支持其他方式來調用JavaServer Faces請求處理生命周期,但依賴這些機制的應用程序將無法移植。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.