Как получить доступ к статическим членам в шаблоне Velocity? - PullRequest
10 голосов
/ 20 января 2009

Я не уверен, есть ли способ сделать это в Velocity или нет:

У меня есть пользовательский POJO, у которого есть свойство с именем Status, которое выглядит как enum (но это не так, поскольку я застрял на 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())) ...

... без указания каких-либо констант для идентификатора состояния, магических чисел и т. Д.

Однако я не могу понять, как проверить эти условия в моем шаблоне 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 , нет упоминания о доступе к классу / статическому члену Java непосредственно в VTL, кажется, что правая часть (RHS) условного выражения может быть только числовым литералом , строковый литерал, ссылка на свойство или ссылка на метод.

Так есть ли способ получить доступ к статическим свойствам / ссылкам Java в шаблоне Velocity? Я знаю, что в качестве обходного пути, я мог бы встроить идентификатор статуса или какой-либо другой идентификатор в качестве ссылки в моем контроллере (это веб-приложение MVC, использующее Velocity в качестве технологии View), но я настоятельно не хочу внедрять какое-либо волшебство числа или константы в слое вида.

Ответы [ 3 ]

8 голосов
/ 20 января 2009

Я нашел обходной путь, который позволяет мне добавлять каждый 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
6 голосов
/ 03 февраля 2009

Да, Velocity изначально не использует классы и пакеты. Вы можете сделать то, что вы сделали, или использовать класс FieldMethodizer, чтобы автоматизировать это. Другим вариантом будет FieldTool в VelocityTools 2.0.

3 голосов
/ 19 мая 2010

Попробуйте использовать FieldMethodizer от Velocity, это не лучшее решение, но вы можете что-то сделать.

С помощью этого класса вы можете вызывать статические публичные константы, перейдите по ссылке:

API FieldMethodizer

...