我看到了一些创建带有.jsp
扩展名的JSF页面的示例,其他示例使用.xhtml
扩展名创建它们,其他示例选择.jsf
。
我只是想知道在使用JSF页面时上述扩展之间有什么区别,以及如何选择适当的扩展名?
答案 0 :(得分:58)
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
只是FacesServlet
中web.xml
映射广泛使用的网址格式之一。其他的是*.faces
和/faces/*
,但这些都来自JSF 1.0 / 1.1时代。它们都不代表具体的文件扩展名/路径,而只是一个虚拟文件扩展名/路径,并且只在URL中指定http://example.com/contextname/page.jsf。如果您熟悉基本的Servlets,那么您应该知道当请求URL与servlet的URL模式匹配时,servletcontainer将调用servlet。因此,当请求网址与*.jsf
匹配时,FacesServlet
将以这种方式调用。使用JSP时,它实际上会执行page.jsp
。使用Facelets时,实际上会编译page.xhtml
。
从JSF 2.x开始,您也可以使用*.xhtml
作为URL模式。这样,您在指定URL时就不必感到困惑。在使用Facelets 1.x的JSF 1.x中,使用*.xhtml
作为URL模式是不可能的,因为FacesServlet
将在每次调用自身的无限循环中运行。使用*.xhtml
的另一个好处是,只要最终用户有意将浏览器地址栏中的URL扩展从例如.jsf
更改为{{1},最终用户将无法看到原始JSF源代码}。无法使用.xhtml
作为网址格式,因为已经使用该网址格式的容器的内置*.jsp
将被覆盖,然后JspServlet
将不会被覆盖能够以JSP为基础。
答案 1 :(得分:14)
.jsp
文件通常用于使用JavaServer Pages定义的JSF视图。 .xhtml
文件通常用于使用Facelets定义的JSF视图。
这可以通过配置进行更改(例如,请参阅javax.faces.DEFAULT_SUFFIX
和javax.faces.FACELETS_SUFFIX
配置参数。)
其他扩展名映射(*.jsf
,*.faces
)往往用于通过FacesServlet
处理请求。这是JSF运行时将处理的视图的逻辑映射。如何处理映射在web.xml
中定义(不必使用扩展来完成;经常使用/faces/*
映射。
来自规范:
Servlet映射
对Web应用程序的所有请求都映射到特定的servlet 基于匹配URL模式(如Java Servlet中所定义) 规范)针对请求URL之后的部分 选择此Web应用程序的上下文路径。 JSF 实现必须支持定义a的Web应用程序
<servlet-mapping>
将任何有效的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请求处理生命周期的方法,但是 依赖这些机制的应用程序将无法移植。