Программное поколение HTMLDocument с помощью Java

array[index] == 'undefined' сравнивает значение индекса массива со строкой «undefined».
Вы, вероятно, ищете typeof array[index] == 'undefined', который сравнивает тип .

11
задан Yishai 5 June 2009 в 15:31
поделиться

9 ответов

I'd look into how JSPs work - i.e., they compile down into a servlet that is basically one huge long set of StringBuffer appends. The tags also compile down into Java code snippets. This is messy, but very very fast, and you never see this code unless you delve into Tomcat's work directory. Maybe what you want is to actually code your HTML generation from a HTML centric view like a JSP, with added tags for loops, etc, and use a similar code generation engine and compiler internally within your project.

Alternatively, just deal with the StringBuilder yourself in a utility class that has methods for "openTag", "closeTag", "openTagWithAttributes", "startTable", and so on... it could use a Builder pattern, and your code would look like:

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());
}
7
ответ дан 3 December 2019 в 03:36
поделиться

При работе с 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();
4
ответ дан 3 December 2019 в 03:36
поделиться

Один объектно-ориентированный подход заключается в использовании библиотеки под названием ECS .

Это довольно простая библиотека, которая не менялась годами. С другой стороны, спецификация HTML 4.01 тоже не изменилась;) Я использовал ECS и считаю, что это намного лучше, чем создание больших фрагментов HTML с помощью только строк или StringBuffers / StringBuilders.

Небольшой пример:

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 , input , a , tr и так далее, что противоречит самым основным соглашениям Java. Но это' s то, к чему вы можете привыкнуть, если хотите использовать XHTML; по крайней мере, я сделал это на удивление быстро.

9
ответ дан 3 December 2019 в 03:36
поделиться

Я думаю, что создание HTML вручную с помощью чего-то вроде StringBuilder (или непосредственно в потоке) будет лучшим вариантом, особенно если вы не можете использовать какие-либо внешние библиотеки.

Это не так. возможность использовать любые внешние библиотеки, вы больше пострадаете с точки зрения скорости разработки, чем производительности.

3
ответ дан 3 December 2019 в 03:36
поделиться

javax.swing.text.html has HTMLWriter and HTMLDocument class among others. I have not used them. I have used the HtmlWriter in .Net and it does exactly what you want, but the java version may not work out to be the same.

Here is the doc: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/text/html/HTMLWriter.html

Also, I can't imagine a StringBuilder being slower than building with an object layer. It seems to me that any object oriented approach would have to build the object graph AND then produce the string. The main reason not to use raw strings for this stuff is that you are sure to get encoding errors as well as other mistakes that produce malformed documents.

Option 2: You could use your favorite XML api's and produce XHTML.

2
ответ дан 3 December 2019 в 03:36
поделиться

Вы можете создать какой-нибудь объект Element с помощью метода render (), а затем собрать их в древовидную структуру; с помощью алгоритма посещения вы можете затем приступить к установке значений и затем отрендерить все это.

PS: рассматривали ли вы какой-нибудь шаблонизатор, такой как freemarker ?

1
ответ дан 3 December 2019 в 03:36
поделиться

Похоже, вы можете выполнить то, что пытаетесь, используя прямое построение HTMLDocument.BlockElement и HTMLDocument.BlockElement объекты. Эти конструкторы имеют сигнатуру, которая предполагает, что прямое использование возможно, по крайней мере.

Я бы посоветовал изучить исходники Swing в OpenJDK, чтобы увидеть, как синтаксический анализатор справляется с этим, и извлечь оттуда свою логику.

Я бы также предложил, чтобы такая оптимизация может быть преждевременной, и, возможно, это должна быть оптимизированная по скорости замена более простого подхода (например, генерации текста HTML), вводимого только в том случае, если это действительно становится горячей точкой в ​​приложении.

1
ответ дан 3 December 2019 в 03:36
поделиться

Вы можете использовать любую приличную библиотеку xml, такую ​​как JDom, Xom или XStream. Html - это просто частный случай XML.

Или вы можете использовать один из существующих шаблонов для Java на стороне сервера, например jsp или velocity.

0
ответ дан 3 December 2019 в 03:36
поделиться

В основном вы можете вставить html в свой HTMLDocument, используя один из методов вставки, insertBeforeEnd (), insertAfterEnd (), insertBeforeStart (), insertAfterStart (). Вы предоставляете методу HTML-код, который хотите вставить, и позицию в дереве документа, в которую вы хотите вставить HTML-код.

например.

doc.insertBeforeEnd (element, html);

Класс HTMLDocument также предоставил методы обхода дерева документа.

0
ответ дан 3 December 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: