首页 > 解决方案 > String.format 与 HTML 的使用没有转换问题

问题描述

我需要向 Java 中的 HTML 字符串添加一些内容。该 HTML 用于电子邮件中,该电子邮件由 Java servlet(通过使用jakarta.mail)发送。

HMTL

在一个文件中:

<button style="border: 1px solid #ccc">
    <a href=%s style="display: inline-block; width: 100%; height: 100%">Link can be clicked</a>
</button>

由 读取String mailBodyBase = Files.readString("some/path/to/my.html")

值和格式代码

String URL = "\"https://some.url/at/%s\"";
String urlForUser = String.format(URL, "set236sdgh235JH"); // the argument is actually retrieved from DB
return String.format(mailBodyBase, urlForUser); // Exception occures here

预期结果

<button style="border: 1px solid #ccc">
    <a href="https://some.url/at/set236sdgh235JH" style="display: inline-block; width: 100%; height: 100%">Link can be clicked</a>
</button>

我正在这样做而不是更简单.concat(),因为我们可能希望在某些时候向 HTML 添加更多值。

例外

但我得到一个UnknownFormatConversionException

java.util.UnknownFormatConversionException: Conversion = ';'
    at java.util.Formatter.checkText(Formatter.java:2732) ~[?:?]
    at java.util.Formatter.parse(Formatter.java:2718) ~[?:?]
    at java.util.Formatter.format(Formatter.java:2655) ~[?:?]
    at java.util.Formatter.format(Formatter.java:2609) ~[?:?]
    at java.lang.String.format(String.java:2897) ~[?:?]

同样适用于:

<html style="padding: 30px 0 0 30px; font-size: 16px">
    <h2 style="background-color: #0077bd; color: #eff; padding: 10px 5px;">App Name</h2>
    %1$s
</html>

并将内容放入此框架中String body = String.format [...];

解决方案

用另一个%掩盖CSS 中的%

老的:

我已经阅读String.format的文档和教程,但我看不到那里的问题。它可能与HTML 中的引号 ( " ) 有关。

我是否需要使用其他工具或String.format以不同的方式?

标签: javahtmlformat

解决方案


我已经重现了这个问题。

以下行中的问题:

<a href=%s style="display: inline-block; width: 100%; height: 100%">Link can be 
clicked</a>

使用 String.format() 函数时,我们使用 %s 或 %d 作为占位符来放置值。

在您的情况下,< a >标签的样式属性为 ; 和 % 导致错误。您可以通过将样式属性替换为类名来修复它。

在您的 css 文件中创建样式类,如下所示:

.styleClassName{
 display: inline-block; 
 width: 100%; 
 height: 100%
}

并更改样式属性如下:

<a href=%s class='styleClassName'>Link can be 
clicked</a>

请评论它是否有效。


推荐阅读