配置速度以使用toString以外的其他内容渲染对象?

时间:2008-12-17 16:28:09

标签: java templates velocity tostring webwork

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

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

是否有一些我可以添加的配置,我只想说

$someDate

代替? (假设我无法编辑日期类并给它一个合适的toString())。

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

4 个答案:

答案 0 :(得分:1)

Velocity允许使用名为velocimacros的JSTL实用程序:

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

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

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

然后这样称呼它:

#d($someDate)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

我只想完成答案,提供link to Velocity documentation,解释如何使用EventHandlers。

在我的情况下,每次插入引用时,我都需要Velocity为gson库中的所有JsonPrimitive对象调用“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);