我不确定是否有办法在 Velocity 中执行此操作:
我有一个用户 POJO,它有一个名为 Status 的属性,它看起来像一个枚举(但它不是,因为我被困在 Java 1.4 上),定义看起来像这样:
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;
}
Status 是一个静态内部类:
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
}
使用这种模式,可以很容易地在条件下测试用户状态,例如
if(User.Status.ADMIN.equals(user.getStatus())) ...
...无需为状态 ID、任何幻数等引用任何常量。
但是,我不知道如何在我的 Velocity 模板中使用 VTL 测试这些条件。我想根据用户的状态打印一个简单的字符串,例如:
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
但这会引发一个看起来像的异常 org.apache.velocity.exception.ParseErrorException: Encountered "User" at webpages/include/dashboard.inc[line 10, column 21] Was expecting one of: "[" ...
从VTL User Guide中,没有提到直接在 VTL 中访问 Java 类/静态成员,条件的右侧(RHS)似乎只能是数字文字、字符串文字、属性引用或方法参考。
那么有什么方法可以访问 Velocity 模板中的静态 Java 属性/引用?我知道作为一种解决方法,我可以在我的控制器中嵌入状态 ID 或其他标识符作为参考(这是一个使用 Velocity 作为视图技术的 Web MVC 应用程序),但我强烈不想嵌入任何魔法视图层中的数字或常量。