2009-01-20 8 views
10

no estoy seguro de si hay una manera de hacer esto en la velocidad o no:¿Cómo acceder a los miembros estáticos en una plantilla de Velocity?

tengo un POJO usuario el que una propiedad denominada Estado, que se parece a una enumeración (pero no lo es, ya que estoy atascado en Java 1.4), la definición es como la siguiente:

public class User { 

    // default status to User 
    private Status status = Status.USER; 

    public void setStatus(Status status) { 
     this.status = status; 
    } 

    public Status getStatus() { 
     return status; 
    } 

y el estado es una clase interna estática:

public static final class Status { 

    private String statusString; 

    private Status(String statusString) { 
     this.statusString = statusString; 
    } 

    public final static Status USER = new Status("user"); 
    public final static Status ADMIN = new Status("admin"); 
    public final static Status STATUS_X = new Status("blah"); 

    //.equals() and .hashCode() implemented as well 
} 

Con este patrón, un status de usuario fácilmente se puede probar en un tales condicional

if(User.Status.ADMIN.equals(user.getStatus())) ... 

... sin tener que hacer referencia a cualquier constante para el ID de estado, los números mágicos, etc.

Sin embargo, no puedo encontrar la manera de probar estos condicionales en mi plantilla de velocidad con VTL. Me gustaría simplemente imprimir una cadena sencilla basada en el estado del usuario, tales como:

Welcome <b>${user.name}</b>! 
<br/> 
<br/> 

#if($user.status == com.company.blah.User.Status.USER) 
    You are a regular user 
#elseif($user.status == com.company.blah.User.Status.ADMIN) 
    You are an administrator 
#etc... 

#end 

Pero esto produce una excepción que se parece a org.apache.velocity.exception.ParseErrorException: Encountered "User" at webpages/include/dashboard.inc[line 10, column 21] Was expecting one of: "[" ...

De the VTL User Guide, no hay ninguna mención de acceder a una aplicación Java clase/miembro estático directamente en VTL, parece que el lado derecho (RHS) de un condicional solo puede ser un número literal, un literal de cadena, una referencia de propiedad o una referencia de método.

Entonces, ¿hay alguna manera de que pueda acceder a las propiedades/referencias estáticas de Java en una plantilla de Velocity? Soy consciente de que, como solución alternativa, podría incorporar el ID de estado o algún otro identificador como referencia en mi controlador (esta es una aplicación web MVC que usa Velocity como tecnología de visualización), pero no quiero incrustar ningún tipo de magia. números o constantes en la capa de vista.

Respuesta

8

Descubrí una solución que me permite agregar cada objeto User.Status al contexto de velocidad, lo que evita cualquier tipo de referencia a constantes o números mágicos en la plantilla.

En el lado del controlador/Java:

// put the statuses directly into the model 
Map statusMap = new HashMap(); 
statusMap.put("user", User.Status.USER); 
statusMap.put("groupOperator", User.Status.ADMIN); 
... 
modelAndView.addObject("statusmap", statusMap); 

Y luego, en la plantilla de estos valores puede hacer referencia, así:

#if($user.status == $statusmap.user) 
    You are a regular user 
#elseif($user.status == $statusmap.admin) 
    You are an administrator 
##etc... 
#end 
6

Sí, la velocidad no asimilo forma nativa clases y paquetes. Podrías hacer lo que hiciste, o usar la clase FieldMethodizer para automatizar eso. Otra opción sería FieldTool en VelocityTools 2.0.

3

Trate de usar FieldMethodizer of Velocity, no es la mejor solución pero puede hacer algo.

Con esta clase puede llamar a las constantes públicas estáticas, consulte el enlace:

FieldMethodizer API

Cuestiones relacionadas