【问题标题】:How to access static members in a Velocity template?如何访问 Velocity 模板中的静态成员?
【发布时间】:2010-10-02 12:15:45
【问题描述】:

我不确定是否有办法在 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: "[" ... 的异常

the VTL User Guide 开始,没有提到在 VTL 中直接访问 Java 类/静态成员,似乎条件的右侧(RHS)只能是数字文字、字符串文字、属性引用,或方法参考。

那么有什么方法可以访问 Velocity 模板中的静态 Java 属性/引用?我知道作为一种解决方法,我可以在我的控制器中嵌入状态 ID 或其他标识符作为参考(这是一个使用 Velocity 作为视图技术的 Web MVC 应用程序),但我强烈不想嵌入任何魔法视图层中的数字或常量。

【问题讨论】:

    标签: java model-view-controller velocity


    【解决方案1】:

    尝试使用 Velocity 的 FieldMethodizer,它不是最好的解决方案,但你可以做一些事情。

    通过这个类你可以调用静态公共常量,请看链接:

    FieldMethodizer API

    【讨论】:

    【解决方案2】:

    是的,Velocity 本身并不能识别类和包。你可以做你所做的,或者使用 FieldMethodizer 类来自动化它。另一种选择是 VelocityTools 2.0 中的 FieldTool。

    【讨论】:

      【解决方案3】:

      我想出了一个解决方法,允许我将每个 User.Status 对象添加到 Velocity 上下文中,从而避免对模板中的常量或幻数的任何类型的引用。

      在控制器/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);
      

      然后在模板中可以像这样引用这些值:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-20
        • 1970-01-01
        • 2016-01-28
        • 2011-04-18
        相关资源
        最近更新 更多