web-dev-qa-db-ja.com

HTML 4/5でJSF + Faceletsを使用することはできますか?

Faceletsは、XML名前空間に依存してXHTMLを処理します。 HTML 4はどうですか。私が知る限り、HTML 5は名前空間をサポートしていません。また、HTML 5には、XHTMLでは利用できない新しい要素がいくつかあります。 HTML 4とXHTMLでさえ、サポートする要素と属性に関していくつかの違いがあります。

問題は、Faceletsを使用してHTML 4/5ドキュメントをレンダリングすることは可能ですか?もしそうなら、どのように?

65
Behrang

Faceletsは本質的にXMLマークアップを食べて放出するXMLベースのビューテクノロジーであるため、HTML4 Doctypeでは使用できません。 HTML4 doctypeは、<link><meta><br>、および<hr>など、自己完結型ではないいくつかの要素を記述します。ただし、XMLでは<link/><meta/>などのように強制的に閉じる必要があるため、HTML4 Doctypeを使用することはFaceletsのオプションではありません(つまり、標準やw3バリデーターを恐れてください。ただし、すべてではないにしても、ほとんどのWebブラウザーで完全に機能します)。

一方、HTML5はXMLマークアップを許可します。これは .2.2章-要素 で指定されています:

例:

<link type="text/css" href="style.css"/>

作成者は、オプションで、HTML構文のvoid要素にもこの同じ構文を使用することを選択できます。一部の著者は、スラッシュの前に空白を含めることも選択していますが、これは必須ではありません。 (その方法で空白を使用することは、XHTML 1.0、付録Cの互換性ガイドラインから継承された規則です。)

私自身も<!DOCTYPE html>をすべて使用しています。JSF/ Faceletsでも、ページ上部に<?xml?>宣言がなくても使用します。すべてのブラウザで完全に機能します。 XHTML Doctypeを使用すると、仕様に従って、Content-Type of application/xhtml+xmlを使用する必要があります。これにより、MSIEがチョークするだけになります(理解できません)。そして、それは依然として最も広く使用されているブラウザの1つです... 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固有の要素をレンダリングするサードパーティの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開発を容易にすることです。ただし、XMLツールを使用せずにそのまま使用し、そのまま出力する場合もあります。これは、理由が不明なため「クール」だからです。

誤解しないでください。 XHTMLは、サーバーサイドビューテクノロジーとしてgreatです。しかし、単にクライアント側のマークアップ技術としてではありません。クライアント側ではまったく価値がありません。

こちらもご覧ください:

93
BalusC

関連するメモについては、このIBM developerWorksの記事をご覧ください。 JSF 2 fu:HTML5複合コンポーネント、パート1

8
Vetle

MyFacesには、html5の拡張機能があります。これを試してください http://myfaces.Apache.org/html5/

4
ogok

これは可能であるべきだと読みましたが、私はまだそれをしませんでした。 xHTMLラッパーコード内でHTML 5を使用する必要があるかもしれません。情報源を見つけることができれば、また見ます。

[編集] MyFacesでは、Googleの夏のコードの間にHTML5レンダリングをサポートするための作業が行われたようです。生産的な方法で使用すべきかどうかはまだわかりません。

機能するようになったら、フィードバックをお寄せください。 [/編集]

3
PageFault

http://wiki.whatwg.org/wiki/HTML_vs._XHTML には、XHTMLからの移行を支援するためにHTML5で名前空間を使用する方法に関する有用な情報があります。おそらく、名前空間が示唆するとおりに名前空間を適用して、何が起こるかを確認できますか?

2
Martijn Verburg