一直在尝试学习JSF,有时我看到URL是
*.jsf
,有时是*.xhtml
或/faces/*
。有人可以补充我的知识吗?当我使用 Facelet 创建 JSF 时,文件扩展名是 .xhtml
,那么 .jsf
URL 扩展名来自哪里?
.jsf
扩展是 FacesServlet
在 JSF 1.2 期间经常映射在 web.xml
中的位置。
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
.xhtml
扩展名是实际Facelets文件,就像您实际放置在Web应用程序的Web内容中一样,例如Webapp/WebContent/page.xhtml
。
如果您使用
.jsf
扩展调用此页面,例如http://localhost:8080/webapp/page.jsf
然后将调用 FacesServlet
,找到 page.xhtml
文件并解析/呈现其 JSF 组件。如果未调用 FacesServlet
,那么最终用户最终将获得原始 XHTML 源代码(可以通过右键单击,查看源代码查看)。
有时会使用
*.faces
扩展或 /faces/*
文件夹映射。但这是 JSF 1.0/1.1 时代的事了。您可以自由选择和使用您想让 FacesServlet
收听的任何映射,即使它是无话可说的 *.xyz
。实际页面本身应该始终具有 .xhtml
扩展名,但这可以通过 <context-param>
中的以下 web.xml
进行配置:
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xml</param-value>
</context-param>
这会将
FacesServlet
更改为定位 page.xml
而不是(默认)page.xhtml
。
最近,JSF/Facelets 2.0 使用了
*.xhtml
映射。在 JSF/Facelets 1.x 中,不可能使用与物理文件相同的映射扩展。这将导致无限循环。但从 JSF/Facelets 2.0 开始,这是可能的,这允许您通过 http://localhost:8080/webapp/page.xhtml
来调用页面。
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
这样,您就不需要配置一些安全限制来隐藏原始源文件,以防最终用户更改时,例如 URL 中的
.jsf
更改为浏览器地址栏中的 .xhtml
。只有工具(IDE 和插件)和学习资源仍然需要跟上所提倡的从 *.jsf
到 *.xhtml
的转变。根据 JSF 2.3,默认情况下,FacesServlet
也会在 *.xhtml
上自动注册(在 /faces/*
、*.faces
和 *.jsf
旁边)。这已向后移植到 Mojarra 2.2.11。
修复它修复它修复它修复它修复它修复它修复它修复它修复它修复它修复它修复它修复它