1

有没有办法将 Velocity 配置为使用 toString() 以外的东西将对象转换为模板中的字符串?例如,假设我正在使用带有 format() 方法的简单日期类,并且每次都使用相同的格式。如果我所有的速度代码如下所示:

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

有没有我可以添加的配置让我说

$someDate

反而?(假设我不能只编辑日期类并给它一个适当的 toString())。

如果有帮助,我将在使用 WebWork 构建的 web 应用程序的上下文中执行此操作。

4

4 回答 4

1

Velocity 允许使用类似 JSTL 的实用程序,称为 velocimacros:

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

这将允许您定义一个宏,如:

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

然后这样称呼它:

#d($someDate)
于 2008-12-18T03:49:10.863 回答
1

您还可以创建自己的 ReferenceInsertionEventHandler 来监视您的日期并自动为您进行格式化。

于 2009-02-02T22:47:14.500 回答
1

哦,1.6+ 版本的 Velocity 有一个新的 Renderable 接口。如果您不介意将日期类绑定到 Velocity API,那么实现此接口,Velocity 将使用 render(context, writer) 方法(对于您的情况,您只需忽略上下文并使用 writer)而不是 toString( )。

于 2009-02-02T22:49:14.217 回答
1

我也遇到了这个问题,我能够根据Nathan Bubna 的回答来解决它。

我只是想完成提供Velocity 文档链接的答案,该文档解释了如何使用 EventHandlers。

就我而言,每次插入引用时,我都需要为 gson 库中的所有 JsonPrimitive 对象调用 Velocity 调用“getAsString”而不是 toString 方法。

就像创建一个

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);
于 2015-06-22T21:38:52.057 回答