由于 Facelets 是一种基于 XML 的视图技术,它本质上是吃和发出 XML 标记,因此您不能将它与 HTML4 文档类型一起使用。 HTML4 doctype 描述了几个不能自闭合的元素,例如<link>、<meta>、<br> 和<hr>。但是,对于 XML,您必须像 <link/>、<meta/> 等那样关闭它们。因此,对于 Facelets,使用 HTML4 文档类型绝对不是一种选择(也就是说,当您尊重标准和/或害怕 w3 验证器时,但是它可以在大多数(如果不是所有)网络浏览器上完美运行)。
另一方面,HTML5 允许 XML 标记。这是在chapter 3.2.2 - Elements 中指定的:
例子:
<link type="text/css" href="style.css"/>
作者也可以选择对 HTML 语法中的 void 元素使用相同的语法。一些作者还选择在斜线之前包含空格,但这不是必需的。 (以这种方式使用空格是继承自 XHTML 1.0 附录 C 中的兼容性指南的约定。)
我自己一直使用<!DOCTYPE html>,也使用JSF/Facelets,即使页面顶部没有<?xml?> 声明。它在所有浏览器中都能完美运行。对于 XHTML 文档类型,您应该按照规范使用 Content-Type 或 application/xhtml+xml,这只会让 MSIE 窒息(它不明白)。而且由于它仍然是使用最广泛的浏览器之一...将 XHTML 内容类型替换为 text/html 是 considered harmful,您也不想这样做。
根据你的论点:
HTML 5 不支持命名空间。
这没关系。命名空间仅对基于 XML 的服务器端视图技术(如 Facelets)感兴趣,后者又可以生成带有这些标签的纯 HTML。以下示例对 Facelets 合法有效:
<!DOCTYPE html>
<html lang="en"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Title</title>
</h:head>
<h:body>
<h:outputText value="#{bean.text}" />
</h:body>
</html>
这会呈现合法有效的 HTML5(对于客户端):
<!DOCTYPE html>
<html lang="en">
<head>
<title>Title</title>
</head>
<body>
Some text
</body>
</html>
你看,Facelets 已经删除了 XHTML 声明,因为它们在客户端没有任何意义。
还有,
HTML 5 也有一些 XHTML 中没有的新元素
这也没有意义。这都是关于生成的输出。哪个可以是 HTML5 一样好。您唯一的问题可能是浏览器支持和呈现 HTML5 特定元素的 3rd 方 JSF 组件的可用性。从 JSF 2.2 开始,可以使用新的 passthrough elements 特性将自定义元素转换为 JSF 组件。只需给 HTML5 元素一个 jsf:id 属性。它会在内部透明地被解释为 JSF 组件树中的 UIPanel 实例(如 <h:panelGroup>)。
<!DOCTYPE html>
<html lang="en"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
>
<h:head>
<title>Title</title>
</h:head>
<h:body>
<header jsf:id="header">Header</header>
<nav jsf:id="nav">Nav</nav>
<main jsf:id="main">Main</main>
<footer jsf:id="footer">Footer</footer>
</h:body>
</html>
您甚至可以在 <f:ajax render="main"> 中从 ajax 引用它。
实际上,XHTML 被夸大了。它的唯一目的是使用 基于 XML 的工具 来简化 HTML 开发,这些工具可以在服务器端操作/转换/生成 HTML 页面(如 Facelets)。但是一些初学者也使用它而不使用任何 XML 工具并按原样输出它,因为它“太酷了”——出于某种不清楚的原因。
不要误会我的意思。 XHTML 作为服务器端视图技术非常棒。但根本不是作为客户端标记技术。它在客户端完全没有价值。
另见: