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

Gra*_*ham 42 java freemarker

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

我有一个对象模型,我试图用Freemarker渲染到一个网页.其中一个对象有一个获取其内容子列表的方法 - 获取用于过滤列表的参数:

public List getunits(final String type);

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

Chs*_*y76 37

FreeMarker允许从表达式中调用通过模型提供的方法.

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

<#list myBean.getunits("myType") as unit>
  do stuff with ${unit}
</#list>
Run Code Online (Sandbox Code Playgroud)

<list>当然,您不必使用它只是作为示例,因为您的方法返回一个列表.

  • @tbraun:在这种情况下你需要`?api`.不暴露`Map`-s的方法(至少使用`DefaultObjectWrapper`),因为在FTL中,与Java不同,这些方法没有自己的命名空间.所以他们会混合地图中的键,比如`myMap.someKey`和`myMap.get`(返回`Map.get`方法)都会返回一些东西,并且都会用`myMap?keys`列出,那将是一团糟.所以默认情况下`myMap.something`只查找`something``Map`键,而不是`something`方法.但你可以像`myMap?api.get(...)`一样工作. (3认同)

mon*_*onj 22

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

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

Expression myBean.getunits() is undefined on line ....
Run Code Online (Sandbox Code Playgroud)

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

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