当前位置:  开发笔记 > 编程语言 > 正文

如何访问Velocity模板中的静态成员?

如何解决《如何访问Velocity模板中的静态成员?》经验,为你挑选了2个好方法。

我不确定是否有办法在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的任何常量,任何幻数等.

但是,我无法弄清楚如何使用VTL在Velocity模板中测试这些条件.我想根据用户的状态打印一个简单的字符串,例如:

Welcome ${user.name}!


#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用户指南中,没有提到直接在VTL中访问Java类/静态成员,看起来条件的右侧(RHS)只能是数字文字,字符串文字,属性引用或方法参考.

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



1> matt b..:

我找到了一个解决方法,允许我将每个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



2> Nathan Bubna..:

是的,Velocity本身并没有使用类和包.您可以执行您所做的操作,或使用FieldMethodizer类自动执行该操作.另一种选择是VelocityTools 2.0中的FieldTool.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有