11

外部で文字列を生成し、HTMLEditorKit#read を使用して解析することなく、Java でプログラムによって HTMLDocument オブジェクトを生成する方法を知っている人はいますか? 私が尋ねる2つの理由:

まず、私の HTML 生成ルーチンは非常に高速である必要があり、文字列を内部モデルに解析することは、このモデルを直接構築するよりもコストがかかると思います。

第 2 に、オブジェクト指向のアプローチにより、よりクリーンなコードが得られる可能性があります。

また、ライセンス上の理由から、JVM に同梱されているもの以外のライブラリを使用することはできません。

ありがとう、トム

4

9 に答える 9

9

オブジェクト指向のアプローチの 1 つは、ECSというライブラリを使用することです。

これは非常に単純なライブラリであり、長い間変更されていません。繰り返しになりますが、HTML 4.01 仕様も変更されていません ;) 私は ECS を使用しており、文字列または StringBuffers/StringBuilders だけで大きな HTML フラグメントを生成するよりもはるかに優れていると考えています。

小さな例:

Option optionElement = new Option();
optionElement.setTagText("bar");
optionElement.setValue("foo");
optionElement.setSelected(false);   

optionElement.toString()次のようになります。

<option value='foo'>bar</option>

このライブラリは、HTML 4.0 と XHTML の両方をサポートしています。最初に私を大いに悩ませたのは、XHTML バージョンに関連するクラスの名前が小文字で始まることだけでした: 、、、、optionなどinputatrこれは最も基本的な Java 規則に反します。しかし、XHTML を使用したい場合は、これに慣れることができます。少なくとも私はそうしました。驚くほど速く。

于 2009-06-05T14:29:25.673 に答える
7

私は、JSP がどのように機能するかを調べたいと思います。つまり、基本的に 1 つの巨大な StringBuffer 追加セットであるサーブレットにコンパイルされます。タグは、Java コード スニペットにもコンパイルされます。これは面倒ですが、非常に高速であり、Tomcat の作業ディレクトリを詳しく調べない限り、このコードを確認することはできません。おそらく、JSP のような HTML 中心のビューから HTML 生成を実際にコーディングし、ループ用のタグを追加するなどして、プロジェクト内で同様のコード生成エンジンとコンパイラを内部的に使用することが必要な場合があります。

または、「openTag」、「closeTag」、「openTagWithAttributes」、「startTable」などのメソッドを持つユーティリティ クラスで StringBuilder を自分で処理するだけです... Builder パターンを使用でき、コードは次のようになります。お気に入り:

public static void main(String[] args) {
    TableBuilder t = new TableBuilder();
    t.start().border(3).cellpadding(4).cellspacing(0).width("70%")
      .startHead().style("font-weight: bold;")
        .newRow().style("border: 2px 0px solid grey;")
          .newHeaderCell().content("Header 1")
          .newHeaderCell().colspan(2).content("Header 2")
      .end()
      .startBody()
        .newRow()
          .newCell().content("One/One")
          .newCell().rowspan(2).content("One/Two")
          .newCell().content("One/Three")
        .newRow()
          .newCell().content("Two/One")
          .newCell().content("Two/Three")
      .end()
    .end();
    System.out.println(t.toHTML());
}
于 2009-06-05T14:33:53.650 に答える
4

XHTMLを扱うとき、私は Java 6 のXMLStreamWriterインターフェースを使用して多くの成功を収めました。

OutputStream destination = ...;
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter xml = outputFactory.createXMLStreamWriter(destination);

xml.writeStartDocument();
xml.writeStartElement("html");
xml.writeDefaultNamespace("http://www.w3.org/1999/xhtml");

xml.writeStartElement("head");
xml.writeStartElement("title");
xml.writeCharacters("The title of the page");
xml.writeEndElement();
xml.writeEndElement();

xml.writeEndElement();
xml.writeEndDocument();
于 2009-06-05T14:39:18.197 に答える
3

特に外部ライブラリを使用できない場合は、StringBuilder などを介して (またはストリームに直接) HTML を手動で生成することが最善の選択肢になると思います。

外部ライブラリを使用できないため、パフォーマンスよりも開発の速度が低下します。

于 2009-06-05T14:31:05.577 に答える
2

javax.swing.text.html にはHTMLWriterHTMLDocumentとりわけクラスがあります。私はそれらを使用していません。私は.NetHtmlWriterで使用しましたが、それはまさにあなたが望むことを行いますが、Javaバージョンは同じではないかもしれません.

ドキュメントは次のとおりです。http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/text/html/HTMLWriter.html

StringBuilderまた、オブジェクトレイヤーで構築するよりも遅いとは想像できません。オブジェクト指向のアプローチでは、オブジェクト グラフを作成してから文字列を生成する必要があるように思えます。このようなものに生の文字列を使用しない主な理由は、エンコーディング エラーや、不正な形式のドキュメントを生成するその他のエラーが確実に発生するためです。

オプション 2: お気に入りの XML API を使用して XHTML を生成できます。

于 2009-06-05T14:34:37.567 に答える
1

render() メソッドを使用して Element オブジェクトを作成し、それらをツリー構造に組み立てたい場合があります。訪問アルゴリズムを使用すると、値の設定に進み、全体をレンダリングできます。

PS: freemarkerのようなテンプレート エンジンを検討しましたか?

于 2009-06-05T14:30:09.477 に答える
1

オブジェクトの直接構築HTMLDocument.BlockElementを使用して、試みていることを達成できるようです。HTMLDocument.BlockElementこれらのコンストラクターには、少なくとも直接使用が可能であることを示唆する署名があります。

OpenJDK の Swing ソースを調べて、パーサーがこれをどのように処理するかを確認し、そこからロジックを導き出すことをお勧めします。

また、この最適化は時期尚早である可能性があり、おそらくこれは、アプリケーションで実際にパフォーマンスのホットスポットになる場合にのみ導入される、より単純なアプローチ (つまり、HTML テキストの生成) の速度を最適化した代替になるはずです。

于 2009-06-05T15:36:05.620 に答える
0

基本的に、insertBeforeEnd()、insertAfterEnd()、insertBeforeStart()、insertAfterStart() のいずれかの挿入メソッドを使用して、html を HTMLDocument に挿入できます。メソッドに、挿入する html と、html を挿入するドキュメント ツリー内の位置を指定します。

例えば。

doc.insertBeforeEnd(要素、html);

HTMLDocument クラスには、ドキュメント ツリーを走査するためのメソッドも用意されています。

于 2009-06-06T01:30:13.223 に答える
0

JDom、Xom、XStream などのまともな xml ライブラリを使用できます。Html は、XML の特殊なケースです。

または、jsp や速度などのサーバー側 Java 用の既存のテンプレート エンジンの 1 つを使用できます。

于 2009-06-05T14:30:57.387 に答える