使用.jsp或.xhtml或.jsf扩展名创建JSF页面有什么区别

时间:2011-10-27 10:31:30

标签: jsp jsf facelets file-extension

我看到了一些创建带有.jsp扩展名的JSF页面的示例,其他示例使用.xhtml扩展名创建它们,其他示例选择.jsf。 我只是想知道在使用JSF页面时上述扩展之间有什么区别,以及如何选择适当的扩展名?

2 个答案:

答案 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只是FacesServletweb.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_SUFFIXjavax.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请求处理生命周期的方法,但是   依赖这些机制的应用程序将无法移植。