使用.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_SUFFIX
和javax.faces.FACELETS_SUFFIX
configuration参数。)
其他扩展映射( *.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请求处理生命周期,但依赖这些机制的应用程序将不可移植。