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
的值,他们可以使用它用于攻击。
我使用 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
的值,他们可以使用它用于攻击。