Настроить скорость для рендеринга объекта с чем-то отличным от toString? - PullRequest
1 голос
/ 17 декабря 2008

Есть ли способ настроить Velocity на использование чего-то другого, кроме toString (), для преобразования объекта в строку в шаблоне? Например, предположим, что я использую простой класс даты с методом format () и каждый раз использую один и тот же формат. Если весь мой код скорости выглядит так:

$someDate.format('M-D-yyyy')

есть какая-то конфигурация, которую я мог бы добавить, которая позволила бы мне просто сказать

$someDate

вместо этого? (Предполагая, что я не в состоянии просто отредактировать класс даты и присвоить ему соответствующий toString ()).

Я делаю это в контексте веб-приложения, созданного с помощью WebWork, если это поможет.

Ответы [ 4 ]

1 голос
/ 23 июня 2015

Я тоже столкнулся с этой проблемой и смог решить ее, основываясь на ответе Натана Бубны .

Я просто пытаюсь завершить ответ, предоставив ссылку на документацию Velocity , в которой объясняется, как использовать EventHandlers.

В моем случае мне нужно было, чтобы Velocity вызывал getAsString вместо метода toString для всех объектов JsonPrimitive из библиотеки gson каждый раз, когда вставлялась ссылка.

Это было так же просто, как создать

public class JsonPrimitiveReferenceInsertionEventHandler implements ReferenceInsertionEventHandler{

    /* (non-Javadoc)
     * @see org.apache.velocity.app.event.ReferenceInsertionEventHandler#referenceInsert(java.lang.String, java.lang.Object)
     */
    @Override
    public Object referenceInsert(String reference, Object value) {
        if (value != null && value instanceof JsonPrimitive){
            return ((JsonPrimitive)value).getAsString();
        }
        return value;
    }

}

И добавить событие в VelocityContext

vec = new EventCartridge();
vec.addEventHandler(new JsonPrimitiveReferenceInsertionEventHandler());

...

context.attachEventCartridge(vec);
1 голос
/ 03 февраля 2009

Вы также можете создать свой собственный ReferenceInsertionEventHandler, который отслеживает ваши даты и автоматически выполняет форматирование для вас.

1 голос
/ 03 февраля 2009

Да, и версии Velocity 1.6+ имеют новый интерфейс Renderable. Если вы не против связать свой класс дат с API-интерфейсом Velocity, то реализуйте этот интерфейс, и Velocity будет использовать метод render (context, writer) (в вашем случае вы просто игнорируете контекст и используете Writer) вместо toString ( ).

1 голос
/ 18 декабря 2008

Скорость учитывает JSTL-подобную утилиту под названием velocimacros:

http://velocity.apache.org/engine/devel/user-guide.html#Velocimacros

Это позволит вам определить макрос как:

#macro( d $date)
   $date.format('M-D-yyyy')
#end

А потом назовите это так:

#d($someDate)
...