【问题标题】:Building HTML in Java code only仅在 Java 代码中构建 HTML
【发布时间】:2011-10-14 22:17:00
【问题描述】:

创建包含 HTML(具有正确编码)的 String 对象(我想)的最简单、最快的方法是什么,我可以在 @ResponseBody (Spring MVC) 中返回它?

【问题讨论】:

  • 取决于您创建该 HTML 的内容,但是,根据您在问题中提到的内容,我会说 StringBuilder!
  • 这个SO answer 一定很有帮助。

标签: java html spring-mvc


【解决方案1】:

可以有多种方法。

首先您可以使用 String 或 StringBuilder。这对于像 <html>Hello, <b>world</b></html> 这样的极短的 HTML 很有用。

如果 HTML 更复杂,使用一些 API 会更容易。看看这些链接:

http://xerces.apache.org/xerces-j/apiDocs/org/apache/html/dom/HTMLBuilder.html

Java HTML Builder (anti-template) library?

或在谷歌中搜索html builder java

其他可能性是模板。如果您确实有一个模板希望替换几个单词,您可以将您的 HTML 编写为 *.html 文件,并使用 {0}{} 标记参数。然后只需使用java.text.MessageFormat 创建实际的 HTML 文本。

下一个方法是使用像 Velocity 这样的“真实”模板引擎。

【讨论】:

    【解决方案2】:

    这对你有用吗?

    StringBuilder htmlBuilder = new StringBuilder();
    htmlBuilder.append("<html>");
    htmlBuilder.append("<head><title>Hello World</title></head>");
    htmlBuilder.append("<body><p>Look at my body!</p></body>");
    htmlBuilder.append("</html>");
    String html = htmlBuilder.toString();
    

    【讨论】:

    • 当您说编码时,您是指 UTF-8 等吗?或“>”东西?
    • 是的,UTF-8。我说类似htmlBuilder.append("&lt;head&gt;&lt;title&gt;Hello Łódź&lt;/title&gt;&lt;/head&gt;");
    • Java 在内部使用 UTF-8 编码,因此您在 Java 中输入的任何内容都已采用 UTF-8 编码。这能回答你的问题吗?
    • 如果你知道字符串会超过十六个字符,最好分配一个大的初始缓冲区:new StringBuilder(1000)
    • 为了补全,可以使用String.format合并属性值,即:htmlBuilder.append(String.format("", 值, 标签));
    【解决方案3】:

    从 Java 13 开始,添加了一个名为 Text Blocks 的新功能。要使用文本块,您必须使用 三个 双引号 AKA """,以打开和关闭 String

    此功能允许我们构建诸如 html 之类的东西,而无需连接字符串、处理新行或使用库并非常清晰、轻松地构建 String

    下面是一个使用html 的新功能的简短示例:

    String html = """
                  <html>
                      <body>
                          <p>Hello, world</p>
                      </body>
                  </html>
                  """;
    

    这相当于下面的代码,不使用文本块:

    String html = "<html>\n" +
                  "    <body>\n" +
                  "        <p>Hello, world</p>\n" +
                  "    </body>\n" +
                  "</html>\n";
    

    来源: JEP 355: Text Blocks

    【讨论】:

      【解决方案4】:

      好方法是将 style=""s 提取到头部?

      sb.append("<style>" +
      "td { padding: 6px; border: 1px solid #ccc; text-align: left; }" + 
      "th { background: #333; color: white; font-weight: bold; padding: 6px; border: 1px solid #ccc; text-align: left;}" +
      "</style>");
      

      辅助方法:

      void appendTag(StringBuilder sb, String tag, String contents) {
          sb.append('<').append(tag).append('>');
          sb.append(contents);
          sb.append("</").append(tag).append('>');
      }
      void appendDataCell(StringBuilder sb, String contents) {
          appendTag(sb, "td", contents);
      }
      void appendHeaderCell(StringBuilder sb, String contents) {
          appendTag(sb, "th", contents);
      }
      

      【讨论】:

        【解决方案5】:

        使用jsoupwffweb 将是从Java 代码构建HTML 的最简单方法。您可以使用它动态生成 HTML。

        例如 jsoup:

        Document doc = Jsoup.parse("<html></html>");
        doc.body().addClass("body-styles-cls");
        doc.body().appendElement("div");
        System.out.println(doc.toString());
        

        将打印

        <html>
         <head></head>
         <body class=" body-styles-cls">
          <div></div>
         </body>
        </html>
        

        例如 wffweb:

        Html rootTag = new Html(null).give(html -> {
            new Head(html);        
            new Body(html).give(body -> {
                new NoTag(body, "Hello World");            
            });
        });
        rootTag.setPrependDocType(true);
        System.out.println(rootTag.toHtmlString());
        

        将打印

        <!DOCTYPE html>
        <html>
           <head></head>
           <body>
              Hello World
           </body>
        </html>
        

        您还可以使用toOutputStream​(OutputStream os, String charset) 方法以指定的字符集编码写入OutputStream

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多