【问题标题】:Can a JSF Project run without using Servlets?JSF 项目可以在不使用 Servlet 的情况下运行吗?
【发布时间】:2013-02-17 14:45:45
【问题描述】:

我是 JSF 的新手,我有一个问题:

据我所知,Servlet 是用于获取 HTML 请求和提供 HTML 响应的类。如:

HttpServletRequest 请求,HttpServletResponse 响应

但是在一个典型的 JSF 项目中,我根本看不到使用这些类,而我看到的只是托管 bean 和 Facelet 页面。

但是在 web.xml 中我看到了:

<servlet>
   <servlet-name>Faces Servlet</servlet-name>
   <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>

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

据我所知,构建 JSF 项目还需要 JSTL.jar。

这些类也是

HttpServletRequest 请求,HttpServletResponse 响应

还在 JSF 项目中使用?如果有怎么办?

【问题讨论】:

  • 这不在问题范围内,但我强烈建议您不要使用 /faces/* 作为 URL 映射,而是使用 /.xhtml。为什么?因为第一个甚至会处理虚拟faces 文件夹下的资源,例如图像、JS 和 CSS 文件等,并且在获得意外结果时可能会遇到问题(SO 中的很多人都遇到过类似的问题)。
  • 谢谢。流程是什么意思?
  • 网页中的每个资源都会变成对服务器的 GET 请求。如果您在 Chrome/Firefox(安装了 Firebug 插件)上按 F12 并转到“网络”选项卡/选项,您可以刷新(或导航到)页面并看到将有一个带有网站 URL 的 GET 请求和然后完成大量 GET 请求以获取每个资源(图像、CSS、JS 等)。这意味着,如果FacesServlet 映射到/faces/*,则这些资源中的每一个都将由FacesServlet 处理。此外,您不需要为这个 Servlet 处理这种工作。
  • 谢谢,很好的解释!您的意思是,将您的静态数据保存在其他文件夹中,然后在不使用 FacesServlet 的情况下获取它们?
  • 实际上让 JSF 处理您的资源会带来一些好处,因为它支持国际化和版本控制,请参阅 java.wildstartech.com/Java-Platform-Enterprise-Edition/… 以了解其工作原理。

标签: java jsf jakarta-ee servlets


【解决方案1】:

javax.servlet.http.HttpServlet 被使用。它由FacesServlet 扩展(意味着它是javax.servlet.http.HttpServlet)。 JSF FacesServlet 加载视图、构建组件树、处理事件并呈现响应。

【讨论】:

    【解决方案2】:

    正如其他人所指出的,JSF 本身的实现与 Servlet 技术有重要联系。 Faces Servlet 本身就是一个 Servlet。

    请注意,您显示的 web.xml 中的映射对于在 Java EE 6(特别是 Servlet 3)容器上运行的 JSF 2.1 实现是可选的。在这种情况下,扩展 .jsf.faces 以及路径 faces\* 会自动映射到 Faces Servlet,从而映射到您的页面。

    JSF 本身确实尝试从 Servlet 技术中抽象出来。例如,ExternalContext 类型是从“其包含的应用程序环境的性质”中抽象出来的。实际上,这意味着它与 Servlet 和 Portlet 兼容。但是,当前版本至少需要这两种环境中的一种。

    理论上有人可以将 JSF 实现移植到非 Servlet 和非 Portlet 环境中,但据我所知,目前还没有人这样做过。

    【讨论】:

      【解决方案3】:

      根据 JSF 实现,有可能在不使用 Servlet 的情况下运行。虽然 JSF 标准要求实现者提供基于 Servlet 的实现以实现可移植性,但它允许实现者支持调用 JSF 生命周期的其他方式。 (在standard 的第 11.1.1 节中说明)

      但是我不知道实际上有任何实现确实提供了这种可能性。

      【讨论】:

        【解决方案4】:

        之所以使用它们,是因为 JSF 本身是由一个名为 javax.faces.webapp.FacesServlet 的 Servlet 提供的。也就是说,当有人调用您的视图时,他们最终会调用javax.faces.webapp.FacesServlet 中定义的 servlet,然后此 servlet 将执行所有呈现您的 XML 页面的神奇 JSF 内容。

        【讨论】:

        • int是什么意思,JSF是Servlet提供的?
        猜你喜欢
        • 2017-12-16
        • 2017-12-30
        • 1970-01-01
        • 2021-01-16
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        相关资源
        最近更新 更多