array[index] == 'undefined'
сравнивает значение индекса массива со строкой «undefined».
Вы, вероятно, ищете typeof array[index] == 'undefined'
, который сравнивает тип .
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());
}
При работе с 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();
Один объектно-ориентированный подход заключается в использовании библиотеки под названием 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; по крайней мере, я сделал это на удивление быстро.
Я думаю, что создание HTML вручную с помощью чего-то вроде StringBuilder (или непосредственно в потоке) будет лучшим вариантом, особенно если вы не можете использовать какие-либо внешние библиотеки.
Это не так. возможность использовать любые внешние библиотеки, вы больше пострадаете с точки зрения скорости разработки, чем производительности.
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.
Вы можете создать какой-нибудь объект Element с помощью метода render (), а затем собрать их в древовидную структуру; с помощью алгоритма посещения вы можете затем приступить к установке значений и затем отрендерить все это.
PS: рассматривали ли вы какой-нибудь шаблонизатор, такой как freemarker ?
Похоже, вы можете выполнить то, что пытаетесь, используя прямое построение HTMLDocument.BlockElement
и HTMLDocument.BlockElement
объекты. Эти конструкторы имеют сигнатуру, которая предполагает, что прямое использование возможно, по крайней мере.
Я бы посоветовал изучить исходники Swing в OpenJDK, чтобы увидеть, как синтаксический анализатор справляется с этим, и извлечь оттуда свою логику.
Я бы также предложил, чтобы такая оптимизация может быть преждевременной, и, возможно, это должна быть оптимизированная по скорости замена более простого подхода (например, генерации текста HTML), вводимого только в том случае, если это действительно становится горячей точкой в приложении.
Вы можете использовать любую приличную библиотеку xml, такую как JDom, Xom или XStream. Html - это просто частный случай XML.
Или вы можете использовать один из существующих шаблонов для Java на стороне сервера, например jsp или velocity.
В основном вы можете вставить html в свой HTMLDocument, используя один из методов вставки, insertBeforeEnd (), insertAfterEnd (), insertBeforeStart (), insertAfterStart (). Вы предоставляете методу HTML-код, который хотите вставить, и позицию в дереве документа, в которую вы хотите вставить HTML-код.
например.
doc.insertBeforeEnd (element, html);
Класс HTMLDocument также предоставил методы обхода дерева документа.