【发布时间】:2011-12-16 09:52:54
【问题描述】:
我看到一些示例使用.jsp 扩展名创建 JSF 页面,其他示例使用.xhtml 扩展名创建它们,其他示例选择.jsf。
我只是想知道上述扩展在处理JSF页面时有什么区别,如何选择合适的扩展?
【问题讨论】:
标签: jsp jsf facelets file-extension
我看到一些示例使用.jsp 扩展名创建 JSF 页面,其他示例使用.xhtml 扩展名创建它们,其他示例选择.jsf。
我只是想知道上述扩展在处理JSF页面时有什么区别,如何选择合适的扩展?
【问题讨论】:
标签: jsp jsf facelets file-extension
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 只是web.xml 中FacesServlet 映射的广泛使用的URL 模式之一。其他的是 *.faces 和 /faces/*,但它们来自 JSF 1.0/1.1 时代。它们都不代表具体的文件扩展名/路径,而只是一个虚拟文件扩展名/路径,并且只能在 URL 中指定,如 http://example.com/contextname/page.jsf。如果您熟悉基本的Servlets,那么您应该知道当请求 URL 与 servlet 的 URL 模式匹配时,servletcontainer 将调用 servlet。因此,当请求 URL 匹配 *.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 更改为.xhtml 时,最终用户将无法看到原始JSF 源代码。不可能使用*.jsp 作为 URL 模式,因为这样容器的内置 JspServlet(已经在使用该 URL 模式)将被覆盖,然后 FacesServlet 将无法再以 JSP 为食.
【讨论】:
.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 实现必须支持定义一个
<servlet-mapping>将任何有效的 url 模式映射到 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 请求处理生命周期的方法,但是 依赖这些机制的应用程序将不可移植。
【讨论】: