我的 FreeMarker 方法返回一个带有 $variable 的字符串——如何强制 FreeMarker 解析它?

Posted

技术标签:

【中文标题】我的 FreeMarker 方法返回一个带有 $variable 的字符串——如何强制 FreeMarker 解析它?【英文标题】:My FreeMarker method returns a string with $variable -- how to force FreeMarker to parse that?我的 FreeMarker 方法返回一个带有 $variable 的字符串——如何强制 FreeMarker 解析它? 【发布时间】:2014-10-22 03:33:54 【问题描述】:

我创建了一个从 FreeMarker 实现 TemplateMethodModelEx 的类。假设 exec() 函数返回一个字符串:"Hello $username"

我将类分配给数据模型中的一个方法:

dataModel.put("myMethod", myClassInstance);
dataModel.put("username", "John Doe");

我的 html 模板如下所示:

<p>$myMethod()</p>

这意味着在处理模板时会生成以下输出:

<p>Hello $username</p>

由于我的数据模型中实际上有一个 username 值,我希望输出为:

<p>Hello John Doe</p>

如何告诉 FreeMarker 解析 myMethod() 的结果?我尝试了 ?eval?interpret 都未能完成我想要的。 FreeMarker 可以做到这一点吗?

【问题讨论】:

您的模板是以指令[#ftl] 还是&lt;#ftl&gt; 开头的? freemarker.org/docs/ref_directive_ftl.html 我的模板中没有 指令。我可以在 FTL 指令中设置一个参数来解决我的情况吗? 【参考方案1】:

您需要从字符串中删除$ 才能使用?eval。从您的方法中将username 作为字符串返回并使用?eval 或从.vars 获取变量。

<p>$classInstance.myMethod()?eval</p>

<p>$.vars[classInstance.myMethod()]</p>

如果您想从方法中返回的不仅是变量名,而且是带有表达式的字符串(例如“Hello $username”),请使用?interpret

<#assign inlineTemplate = classInstance.myMethod()?interpret>
<@inlineTemplate />

【讨论】:

感谢您的意见。我已经更新了我的问题——事实上,我的课程返回了一个句子,其中 $username 是句子的一部分。因此,我无法评估整个事情。 那个#assign可以去掉:&lt;@classInstance.myMethod()?interpret /&gt; 是的,当然,如果该表达式只使用一次,那么#assign 就没有意义了。

以上是关于我的 FreeMarker 方法返回一个带有 $variable 的字符串——如何强制 FreeMarker 解析它?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 hashmap 变量的 freemarker 列表

FreeMarker常用的方法

Freemarker - HTTPSession 属性返回 null

在 Freemarker 中将字符串转换为 JSON

Freemarker 和 Struts 2 错误处理集成

如何使用 freemarker 将字符串转换为数字?