java - usar - ¿Cómo acceder a los miembros estáticos en una plantilla de Velocity?
que es una variable static en java (3)
Descubrí una solución que me permite agregar cada objeto User.Status
al contexto Velocity, que evita cualquier tipo de referencia a las 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, estos valores se pueden referenciar así:
#if($user.status == $statusmap.user)
You are a regular user
#elseif($user.status == $statusmap.admin)
You are an administrator
##etc...
#end
No estoy seguro si hay una manera de hacer esto en Velocity o no:
Tengo un usuario POJO que tiene una propiedad llamada Status, que se parece a una enumeración (pero no lo es, ya que estoy atascado en Java 1.4), la definición se ve más o menos así:
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 estado de usuario puede probarse fácilmente en un condicional como
if(User.Status.ADMIN.equals(user.getStatus())) ...
... sin tener que hacer referencia a ninguna constante para el ID de estado, ningún número mágico, etc.
Sin embargo, no puedo entender cómo probar estos condicionales en mi plantilla Velocity con VTL. Me gustaría simplemente imprimir una cadena simple en función del estado del usuario, como por ejemplo:
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 arroja una excepción que se ve como org.apache.velocity.exception.ParseErrorException: Encountered "User" at webpages/include/dashboard.inc[line 10, column 21] Was expecting one of: "[" ...
En la Guía del usuario de VTL , no se menciona el acceso a una clase Java / miembro estático directamente en VTL, parece que el lado derecho (RHS) de un condicional solo puede ser un número literal, una cadena literal, una referencia de propiedad o un método referencia.
Entonces, ¿hay alguna forma 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.
Sí, Velocity no asimila clases y paquetes de forma nativa. Podrías hacer lo que hiciste, o usar la clase FieldMethodizer para automatizar eso. Otra opción sería FieldTool en VelocityTools 2.0.
Intenta usar FieldMethodizer of Velocity, no es la mejor solución pero puedes hacer algo.
Con esta clase puede llamar a constantes públicas estáticas, consulte el enlace: