何时使用f:view和f:subview

我不确定使用<f:view><f:subview>什么好处。 我注意到可以编写JSF页面而不使用它们。

使用这些标签有什么好处?

<F:视图>

如果你想显式指定/覆盖任何可用的属性,比如localeencodingcontentType等,或者想附加一些阶段监听器,那么<f:view>是唯一有用的。 例如

 <f:view locale="#{user.locale}" encoding="UTF-8" contentType="text/html"> 

如果你没有指定它,那么JSF的默认值就会被使用,分别是UIViewRoot#getLocale()UTF-8Accept请求头的最接近匹配。 注意应该是Accept请求头的最接近的匹配并不总是完全正确的。 有时会导致application/xhtml+xml因为在Facelets中存在.xhtml扩展名,并且webbrowser默认情况下不会被configuration为text/html (如MSIE)。 你真的想避免这种错误的内容types明确地设置为text/html

请注意,放在模板中的位置并不重要。 你甚至可以把它作为<ui:define>直接子模板客户端。 然而,规范的地方是作为<html>直接孩子,因此包装<h:head><h:body> 。 这也是它在传统JSP中的实际需求 。 在Facelets中,它是可选的,并被视为元数据。

也可以看看:

  • 我们的XHTML wiki页面
  • 是否有可能使用JSF + Facelets与HTML 4/5?
  • JSF 2.0没有渲染任何页面

<F:子视图>

<f:subview>将创build另一个命名容器上下文。 当你想重复使用一个包含多个固定的组件ID的包含文件的时候,这个特别有用,否则你会得到重复的组件ID错误。 但是,由于JSF 2.0这样的包含文件可以更好地成为一个复合组件,它本身已经是一个命名容器。

如果不指定它,则不会在视图中多次重复使用物理ID相同的组件。

也可以看看:

  • 为什么当我通过<f:subview>标签访问时找不到<h:panelGroup> id?
  • 绑定属性会导致在视图中find重复的组件ID
  • <f:subview>和<ui:composition>标记之间的区别