2009-09-01 2 views
40

Можно ли вызвать метод, который принимает параметры из шаблона Freemarker?Как вызвать java-методы для объекта из шаблона FreeMarker?

У меня есть объектная модель, которую я пытаюсь сделать с помощью Freemarker на веб-странице. Один из объектов имеет метод, чтобы получить подсписок его содержимое - принимает параметр, который используется для фильтрации списка:

public List getunits(final String type);

Я знаю, что в JSP вы не можете сделать это прямо, но вы можете писать пользовательские функции, которые позволят вам достичь желаемого результата. Как вы решаете это во Фримаркере? То же самое с написанием пользовательских функций? Или существует какой-то способ называть эту функцию?

ответ

33

FreeMarker позволяет использовать методы, которые были доступны через модель, с точностью до expressions.

Предполагая, что ваш объект был разоблачен как myBean вы можете вызвать метод следующим образом:

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

Вы не должны использовать <list>, конечно, это просто там в качестве примера, поскольку ваш метод возвращает список.

+1

Были проблемы, когда мой боб расширяя TreeMap. В этом случае метод не может найти. – tbraun

+2

@tbraun: В этом случае вам нужно '? Api'. Методы 'Map'-s не отображаются (по крайней мере, с помощью' DefaultObjectWrapper'), поскольку в FTL, в отличие от Java, методы не имеют собственного пространства имен. Таким образом, они будут смешиваться с ключами на карте, например 'myMap.someKey' и' myMap.get' (возвращает метод «Map.get»), и оба возвращают что-то, и будут оба перечислены с помощью 'myMap? Keys', и т. д. Это было бы беспорядок. Таким образом, по умолчанию 'myMap.something' ищет только ключ' something'' Map', а не метод 'something'. Но вы можете работать так, как 'myMap? Api.get (...)'. – ddekany

20

Как 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

+0

Очень полезно знать о '!'. Кроме того, обратите внимание, что может быть полезно добавить значение по умолчанию к возврату метода getunits: например, <<список myBean.getunits ("myType")! [] Как unit> '. В этом случае по умолчанию используется пустая последовательность. –

Смежные вопросы