Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java编程生成HTMLDocument_Java_Html_Construction - Fatal编程技术网

使用Java编程生成HTMLDocument

使用Java编程生成HTMLDocument,java,html,construction,Java,Html,Construction,有人知道如何在Java中以编程方式生成HTMLDocument对象,而不必在外部生成字符串,然后使用HTMLEditorKit#read解析它吗?我提出这一问题有两个原因: 首先,我的HTML生成例程需要非常快,并且我假设将字符串解析为内部模型比直接构建该模型成本更高 其次,面向对象的方法可能会产生更干净的代码 我还应该提到,出于许可的原因,我不能使用JVM附带的库以外的任何库 谢谢, Tom一种面向对象的方法是使用名为的库 这是一个相当简单的图书馆,多年来一直没有改变。同样,HTML4.01规

有人知道如何在Java中以编程方式生成HTMLDocument对象,而不必在外部生成字符串,然后使用HTMLEditorKit#read解析它吗?我提出这一问题有两个原因:

首先,我的HTML生成例程需要非常快,并且我假设将字符串解析为内部模型比直接构建该模型成本更高

其次,面向对象的方法可能会产生更干净的代码

我还应该提到,出于许可的原因,我不能使用JVM附带的库以外的任何库

谢谢,
Tom

一种面向对象的方法是使用名为的库

这是一个相当简单的图书馆,多年来一直没有改变。同样,HTML4.01规范也没有改变;)我使用了ECS,并认为它比用字符串或StimeBuffs/StrugBuffisher生成大的HTML片段要好得多。 小例子:

Option optionElement = new Option();
optionElement.setTagText("bar");
optionElement.setValue("foo");
optionElement.setSelected(false);   
optionElement.toString()
现在将产生:

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

该库同时支持HTML4.0和XHTML。最初困扰我的唯一一件事是,与XHTML版本相关的类的名称以小写字母开头:
选项
输入
a
tr
,等等,这违反了最基本的Java约定。但是,如果您想使用XHTML,您可以习惯这一点;至少我做到了,速度惊人。

您可能希望使用render()方法构建一些元素对象,然后将它们组装到树结构中;使用访问算法,您可以继续设置值,然后渲染整个内容


PS:您考虑过像这样的模板引擎吗?

您可以使用任何像样的xml库,如JDom、Xom或XStream。Html只是XML的一个特例


或者,您可以使用一个现有的用于服务器端java的模板引擎,如jsp或velocity。

我认为通过StringBuilder(或直接到流)之类的工具手动生成HTML将是您的最佳选择,尤其是当您无法使用任何外部库时


由于无法使用任何外部库,您将在开发速度而不是性能方面受到更大的影响。

我将研究JSP是如何工作的——即,它们编译成一个servlet,基本上是一个庞大的StringBuffer附加集。这些标记还向下编译为Java代码片段。这很混乱,但速度非常快,除非深入研究Tomcat的工作目录,否则您永远看不到这段代码。也许您想要的是从一个以HTML为中心的视图(如JSP)实际编写HTML生成代码,添加循环标记等,并在项目内部使用类似的代码生成引擎和编译器

或者,只需在一个实用程序类中处理StringBuilder,该类具有“openTag”、“closeTag”、“openTagWithAttributes”、“startTable”等方法。。。它可以使用生成器模式,您的代码如下所示:

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());
}

javax.swing.text.html有
HTMLWriter
HTMLDocument
类。我没有用过。我在.Net中使用了
HtmlWriter
,它完全满足了您的需求,但java版本可能不尽相同

这是文件:

此外,我无法想象一个
StringBuilder
比使用对象层构建要慢。在我看来,任何面向对象的方法都必须构建对象图,然后生成字符串。不使用原始字符串的主要原因是,您肯定会遇到编码错误以及其他导致文档格式错误的错误


选项2:您可以使用您最喜欢的XML api并生成XHTML。

在处理XHTML时,我使用Java 6的接口取得了很大成功

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();

似乎可以通过直接构造
HTMLDocument.BlockElement
HTMLDocument.BlockElement
对象来完成您正在尝试的任务。这些构造器有一个签名,表明至少可以直接使用

我建议检查OpenJDK中的Swing源代码,看看解析器如何处理这个问题,并从中导出您的逻辑


我还建议,这种优化可能还为时过早,也许这应该是一种速度优化的方法,以取代更简单的方法(即生成HTML文本)仅当这确实成为应用程序中的性能热点时才引入。

基本上,您可以使用插入方法之一insertBeforeEnd()、insertAfterEnd()、insertBeforeStart()、insertAfterStart()将html插入HTMLDocument。 您可以为该方法提供要插入的html以及要插入html的文档树中的位置

例如

doc.insertbeforeed(元素,html)


HTMLDocument类还提供了遍历文档树的方法。

为什么需要解析正在生成的HTML?你是否需要能够插入可能会失效的内联HTML?谢谢你的提问:mmyers:HTML奥利弗:对不起,我没说清楚。如果我正确理解了您的问题,我将从HTML生成一个HTMLDocument(使用HTMLEditorKit#read)由JTextPane呈现。同样,这并不能解释为什么需要生成然后解析。解析不是我做的。但是,我假设swing必须在封面下解析HTML,以便在JTextArea中呈现HTML(否则每次它想要重画窗格时都会不必要地重新分析对象)。我想找到一些跳过这一步的方法,直接生成对象,而不是生成字符串(Swing可能会解析到对象中)。因为您需要生成一个已定义的目标对象(HTMLDocument),所以只有在API