2011-08-09 10 views
23

Acabo de empezar a usar Java Velocity. Ahora quiero crear una plantilla de clase Java.Función de cadena de velocidad

package $app.package_namespace 
public class ${app.name}Station 

{ 
    #foreach($s_attribute in $app.station) 
     $s_attribute.type $s_attribute.name, 
    #end 
    public $app.name Station(#foreach($s_attribute in $app.station) 
           $s_attribute.type $s_attribute.name; 
          #end) 
{ 
    #foreach($s_attribute in $app.station) 
      $s_attribute.name=$s_attribute.name; 
    #end 
} 
#foreach($s_attribute in $app.station) 
    public ${s_attribute.type} get${s_attribute.name}() 
    { 
     return get${s_attribute.name}(); 
    } 
#end 
} 

El problema es s_attribute.name primer carácter es minúscula. Cuando creo getter y la función setter para los atributos. Necesito cambiar el primer carácter a mayúscula.

¿Alguien sabe cómo hacerlo?

Respuesta

24

Puede invocar métodos java estándar en estos objetos. Si s_attribute.name es tipo String puede utilizar directamente $s_attribute.name.toUpperCase() o para su utilización caso específico $s_attribute.name.substring(0,1).toUpperCase() y $s_attribute.name.substring(1).toLowerCase()

+0

Espero que quisieras decir 'toUpperCase' y' toLowerCase'? – adarshr

+0

Sí, en este caso, la misma macro debería aplicarse dos veces una vez para el primer carácter y una vez para el resto de la cadena. Personalmente, siendo esta la capa de presentación, lo evitaría. Además, en la segunda cadena que hace 'toLowerCase' es una mala idea, ¿qué pasa si su validable se llama customerName, usted querría que el método producido sea getCustomerName y no getCustomername. – Ali

+0

@adarshr Oppa sí ... No quise toUpperCase()/toLowerCase() - wast haciendo java desde el año pasado !! - pero sí entiendes la idea. –

2

Se podía crear 2 métodos getName() y getname() continuación, cuando se utiliza la velocidad ${s_attribute.name} utilizará getname() y cuando se utiliza ${s_attribute.Name} velocidad va a utilizar el método getName().

Desde el Velocity guide:

Propiedad reglas de búsqueda

Como se mencionó anteriormente, las propiedades menudo se refieren a los métodos del objeto padres. La velocidad es bastante ingeniosa cuando se determina qué método corresponde a una propiedad solicitada. Prueba diferentes alternativas basadas en varias convenciones de nomenclatura establecidas. La secuencia de búsqueda exacta depende de si el nombre de propiedad comienza o no con una letra mayúscula. Para los nombres en minúsculas, como $ cliente.Direccion, la secuencia es

getaddress() 
getAddress() 
get("address") 
isAddress() 

para los nombres de propiedad en mayúsculas como $ cliente.Direccion, es ligeramente diferente:

getAddress() 
getaddress() 
get("Address") 
isAddress() 

Lo que sugiero es que lo manejes en tu objeto en el back-end.

11

Hay capitalize() método en el DisplayTool:

get${display.capitalize($s_attribute.name)}() 
+0

¡Oh, dulce! Vi capitalizar en la API, pero pensé que era para formatear texto en el back-end. ¡Este uso también tiene sentido! – Ali

+1

Este '$ {display.capitalize (...)}' no funcionó para mí. Mi salida tiene '$ {display.capitalize (...)}'. ¿Debo hacer algo extra para que aparezca DisplayTool? Estoy usando la velocidad de vainilla directa 1.7 –

+3

@KarthicRaghupathi DisplayTool está en una dependencia separada llamada velocity-tools. Asegúrese de incluirlo y luego agregue una herramienta de pantalla a su VelocityContext. vc.put ("display", nueva DisplayTool()); – AJD

2

Si está utilizando commons-lang puede utilizar el StringUtils clase:

context.put("StringUtils", org.apache.commons.lang3.StringUtils.class); 

Luego, en su plantilla:

... 
return get$StringUtils.capitalize(s_attribute.name)(); 
... 
Cuestiones relacionadas