如何从 FreeMarker 模板调用对象的 java 方法?

Posted

技术标签:

【中文标题】如何从 FreeMarker 模板调用对象的 java 方法?【英文标题】:How do I call java methods on an object from a FreeMarker template? 【发布时间】:2010-11-24 15:25:57 【问题描述】:

是否可以调用从 Freemarker 模板获取参数的方法?

我有一个对象模型,我正在尝试使用 Freemarker 将其渲染到网页中。其中一个对象有一种方法来获取其内容的子列表 - 采用一个用于过滤列表的参数:

public List getunits(final String type);

我知道在 JSP 中你不能直接这样做,但是你可以编写自定义函数来实现你想要的结果。你如何在 Freemarker 中解决这个问题?写自定义函数也一样吗?或者有什么方法可以实际调用这种函数?

【问题讨论】:

【参考方案1】:

FreeMarker 允许从 expressions 中调用通过模型提供的方法。

假设您的对象已公开为myBean,您可以按如下方式调用该方法:

<#list myBean.getunits("myType") as unit>
  do stuff with $unit
</#list>

您不必使用&lt;list&gt;,当然,它只是作为示例,因为您的方法返回一个列表。

【讨论】:

当我的 bean 扩展 TreeMap 时出现问题。在这种情况下它找不到方法。 @tbraun:在这种情况下,您需要?apiMap-s 的方法没有公开(至少有DefaultObjectWrapper),因为在 FTL 中,与 Java 不同,这些方法没有自己的命名空间。所以它们会与地图中的键混合,比如myMap.someKeymyMap.get(返回Map.get 方法)都会返回一些东西,并且都将与myMap?keys 一起列出,等等。那将是一团糟。所以默认情况下myMap.something 只查找something Map 键,而不是something 方法。但你可以像myMap?api.get(...) 一样解决这个问题。【参考方案2】:

正如 ChssPly76 所说,只要在模型中公开对象,您就可以从 Freemarker 模板中执行方法调用。

但重要的是要记住,如果您的方法返回 NULL(无论出于何种原因),您将会感到困惑

Expression myBean.getunits() is undefined on line ....

为避免这种情况,您最好使用myBean.getunits(...)!(注意感叹号)。

在此处了解有关 Freemarker 如何处理空值的更多信息:http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_missing

【讨论】:

了解! 非常有帮助。另外,请注意,将默认值添加到 getunits 方法的返回值可能很有用:像这样:&lt;#list myBean.getunits("myType")![] as unit&gt;。在这种情况下,默认为空序列。

以上是关于如何从 FreeMarker 模板调用对象的 java 方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 Freemarker 模板中,如何获取数据模型类的名称?

如何在freemarker模板中调用反射方法?

如何从freemarker模板中获取当前年份

我的 Freemarker ObjectWrapper 如何访问模板设置

freemarker如何遍历模板中所有变量

FreeMarker里如何调用java代码?