2009-09-01 23 views
40

¿Es posible llamar a un método que toma parámetros de una plantilla de Freemarker?¿Cómo puedo llamar a los métodos de Java en un objeto desde una plantilla de FreeMarker?

Tengo un modelo de objeto que trato de representar con Freemarker en una página web. Uno de los objetos tiene un método para obtener una lista secundaria de los contenidos de TI - tomar un parámetro que se utiliza para filtrar la lista:

public List getunits(final String type);

Sé que en JSP no se puede hacer esto directamente, pero se puede escriba funciones personalizadas que le permitirán lograr el resultado que desea. ¿Cómo resuelves esto en Freemarker? ¿Es lo mismo con escribir funciones personalizadas? ¿O hay alguna forma de llamar realmente a este tipo de función?

Respuesta

33

FreeMarker permite invocar métodos que estuvieron disponibles a través del modelo desde expressions.

Asumiendo que su objeto ha sido expuesto como myBean puede invocar el método de la siguiente manera:

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

Usted no tiene que utilizar <list>, por supuesto, es sólo allí como un ejemplo ya que su método devuelve una lista.

+1

tenido problemas cuando mi frijol estaba extendiendo una TreeMap. No puede encontrar el método en ese caso. – tbraun

+2

@tbraun: Necesitas '? Api' en ese caso. Los métodos de 'Map'-s no están expuestos (con' DefaultObjectWrapper' al menos) porque en FTL, a diferencia de Java, los métodos no tienen su propio espacio de nombres. Entonces se mezclarían con las teclas en el mapa, como 'myMap.someKey' y' myMap.get' (devuelve el método 'Map.get') ambos devolverían algo, y ambos se listarían con' myMap? Keys', etc. Eso sería un desastre. Por lo tanto, de forma predeterminada, 'myMap.something' solo busca la clave' something' 'Map', no el método' something'. Pero puedes trabajar eso como 'myMap? Api.get (...)'. – ddekany

20

Como ChssPly76 dijo, solo puede aplicar la llamada al método desde una plantilla de Freemarker, siempre que exponga el objeto en el modelo.

Pero es importante tener en cuenta que si su método devuelve NULL (por cualquier razón), que se va a obtener un confuso

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

Para evitar esto, se debe utilizar mejor myBean.getunits(...)! (nótese la exclamación punto).

Más información sobre cómo maneja Freemarker nulos aquí: http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_missing

+0

Muy útil para saber sobre el '!'. Además, tenga en cuenta que puede ser útil agregar un valor predeterminado al retorno del método 'getunits': así:' <#list myBean.getunits ("myType")! [] Como unit> '. En este caso, el valor predeterminado es una secuencia vacía. –

Cuestiones relacionadas