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