66

Facelets 依赖于 XML 名称空间来处理 XHTML。HTML 4 怎么样,据我所知,HTML 5 不支持命名空间。HTML 5 也有一些 XHTML 中没有的新元素。甚至 HTML 4 和 XHTML 在它们支持的元素和属性方面也存在一些差异。

问题是:是否可以使用 Facelets 呈现 HTML 4/5 文档?如果是这样,怎么做?

4

5 回答 5

100

由于 Facelets 是一种基于 XML 的视图技术,它本质上是吃和发出 XML 标记,因此您不能将它与 HTML4 文档类型一起使用。HTML4 文档类型描述了几个不能自闭合的元素,例如<link>、和. 但是,对于 XML,您必须像、等那样关闭它们。因此,对于 Facelets,使用 HTML4 文档类型绝对不是一种选择(也就是说,当您尊重标准和/或害怕 w3 验证器时,它会完美地工作在大多数(如果不是全部)网络浏览器上)。<meta><br><hr><link/><meta/>

另一方面,HTML5 允许 XML 标记。这在第 3.2.2 章 - 元素中指定:

例子:

<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认为是有害的,您也不想这样做。

根据你的论点:

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 开始,可以使用新的传递元素特性将自定义元素转换为 JSF 组件。只需给 HTML5 元素一个jsf:id属性。它将在内部透明地被解释为UIPanelJSF 组件树中的一个实例(如<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>

您甚至可以从 ajax 中引用它,如<f:ajax render="main">.

实际上,XHTML 被夸大了。它的唯一目的是使用基于 XML 的工具来简化 HTML 开发,这些工具可以在服务器端操作/转换/生成 HTML 页面(如 Facelets)。但是一些初学者也使用它而不使用任何 XML 工具并按原样输出它,因为它“太酷了”——出于某种不清楚的原因。

不要误会我的意思。XHTML作为服务器端视图技术非常棒。但根本不是作为客户端标记技术。它在客户端完全没有价值。

也可以看看:

于 2010-10-06T02:41:57.623 回答
9

在相关说明中,请查看这篇 IBM developerWorks 文章:JSF 2 fu:HTML5 复合组件,第 1 部分

于 2010-10-12T18:33:41.950 回答
4

MyFaces 具有 html5 的扩展名。试试这个http://myfaces.apache.org/html5/

于 2012-03-08T07:29:31.880 回答
3

我读过,这应该是可能的,但我自己还没有这样做。也许您应该只在 xHTML 包装代码中使用 HTML 5。我会看看,如果我能再次找到我的信息来源。

[编辑] 似乎在 Google 的代码之夏期间,MyFaces 进行了一些工作以支持 HTML5 渲染。我不知道是否应该以有效的方式使用它。

请给我们一个反馈,如果你得到它的工作。[/编辑]

于 2010-10-04T17:11:38.433 回答
2

http://wiki.whatwg.org/wiki/HTML_vs._XHTML提供了一些关于如何在 HTML5 中使用命名空间来帮助从 XHTML 迁移的有用信息。也许您可以尝试按照它的建议应用名称空间,看看会发生什么?

于 2010-10-05T16:18:22.870 回答