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

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

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

public List getunits(final String type);

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

【问题讨论】:

    标签: java 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;。在这种情况下,默认为空序列。
    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 2017-10-17
    • 1970-01-01
    • 2021-01-27
    • 2022-11-30
    • 2015-11-19
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多