代码之家  ›  专栏  ›  技术社区  ›  Behrang Saeedzadeh

可以在HTML 4/5中使用JSF+Facelets吗?

  •  65
  • Behrang Saeedzadeh  · 技术社区  · 14 年前

    Facelets依赖于XML名称空间来使用XHTML。HTML4怎么样,据我所知,HTML5不支持名称空间。另外,HTML5还有一些XHTML中没有的新元素。即使是HTML4和XHTML在它们支持的元素和属性方面也存在一些差异。

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

    5 回复  |  直到 6 年前
        1
  •  88
  •   Community CDub    7 年前

    因为Facelets是一种基于XML的视图技术,它本质上是一个XML标记,所以不能将它与HTML4 doctype一起使用。HTML4 doctype描述了一些不能自动关闭的元素,例如 <link> , <meta> , <br> <hr> . 但是,使用XML,您必须像这样关闭它们 <link/> , <meta/> 等等。因此,使用HTML4 doctype绝对不是facelets的一个选项(也就是说,当您尊重标准和/或害怕w3验证器时,它在大多数情况下(如果不是所有的Webbrowsers)都能很好地工作)。

    另一方面,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 doctype,您应该根据规范使用 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>
    

    你看,facelet已经删除了XHTML声明,因为它们在客户端没有意义。

    而且,

    另外,HTML5还有一些XHTML中没有的新元素

    这也没有道理。这都是关于生成的输出。也可以是HTML5。您唯一的问题可能是浏览器支持和提供HTML5特定元素的第三方JSF组件的可用性。因为JSF 2.2,所以可以使用新的 passthrough elements 将自定义元素转换为JSF组件的特性。只需给HTML5元素a jsf:id 属性。它将在内部透明地解释为 UIPanel JSF组件树中的实例(如 <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页面(如facelets)。但是一些初学者也使用它而不使用任何XML工具,并像往常一样输出它,因为它“太酷了”——原因不明。

    别误会我。XHTML是 伟大的 作为服务器端视图技术。但这并不是客户端标记技术。它在客户方完全没有价值。

    参见:

        2
  •  8
  •   Vetle    14 年前

    在相关的注释中,请参阅以下IBM developerWorks文章: JSF 2 fu: HTML5 composite components, Part 1

        3
  •  4
  •   ogok    12 年前

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

        4
  •  3
  •   Vasil Lukach    6 年前

    我读过,这应该是可能的,但我自己还没有做。也许您应该在XHTML包装代码中使用HTML5。如果我能找到信息的来源,我会知道的。

    [编辑] 似乎,在谷歌的夏季代码中,MyFaces已经做了一些工作来支持HTML5渲染。我不知道它是否应该以一种富有成效的方式使用。

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

        5
  •  2
  •   Martijn Verburg    14 年前

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