FreeMarker 如何将变量传递给另一个变量?

FreeMarker how to pass variable into another variable?

我使用 FreeMarker 作为模板系统,它工作正常,但我很难在另一个变量内部定义变量。

这是我的模板示例

<body>
Hello my ${friend}
</body>

我的朋友变量应该由另一个变量组成,例如:

data.put("id", "001");
data.put("friend", "FRIENDNAME ${id}");

Writer out = new StringWriter();
template.process(data, out);
String html = out.toString();

现在我的输出(如预期的那样)包括变量

<body>
Hello my FRIENDNAME ${id}
</body>

我该如何解决这个问题,这样我的结果就是

<body>
Hello my FRIENDNAME 001
</body>

我尝试处理结果两次,但没有成功,我认为必须有更好的方法来解决它。在文档中也找不到此类信息。

谢谢。

您可以使用 interpret 告诉 FM 引擎对给定字符串(“id”的值 属性)进行额外评估

所以不用

data.put("friend", "FRIENDNAME ${id}");

你应该使用

data.put("friend", "FRIENDNAME <@id?interpret/>");

在您的示例中,您放入数据模型中的值本身就是一个模板。但是 FreeMarker 永远不会自动解释您放入 String 中的内容。那将是非常危险的(代码注入)。所以你必须在模板中明确要求它:

Hello my <@friend?interpret/>!

但是考虑谁可以设置friend的值。 FreeMarker 模板可以调用公开的 Java 对象的 public 方法,可以 运行 长循环等。所以如果恶意用户可以指定 friend 的值,他们可以使用它用于攻击。