Freemarker 模板:调用 java 方法并将返回的字符串用作 html

问题描述 投票:0回答:1

我有一个 ftl freemarker 模板文件,我将一些对象(包含所需元素的列表)传递给它并尝试处理 html 输出页面。问题是我需要使用这个对象实现一些复杂的逻辑,所以如果我使用 freemarkers

if's
list
和 e.t.c.它会变得太复杂和不必要的大(因为我会在页面的多个地方复制相同的逻辑)。

我想根据所需元素的大小(按键)呈现表格行,但显然有时没有元素,所以如果发生这种情况我也需要呈现一个空行,所以我在 java 代码中更容易做到。我知道如何从 ftl 文件调用方法,我的问题是如何从我的 java 代码中正确返回一行的 html 字符串并将其放入模板中以便将其呈现为 html 字符串? 例如,当我在一个表行中按键放置所有需要的条目时,该行看起来像这样:

<tr>
                <td>${object.getNumbers("key1")}</td> // multiple names, but all in one <td> element
                <td>${object.getNames("key1")}</td> // same, all names for all entries by "key1"
                <td>${object.getDescriptions("key1")}</td>
            </tr>
<tr>
                <td>${object.getNumbers("key2")}</td>
                <td>${object.getNames("key2")}</td>
                <td>${object.getDescriptions("key2")}</td>
            </tr>

所以基本上它是一个包含所需对象列表的对象,但现在我需要在单独的行中打印每个键的每个条目(在上面的示例中,所有条目信息都打印在一行中),但我不想在 ftl 文件中编写复杂的逻辑,因为它看起来像这样,我什至不确定它是否有效:

<#if(object.isPresent("key")>
<#list object.getEntries("key") as entry>
<tr> // printing every entry
<td>...
...
<tr>
<#else>
<tr> // empty tr if there's nothing
...
<#if>

它看起来已经很大而且只是一个键,所以我在想也许使用 java 代码编写这样的东西会更容易:

...
public String renderRow(String key){
 StringBuilder sb = new StringBuilder();
if(elements.contains(key)){
for(var element: elements.get(key)){
sb.append("<tr>");
sb.append("<td>");
sb.append(element.getNumber());
...
}
else{
sb.append(makeEmtpyRow());
}
return sb.toString(); // escape?
}
...

所以我可以使用java代码将需要的表格行放在一起,因为这样更容易实现,然后在页面中使用返回的html代码。我怎样才能做到这一点?我读过返回值将按原样打印,而不是 html。我应该如何从 ftl 文件中调用它,以便将其正确呈现为 html 字符串?

<table>
#{object.renderRow("key1")} // I guess this won't work because it will be a literal string instead of html?
#{object.renderRow("key2")}
...
</table>

此外,在从 Java 代码返回字符串之前,我是否需要进行任何特殊转义?如果是,那么正确的做法是什么以及如何做?我试图搜索一些示例,但不幸的是没有找到任何像这种情况的东西,而且官方网站上的指南太复杂了

java html spring-boot freemarker
1个回答
-2
投票

假设你正在使用 HTML 自动转义(你应该),而不是像

String
这样的
"This is <em>HTML</em>!"
,在你的 Java 代码中使用
HTMLOutputFormat.INSTANCE.fromMarkup("This is <em>HTML</em>!")
(从你的方法返回到,或者对于其他一些,放入数据 -模型)。然后当它打印出
${}
时,FreeMarker 将知道它不需要转义。

© www.soinside.com 2019 - 2024. All rights reserved.