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

Lam*_*bda 65 xhtml jsf html5 facelets jsf-2

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

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

Bal*_*usC 93

由于Facelets是一种基于XML的视图技术,它本质上是从XML标记中获取和发出的,因此您无法将其与HTML4 doctype一起使用.所述HTML4 DOCTYPE描述了几种元件,其不能自封闭,如<link>,<meta>,<br><hr>.然而,随着XML你不得不关闭它们像<link/>,<meta/>等于是使用HTML4 DOCTYPE是绝对不能用于Facelets的(也就是说,当你尊重的标准和/或害怕W3验证的选项,这将然而很好地工作在大多数(如果不是全部)webbrowsers上).

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

例:

<link type="text/css" href="style.css"/>
Run Code Online (Sandbox Code Playgroud)

作者可以选择在HTML语法中对void元素使用相同的语法.一些作者还选择在斜线之前包含空格,但这不是必需的.(以这种方式使用空格是继承自XHTML 1.0,附录C中的兼容性指南的约定.)

我自己一直使用<!DOCTYPE html>,也使用JSF/Facelets,即使<?xml?>页面顶部没有声明也是如此.它适用于所有浏览器.随着XHTML文档类型,你应该按照规范来使用Content-Typeapplication/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>
Run Code Online (Sandbox Code Playgroud)

这将呈现合法有效的HTML5(对于客户端):

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Title</title>
    </head>
    <body>
        Some text
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

你看,Facelets已经删除了XHTML声明,因为它们在客户端没有任何意义.

和,

HTML 5还有一些XHTML中没有的新元素

这也没意义.这都是关于生成的输出.哪个可以是HTML5一样好.您唯一的问题可能是浏览器支持以及呈现HTML5特定元素的第三方JSF组件的可用性.从JSF 2.2开始,可以使用新的passthrough元素功能将自定义元素转换为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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

也可以看看:


Vet*_*tle 8

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