什么是标记(HTML)生成的好方法?

时间:2011-07-19 09:41:51

标签: java html api frameworks

前段时间我在这里问了good html object model in java。 我收到了一个指向Element Construction Set项目的好答案:

我很高兴地使用这个API来快速构建一些HTML报告。

最近访问项目网站时,我发现它已被移至“The Apache Attic”,该项目的作者鼓励其用户切换到其他技术来生成标记。 < / p>

我的问题是关于这最后一句话:
标记生成的其他好方法是什么?

我没有构建HTML客户端,我只需要从服务器端数据生成HTML格式的报告。我考虑过一些替换工具,但我找不到下一个工具:

  • groovy及其标记构建器
  • 免费标记
  • xslt
  • jasper报告

我喜欢ECS的原因是它纯粹是用Java(没有新的语法和概念可供学习,其他项目库可用),它非常小,它包含所有公共html元素和属性的定义(易于使用自动完成,无需拥有HTML文档 - &gt;适用于仅具有HTML基础知识的服务器端开发人员)

目前我正在浪费时间进行调查,玩弄一些潜在的替换者,但我很乐意收到反馈,帮助我重新专注于完成任务。

您会推荐哪种其他技术用于此类用途,并且具有与ECS相同的易用性?

2 个答案:

答案 0 :(得分:0)

根据我的经验,最有效的是模板机制和转义标记的功能(处理&lt; &amp; &quot;&apos;会这样做。选择任何支持循环和条件等基本控制结构的模板引擎。

不要使用对象模型来生成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 &amp;</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);
    }
}

完整代码:https://github.com/jjYBdx4IL/java-evaluation/blob/master/src/test/java/tests/javax/xml/XhtmlGenTest.java

直接发送:

@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"));
}

完整代码:https://github.com/jjYBdx4IL/java-evaluation/blob/master/src/test/java/tests/javax/xml/stream/XMLStreamWriterTest.java

你可能也会考虑使用ECS,但它已经退役,并且不支持像&amp;这样的特殊字符的隐式处理。我已将其更新为使用Java 8进行编译:https://github.com/jjYBdx4IL/misc/tree/master/ecs不确定何时将其部署到maven central tho。我还修改了它以包含javadoc,源代码和调试符号,所有这些都是maven central上的现有发行版所没有提供的。