【问题标题】:String.format usage with HTML without Conversion problemString.format 与 HTML 的使用没有转换问题
【发布时间】:2021-10-01 11:13:26
【问题描述】:

我需要向 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 中的 %

旧:

我已经阅读了the docs for String.formattutorial,但我看不到那里的问题。它可能与 HTML 中的引号 (") 有关。

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

【问题讨论】:

  • @user16320675 % 应该是一个占位符。 href 的 url 应该准确地放在那里:&lt;a href=%s style="display: inline-block; width: 100%; height: 100%"&gt;。格式字符串/文件中没有%;
  • @user16320675 哦,f*ck,是的,你说的太对了。很抱歉不能用我的眼睛。

标签: java html format


【解决方案1】:

我已经重现了这个问题。

以下行中的问题:

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

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

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

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

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

并更改样式属性如下:

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

如果它有效,请发表评论。

【讨论】:

  • 感谢您的解决方案。它可能会起作用,但我只会用另一个 % 掩盖 width: 100%; 等中的 %
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2020-09-19
  • 1970-01-01
相关资源
最近更新 更多