Freemarker ftl 模板调用 java 方法并使用返回的 html 字符串

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

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

if's
list
和 e.t.c.它会变得太复杂和不必要的大(因为我会在页面的多个地方复制相同的逻辑)。在不涉及太多细节的情况下,我想根据所需元素的大小按键渲染表格行,但显然有时没有元素,所以如果发生这种情况我也需要渲染一个空行,所以我更容易做到java代码。我知道如何从 ftl 文件调用方法,我的问题是如何从我的 java 代码中正确返回一行的 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")}
#{object.renderRow("key2")}
...
</table>

此外,在从 Java 代码返回字符串之前,我是否需要进行任何特殊转义?如果是,那么正确的做法是什么?

java html spring-boot freemarker
© www.soinside.com 2019 - 2024. All rights reserved.