何时使用f:view和f:subview
我不确定使用<f:view>
和<f:subview>
什么好处。 我注意到可以编写JSF页面而不使用它们。
使用这些标签有什么好处?
<F:视图>
如果你想显式指定/覆盖任何可用的属性,比如locale
, encoding
, contentType
等,或者想附加一些阶段监听器,那么<f:view>
是唯一有用的。 例如
<f:view locale="#{user.locale}" encoding="UTF-8" contentType="text/html">
如果你没有指定它,那么JSF的默认值就会被使用,分别是UIViewRoot#getLocale()
, UTF-8
和Accept
请求头的最接近匹配。 注意应该是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>标记之间的区别