何时使用 f:view 和 f:subview
Posted
技术标签:
【中文标题】何时使用 f:view 和 f:subview【英文标题】:When to use f:view and f:subview 【发布时间】:2012-02-11 14:22:15 【问题描述】:我不确定使用<f:view>
和<f:subview>
有什么好处。
我注意到可以编写 JSF 页面而不使用它们。
使用这些标签有什么好处?
【问题讨论】:
【参考方案1】:<f:view>
仅在您想要显式指定/覆盖任何可用属性(例如 locale
、encoding
、contentType
等)或想要附加一些阶段侦听器时才有用。例如
<f:view locale="#user.locale" encoding="UTF-8" contentType="text/html">
如果您不指定它,那么将只使用合理的 JSF 默认值,分别是 UIViewRoot#getLocale()
、UTF-8
和最接近的匹配 Accept
请求标头。应该注意的是,Accept
请求标头的最接近匹配并不总是完全正确的。有时它会导致application/xhtml+xml
,因为在Facelets 的情况下,URL 中存在.xhtml
扩展名,并且网络浏览器未配置为默认将其解释为text/html
(如MSIE)。您真的很想通过将其显式设置为 text/html
来避免这种错误的内容类型。
请注意,将其放在模板中的哪个位置并不重要。您甚至可以将其作为<ui:define>
的直接子级放在模板客户端中。但是,规范位置是<html>
的直接子级,因此包装了<h:head>
和<h:body>
。这也是它在实际需要的遗留 JSP 中的完成方式。在 Facelets 中,它是可选的,并被视为元数据。
另见:
Our XHTML wiki page Is it possible to use JSF+Facelets with HTML 4/5? JSF 2.0 not rendering any page<f:subview>
将创建另一个命名容器上下文。当您想在同一视图根中重复使用包含固定组件 ID 的包含文件时,这特别有用,否则您将收到重复的组件 ID 错误。但是,从 JSF 2.0 开始,这样的包含文件最好是一个复合组件,它本身已经是一个命名容器。
如果你不指定它,那么如果你不在视图中多次物理地重用具有相同 ID 的组件,它不会造成伤害。
另见:
Why <h:panelGroup> id is not found when I access through <f:subview> tag? Binding attribute causes duplicate component ID found in the view Difference between <f:subview> and <ui:composition> tags【讨论】:
如果我需要有条件地渲染 HTML(比如表格行),子视图是一个不错的选择吗?我似乎找不到另一个具有不呈现 HTML 标记的渲染属性的组件。 @Rinaldo: ui:fragment以上是关于何时使用 f:view 和 f:subview的主要内容,如果未能解决你的问题,请参考以下文章
useMemo和useCallback:何时使用它们,何时不使用它们