如何从 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>
您不必使用<list>
,当然,它只是作为示例,因为您的方法返回一个列表。
【讨论】:
当我的 bean 扩展 TreeMap 时出现问题。在这种情况下它找不到方法。 @tbraun:在这种情况下,您需要?api
。 Map
-s 的方法没有公开(至少有DefaultObjectWrapper
),因为在 FTL 中,与 Java 不同,这些方法没有自己的命名空间。所以它们会与地图中的键混合,比如myMap.someKey
和myMap.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
方法的返回值可能很有用:像这样:<#list myBean.getunits("myType")![] as unit>
。在这种情况下,默认为空序列。以上是关于如何从 FreeMarker 模板调用对象的 java 方法?的主要内容,如果未能解决你的问题,请参考以下文章
在 Freemarker 模板中,如何获取数据模型类的名称?