2009-09-01 14 views
40

Czy można wywołać metodę, która pobiera parametry z szablonu Freemarker?Jak wywołać metody Java na obiekcie z szablonu FreeMarker?

Mam model obiektowy, który próbuję renderować z Freemarker na stronie internetowej. Jednym z obiektów ma sposobu, aby uzyskać podmenu jego zawartość - biorąc parametr, który jest używany do filtrowania listy:

public List getunits(final String type);

wiem w JSP nie można to zrobić bezpośrednio, ale można pisz niestandardowe funkcje, które pozwolą Ci osiągnąć pożądany rezultat. Jak rozwiązać ten problem w Freemarker? Czy to samo dotyczy pisania niestandardowych funkcji? Czy jest jakiś sposób na wywołanie tego rodzaju funkcji?

Odpowiedz

33

FreeMarker umożliwia wywoływanie metod, które zostały udostępnione przez model z poziomu expressions.

Zakładając, że obiekt został wystawiony jako myBean można wywołać metodę w następujący sposób:

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

Nie trzeba używać <list>, oczywiście, że to właśnie tam jako przykład, ponieważ metoda zwraca lista.

+1

Miał problemy, gdy mój fasola było rozszerzenie TreeMap. W tym przypadku nie można znaleźć metody. – tbraun

+2

@tbraun: W takim przypadku potrzebujesz '? Api'. Metody 'Map'-s nie są ujawnione (przynajmniej z' DefaultObjectWrapper'), ponieważ w FTL, inaczej niż w Javie, metody nie mają własnej przestrzeni nazw. Więc połączyliby się z kluczami na mapie, takimi jak 'myMap.someKey' i' myMap.get' (zwróci metodę 'Map.get'), która zarówno zwróci coś, jak i oba zostaną wymienione za pomocą' myMap? Keys', itp. To byłby bałagan. Domyślnie 'myMap.something' szuka tylko klucza' coś' 'Map', a nie metody' coś'. Ale możesz pracować tak jak 'myMap? Api.get (...)'. – ddekany

20

Jak powiedział ChssPly76, można po prostu wywołać wywołanie metody z szablonu Freemarker, o ile eksponuje się obiekt w modelu.

Ale ważne jest, aby pamiętać, że jeśli metoda zwraca NULL (z jakiegokolwiek powodu), masz zamiar dostać mylące

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

Aby tego uniknąć, należy lepiej wykorzystywać myBean.getunits(...)! (zawiadomienie okrzyk punkt).

Dowiedz się więcej o tym, jak Freemarker obsługuje null tutaj: http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_missing

+0

Bardzo pomocna informacja na temat '!'. Zauważ, że może być użyteczne dodanie wartości domyślnej do zwrotu metody 'getunits': tak:' <#list myBean.getunits ("myType")! [] Jako jednostkę> '. W tym przypadku wartością domyślną jest pusta sekwencja. –

Powiązane problemy