【问题标题】:What is the difference between creating JSF pages with .jsp or .xhtml or .jsf extension使用 .jsp 或 .xhtml 或 .jsf 扩展名创建 JSF 页面有什么区别
【发布时间】:2011-12-16 09:52:54
【问题描述】:

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

【问题讨论】:

    标签: jsp jsf facelets file-extension


    【解决方案1】:

    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.xmlFacesServlet 映射的广泛使用的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 为食.

    另见:

    【讨论】:

      【解决方案2】:

      .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 实现必须支持定义一个 <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 请求处理生命周期的方法,但是 依赖这些机制的应用程序将不可移植。

      【讨论】:

        猜你喜欢
        • 2011-01-06
        • 2016-11-16
        • 2012-05-15
        • 2015-06-21
        • 2010-12-30
        • 2013-01-04
        • 2012-09-18
        • 2017-10-22
        • 2012-07-12
        相关资源
        最近更新 更多