我不确定使用<f:view>
和<f:subview>
有什么好处。
我注意到可以在不使用它们的情况下编写JSF页面。
使用这些标签有什么好处?
答案 0 :(得分:70)
<f:view>
仅在您明确指定/覆盖任何可用属性时才有用,例如locale
,encoding
,contentType
等,或者想要附加一些阶段听众。 E.g。
<f:view locale="#{user.locale}" encoding="UTF-8" contentType="text/html">
如果你没有指定它,那么只会使用理智的JSF默认值,分别是UIViewRoot#getLocale()
,UTF-8
和Accept
请求头的最接近匹配。值得注意的是,Accept
请求标头的最接近匹配并不总是完全正确。有时它会导致application/xhtml+xml
,因为在Facelets的情况下URL中存在.xhtml
扩展名,并且Web浏览器没有被配置为默认将其解释为text/html
(如MSIE)。您真的希望通过明确将其设置为text/html
来避免此错误的内容类型。
请注意,将其放在模板中的位置并不重要。您甚至可以将其作为<ui:define>
的直接子项放在模板客户端中。但是,规范地点是<html>
的直接子项,因此包裹<h:head>
和<h:body>
。这也是在遗留JSP中实现所需的方式。在Facelets中,它是可选的,并被视为元数据。
<f:subview>
将创建另一个命名容器上下文。当您想要在同一视图根中重复使用包含多个固定组件ID的包含文件时,这尤其有用,否则您将获得重复的组件ID错误。但是,由于JSF 2.0这样的包含文件可以更好地成为一个复合组件,它本身已经是一个命名容器。
如果您没有指定它,那么如果您未在视图中多次重复使用具有相同ID的组件,则不会造成损害。