Java JSF项目是否可以在不使用servlet的情况下运行?

Java JSF项目是否可以在不使用servlet的情况下运行?,java,jsf,jakarta-ee,servlets,Java,Jsf,Jakarta Ee,Servlets,我是JSF新手,我有一个问题: 据我所知,servlet是用于获取HTML请求和提供HTML响应的类。例如: HttpServletRequest请求,HttpServletResponse响应 但在一个典型的JSF项目中,我根本看不到这些类的使用,相反,我看到的只是托管bean和Facelet页面 然而,在web.xml中,我看到: <servlet> <servlet-name>Faces Servlet</servlet-name> <

我是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>

Facesservlet
javax.faces.webapp.FacesServlet
1.
Facesservlet
/面孔/*
据我所知,构建JSF项目也需要JSTL.jar

这些课程也是如此

HttpServletRequest请求,HttpServletResponse响应


还在JSF项目中使用吗?如果是这样,如何使用它们呢?因为JSF本身是由名为javax.faces.webapp.FacesServlet的Servlet提供的。也就是说,当有人调用您的视图时,他们最终会调用在
javax.faces.webapp.FacesServlet
中定义的servlet,然后这个servlet将完成呈现XML页面的所有神奇JSF功能

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

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


然而,我不知道实际上有任何实现提供了这种可能性。

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

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

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


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

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