是否可以将JSF + Facelets与HTML 4/5一起使用?

时间:2010-05-29 16:19:28

标签: html5 jsf jsf-2 xhtml facelets

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

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

5 个答案:

答案 0 :(得分:90)

由于Facelets是一种基于XML的视图技术,它本质上可以使用XML标记,因此不能将其与HTML4文档类型一起使用。 HTML4 doctype描述了几个无法自动关闭的元素,例如<link><meta><br><hr>。但是,使用XML时,您不得不关闭它们,如<link/><meta/>等。因此,使用HTML4 doctype绝对不是Facelets的选项(即,当您尊重标准和/或担心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窒息(它不理解它)。由于它仍然是使用最广泛的浏览器之一... text/html替换XHTML内容类型为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特定元素的第三方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是伟大的作为服务器端视图技术。但根本不是客户端标记技术。它在客户端完全没有价值。

另见:

答案 1 :(得分:8)

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:2)

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