【问题标题】:Is it possible to use JSF+Facelets with HTML 4/5?是否可以在 HTML 4/5 中使用 JSF+Facelets?
【发布时间】:2014-09-25 11:44:25
【问题描述】:

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

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

【问题讨论】:

    标签: html jsf jsf-2 xhtml facelets


    【解决方案1】:

    由于 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 中的兼容性指南的约定。)

    我自己一直使用&lt;!DOCTYPE html&gt;,也使用JSF/Facelets,即使页面顶部没有&lt;?xml?&gt; 声明。它在所有浏览器中都能完美运行。对于 XHTML 文档类型,您应该按照规范使用 Content-Typeapplication/xhtml+xml,这只会让 MSIE 窒息(它不明白)。而且由于它仍然是使用最广泛的浏览器之一...将 XHTML 内容类型替换为 text/htmlconsidered 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 实例(如 &lt;h:panelGroup&gt;)。

    <!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>
    

    您甚至可以在 &lt;f:ajax render="main"&gt; 中从 ajax 引用它。

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

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

    另见:

    【讨论】:

    • XHTML 旨在与 HTML4 兼容。不是吗?
    • @Thor:XHTML1 is a "reformulation" of HTML4 as a XML 1.0 application。至于兼容性,w3 验证器只会在您在针对 HTML4 进行验证时关闭非自关闭元素时发出警告(而不是错误)。它在大多数(如果不是所有)浏览器上都可以正常工作。
    • 在过去的几天里,Stackoverflow 不稳定,我之前对你的回答的评论似乎已经丢失了。无论如何,谢谢你的回答。
    • 问题是这不会“工作”。使用 html5 doctype 使 HTML 实体像“©”不可用。 javax.faces.view.facelets.FaceletException: Error Parsing /WEB-INF/templates/basic.xhtml: Error Traced[line: 82] 实体“copy”被​​引用,但未声明。
    • XHTML 在客户端具有大量价值。非常简单的验证而不是关于终止某些标签的各种奇怪规则怎么样?
    【解决方案2】:

    在相关说明中,请查看这篇 IBM developerWorks 文章:JSF 2 fu: HTML5 composite components, Part 1

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        [编辑] 看起来,在 Google 的代码之夏,MyFaces 已经做了一些工作来支持 HTML5 渲染。我不知道它是否应该以有效的方式使用。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-12
            • 1970-01-01
            • 2012-01-06
            • 1970-01-01
            • 2022-12-13
            相关资源
            最近更新 更多