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

我看到一些使用.jsp扩展名创buildJSF页面的例子,其他使用.xhtml扩展名创build它们的例子,其他例子select.jsf 。 我只想知道在使用JSF页面时上述扩展之间有什么不同,以及如何select合适的扩展?

JSP是一种古老的视图技术,并广泛地与JSF 1.x结合使用。 Facelets(被一些人笼统地称为XHTML )是JSP的inheritance者,在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时代开始的。 它们都不代表具体的文件扩展名/path,而只是一个虚拟的文件扩展名/path,只能在http://example.com/contextname/page.jsf中指定。; 如果您熟悉基本的Servlet ,那么您应该知道,servlet容器将在请求URL与servlet的URL模式匹配时调用该servlet。 所以当请求URL匹配*.jsf ,那么FacesServlet将以这种方式被调用。 使用JSP时,它实际上会执行page.jsp 。 当使用Facelets时,这实际上会编译page.xhtml

既然JSF 2.x,你也可以使用*.xhtml作为URL模式。 这样,你不需要在指定URL时感到困惑。 使用*.xhtml作为URL模式在Facelets 1.x的JSF 1.x中是不可能的,因为FacesServlet随后会在每次调用自己的无限循环中运行。 使用*.xhtml的另一个好处是,只要最终用户有意将浏览器地址栏中的URL扩展名从例如.jsf更改为*.xhtml ,那么最终用户将无法查看原始JSF源代码。 使用*.jsp作为URL模式是不可能的,因为容器内置的JspServlet (已经使用该URL模式)将被重写,然后FacesServlet将无法再支持JSP。

也可以看看:

  • JSF,Servlet和JSP有什么区别?
  • 为什么Facelets比JSF2.0更适合作为视图定义语言呢?
  • JSF Facelets:有时我会看到URL是.jsf,有时是.xhtml。 为什么?

.jsp文件通常用于使用JavaServer Pages定义的JSF视图。 .xhtml文件通常用于使用Facelets定义的JSF视图。

这可以通过configuration进行更改(例如,请参阅javax.faces.DEFAULT_SUFFIXjavax.faces.FACELETS_SUFFIXconfiguration参数。)

其他扩展映射( *.jsf*.faces )通常用于通过FacesServlet处理请求。 这是JSF运行时将处理的视图的逻辑映射。 在web.xml定义了如何处理映射(不需要使用扩展来完成;通常使用/faces/*映射。

从规格:

Servlet映射

对Web应用程序的所有请求都映射到特定的Servlet,这是基于将URL模式(如Java Servlet规范中定义的)与请求URL的部分匹配在选定此Web应用程序的上下文path之后。 JSF实现必须支持定义<servlet-mapping> Web应用程序,该<servlet-mapping>将任何有效的url模式映射到FacesServlet。 可以使用前缀或扩展映射。 使用前缀映射时,build议使用以下映射,但不是必需的:

 <servlet-mapping> <servlet-name> faces-servlet-name </servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> 

使用扩展映射时,build议使用以下映射,但不是必需的:

 <servlet-mapping> <servlet-name> faces-servlet-name </servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> 

除FacesServlet之外,JSF实现还可以支持其他方法来调用JavaServer Faces请求处理生命周期,但依赖这些机制的应用程序将不可移植。