前段时间我在这里问了good html object model in java。 我收到了一个指向Element Construction Set项目的好答案:
我很高兴地使用这个API来快速构建一些HTML报告。
最近访问项目网站时,我发现它已被移至“The Apache Attic”,该项目的作者鼓励其用户切换到其他技术来生成标记。 < / p>
我的问题是关于这最后一句话:
标记生成的其他好方法是什么?
我没有构建HTML客户端,我只需要从服务器端数据生成HTML格式的报告。我考虑过一些替换工具,但我找不到下一个工具:
我喜欢ECS的原因是它纯粹是用Java(没有新的语法和概念可供学习,其他项目库可用),它非常小,它包含所有公共html元素和属性的定义(易于使用自动完成,无需拥有HTML文档 - &gt;适用于仅具有HTML基础知识的服务器端开发人员)
目前我正在浪费时间进行调查,玩弄一些潜在的替换者,但我很乐意收到反馈,帮助我重新专注于完成任务。
您会推荐哪种其他技术用于此类用途,并且具有与ECS相同的易用性?
答案 0 :(得分:0)
根据我的经验,最有效的是模板机制和转义标记的功能(处理<
&
"
和'
会这样做。选择任何支持循环和条件等基本控制结构的模板引擎。
不要使用对象模型来生成HTML。
答案 1 :(得分:0)
以下是4个解决方案。
第一个可能是最好的一个:https://j2html.com/
// https://j2html.com/examples.html
@Test
public void test() {
String s = document(
html(
head(
title("Title"),
link().withRel("stylesheet").withHref("/css/main.css")),
body(
main(attrs("#main.content"),
h1("Heading!"))))).toString();
assertEquals("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
+ "<html>\n"
+ " <head>\n"
+ " <title>\n"
+ " Title\n"
+ " </title>\n"
+ " <link type=\"text/css\" rel=\"stylesheet\" href=\"/css/main.css\">\n"
+ " </head>\n"
+ " <body>\n"
+ " <main id=\"main\" class=\"content\">\n"
+ " <h1>\n"
+ " Heading!\n"
+ " </h1>\n"
+ " </main>\n"
+ " </body>\n"
+ "</html>\n", JtidyTest.tidyHtml(s));
}
它不支持漂亮的打印。使用jtidy:
public static String tidyHtml(String inputHtml) {
Properties oProps = new Properties();
oProps.setProperty("new-blocklevel-tags", "main");
Tidy tidy = new Tidy();
tidy.setConfigurationFromProps(oProps);
tidy.setXHTML(false);
tidy.setDocType("loose");
tidy.setQuiet(true);
tidy.setShowWarnings(false);
tidy.setTidyMark(false);
tidy.setIndentContent(true);
StringWriter writer = new StringWriter();
tidy.parse(new StringReader(inputHtml), writer);
return writer.toString().replace("\r", "");
}
以下两个示例/解决方案仅使用Java自己的XML内容,因此不提供显式的HTML支持,这有点不方便。
来自对象模型:
@Test
public void test() throws Exception {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element htmlElement = doc.createElement("html");
htmlElement.setAttribute("xmlns", "http://www.w3.org/1999/xhtml");
doc.appendChild(htmlElement);
Element headElement = doc.createElement("head");
htmlElement.appendChild(headElement);
Element titleElement = doc.createElement("title");
titleElement.appendChild(doc.createTextNode("The title of the page &"));
headElement.appendChild(titleElement);
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+ "<head>\n"
+ "<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"
+ "<title>The title of the page &</title>\n"
+ "</head>\n"
+ "</html>\n",
transform(doc));
}
static String transform(Document doc) {
try {
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, result);
return writer.toString().replace("\r", "");
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
直接发送:
@Test
public void testGenerateXHTML() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter xml = outputFactory.createXMLStreamWriter(baos);
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();
assertEquals("<?xml version='1.0' encoding='UTF-8'?><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>The title of the page</title></head></html>",
baos.toString("UTF-8"));
}
你可能也会考虑使用ECS,但它已经退役,并且不支持像&amp;这样的特殊字符的隐式处理。我已将其更新为使用Java 8进行编译:https://github.com/jjYBdx4IL/misc/tree/master/ecs不确定何时将其部署到maven central tho。我还修改了它以包含javadoc,源代码和调试符号,所有这些都是maven central上的现有发行版所没有提供的。