2013-04-07 54 views
3

我已经检查四周,找不到的FacesServlet是如何解决的URL在web应用文件结构的实际文件的解释。在servlet的上下文中,我的理解是,URL只是您希望客户使用的虚构名称。然后,在web.xml中,将特定的servlet映射到URL模式,但servlet的真实名称/位置对外部世界是隐藏的......这是针对servlet的。FacesServlet如何知道基于URL呈现哪个facelet?

专门为JSF 2,我们处理FacesServlet的,这使我对我的第一个问题:是FacesServlet是唯一的servlet我需要提供我的应用程序映射细节(我唯一需要的小服务程序,期限) ?似乎答案是“是的”,但如果出现情况不是这样的情况,请举个例子。

通过阅读关于SO的其他问题,我明白并非所有请求都需要通过FacesServlet,所以基本上请求分为A)请求静态内容,不应由FacesServlet处理,B)请求用于需要由FacesServlet处理的动态内容。 那么,如何获得静态内容?只需要一个传入的请求,其中的URL与FacesServlet的URL模式不匹配,但与应用程序文件结构中的真实文件位置匹配?

最后,我的主要问题:,当请求中,对于FacesServlet的URL模式相匹配,如何FacesServlet的知道哪些浏览文件(.xhtml)来呈现?在使用JSF 2时是否有一个约定,我需要按照它使其工作?如果不是,那我就不明白了,因为就像我在上面提到的“通用”servlet中所提到的那样,URL可以包含一个与真实文件名无关的名称,只要它映射到web.xml文件中正确的servlet。我觉得我在这里错过了一些显而易见的(重要的)东西。我能想到的唯一的事情就是URL应该与真实的文件位置相匹配,或者存在另一个映射表或者将URL与视图文件相关联的东西。

顺便说一句,我看着this question,这是关系但没有任何答案。

谢谢!

回答

1

提供静态内容的最简单方法在servlet specification概述,部分10.5:

一个Web应用程序中存在的目录结构层次。此层次结构的根目录用作应用程序一部分文件的文档根目录。对于 例如,用于在Web容器与上下文路径/目录的Web应用程序, 在Web应用程序层次结构的基础或在WEB-INF/lib中包括该索引内的JAR文件 index.html文件。 META-INF/resources 目录下的html可以用来满足来自/catalog/index.html的请求。如果 index.html存在于应用程序的WEB-INF/lib目录中的根上下文和META-INF /资源 目录中,则在根上下文中可用的文件 必须使用。将URL与 上下文路径匹配的规则在第12章“将请求映射到Servlet”中进行了规定。

名为“WEB-INF”的应用程序层次结构中存在一个特殊的目录。此 目录包含与应用程序相关的所有内容,这些内容不在应用程序的文档 的根目录中。大多数WEB-INF节点不是应用程序树的公共文档 树的一部分。除了包装在驻留在WEB-INF/lib目录下的JAR文件的META-INF /资源静态资源和JSP,包含在WEB-INF目录中没有其他 文件可以被直接提供给客户机 集装箱。

也就是说,要提供静态内容,只需将内容保存到Web应用程序的相应目录即可。

Servlet的映射是除了这种“隐性”的servlet。因此大多数JSF应用程序只声明FacesServlet。 IIRC,在最近的JSF实现中,如果它的声明被省略,servlet甚至会声明自己,所以你甚至不需要明确地声明它。

FacesServlet的如何定位使用在JSF specification定义的视图定义,尤其是7.6.2节:

术语视图标识符和viewId可互换下面使用,并且意指上下文相对路径添加到生成视图的Web应用程序资源(如JSP页面或Facelets页面)。在JSP情况下,这是表示视图的jsp页面的上下文相对路径,例如/foo.jsp。在Facelets案例中,这是代表视图的XHTML页面的上下文相对路径,例如/foo.xhtml。

JSF实现必须提供一个默认ViewHandler实现,与售货ViewDeclarationLanguage 实现设计,支持包含JSF组件和包含JSF组件Facelets页JSP页面的渲染默认ViewDeclarationLanguageFactory实现沿。

默认实现在下面的章节7.6.2.1规定。我省去了你的全部报价。要点是,如果面的Servlet与前缀映射(例如/faces/**)映射的,因此viewId是URL的前缀之后的部分,并且如果面孔Servlet是带有后缀映射(例如*.jsf)映射的,因此viewId是上下文路径之后的部分URL,替换为文件扩展名。举例来说,如果servlet被映射到*.jsf,对于URL http://host/context/admin/userlist.jsf的请求将在Web应用程序目录中的文件admin/userlist.xhtml读取该视图的定义。

+0

感谢您的规格链接。所以,如果我的理解正确,那么在JSF中存在一个隐含的约定,即URL的viewId部分必须与资源的“真实”相对路径相匹配,否则什么都不会发现。这是正确的吗?这是有道理的,因为否则我不知道FacesServlet会知道返回哪个facelet。 – neizan 2013-04-07 18:45:24

+0

是的,这是正确的。当然,您可以自定义该惯例,甚至可以从完全不同的源代码载入视图定义(JSF的内部工作原理可以自定义),但通常只需使用该约定。 – meriton 2013-04-07 19:19:41

+0

太好了。谢谢您的帮助! – neizan 2013-04-08 05:23:34

相关问题