仅在 Java 代码中构建 HTML

Posted

技术标签:

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

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

【问题讨论】:

取决于您创建该 HTML 的内容,但是,根据您在问题中提到的内容,我会说 StringBuilder! 这个SO answer 一定很有帮助。 【参考方案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】:

使用jsoup 或wffweb 将是从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

【讨论】:

以上是关于仅在 Java 代码中构建 HTML的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.NoClassDefFoundError:无法解决:Landroid/support/v4/content/LocalBroadcastManager 仅在构建 APK 上

仅在从命令行构建 Qt 项目时出错

仅在 html 代码中使用 javascript 重新加载特定页面一次

仅在“构建并运行”时在 Xcode 中运行 bash 脚本

Ad Hoc 构建仅在设备上崩溃 - ASIHTTPRequest

仅在发布时发生构建错误