2009-09-01 13 views
40

È possibile chiamare un metodo che prende parametri da un modello di Freemarker?Come si richiamano i metodi Java su un oggetto da un modello di FreeMarker?

Ho un modello di oggetti che sto cercando di renderizzare con Freemarker in una pagina web. Uno degli oggetti ha un metodo per ottenere un elenco secondario del suo contenuto - prendendo un parametro che viene utilizzato per filtrare l'elenco:

public List getunits(final String type);

So in JSP non è possibile farlo direttamente, ma è possibile scrivi funzioni personalizzate che ti permetteranno di ottenere il risultato desiderato. Come si risolve questo in Freemarker? È lo stesso con la scrittura di funzioni personalizzate? O c'è un modo per chiamare effettivamente questo tipo di funzione?

risposta

33

FreeMarker consente di richiamare i metodi resi disponibili tramite il modello da expressions.

Supponendo che l'oggetto è stato esposto come myBean è possibile richiamare il metodo come segue:

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

Non hai utilizzare <list>, ovviamente, è solo lì come un esempio in quanto il metodo restituisce un elenco.

+1

avuto problemi quando il mio fagiolo stava estendendo un TreeMap. In questo caso non è possibile trovare il metodo. – tbraun

+2

@tbraun: In questo caso è necessario '? Api'. I metodi di 'Map'-s non sono esposti (con' DefaultObjectWrapper' almeno) perché in FTL, a differenza di Java, i metodi non hanno il loro spazio dei nomi. Quindi si mischiano con le chiavi nella mappa, come 'myMap.someKey' e' myMap.get' (restituisce il metodo 'Map.get') restituirebbero entrambi qualcosa, e sarebbero entrambi elencati con' myMap? Keys', ecc. Sarebbe un disastro. Per impostazione predefinita, 'myMap.something' cerca solo la chiave' map' 'Map', non il metodo' something'. Ma puoi lavorare in giro come 'myMap? Api.get (...)'. – ddekany

20

Come ChssPly76 detto, si può semplicemente eseguire la chiamata al metodo da un modello di Freemarker, purché esporre l'oggetto nel modello.

Ma è importante tenere a mente che se il metodo restituisce NULL (per qualsiasi motivo), che si sta per ottenere una confusione

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

Per evitare questo, si dovrebbe meglio utilizzare myBean.getunits(...)! (notare l'esclamazione punto).

Ulteriori informazioni su come Freemarker gestisce i null qui: http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_missing

+0

Molto utile sapere il '!'. Inoltre, si noti che potrebbe essere utile aggiungere un valore predefinito al metodo restituito dal metodo getunits: come segue: '<#list myBean.getunits (" myType ")! [] Come unit>'. In questo caso, l'impostazione predefinita è una sequenza vuota. –

Problemi correlati