我不确定使用<f:view>
有什么好处和<f:subview>
。
我注意到人们可以在不使用 JSF 页面的情况下编写它们。
使用这些标签有什么好处?
最佳答案
<f:view>
仅当您想显式指定/覆盖任何可用属性(例如 locale
)时才有用。 , encoding
, contentType
等或者想要附加一些阶段监听器。例如
<f:view locale="#{user.locale}" encoding="UTF-8" contentType="text/html">
如果您不指定它,那么将仅使用合理的 JSF 默认值,分别是 UIViewRoot#getLocale()
, UTF-8
和 Accept
最接近的匹配请求 header 。应该注意的是 Accept
最接近的匹配请求 header 并不总是完全正确。有时它会导致 application/xhtml+xml
因为 .xhtml
的存在URL 中的扩展名,以防 Facelets 和 Web 浏览器未配置为将其解释为 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>
将创建另一个命名容器上下文。当您想要重用包含文件(该文件又在同一 View 根目录中多次包含固定组件 ID)时,这特别有用,否则您将收到重复的组件 ID 错误。然而,从 JSF 2.0 开始,这样的包含文件可以更好地成为一个复合组件,它本身就已经是一个命名容器。
如果您不指定它,那么如果您不在 View 中多次重复使用具有相同 ID 的组件,也不会造成损害。
另请参阅:
关于jsf-2 - 何时使用 f :view and f:subview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883476/