有没有办法配置Velocity使用toString()以外的东西将对象转换为模板中的字符串?例如,假设我使用带有format()方法的简单日期类,并且每次都使用相同的格式。如果我的所有速度代码都是这样的:
$someDate.format('M-D-yyyy')
是否有一些我可以添加的配置,我只想说
$someDate
代替? (假设我无法编辑日期类并给它一个合适的toString())。
我是在使用WebWork构建的web应用程序的上下文中执行此操作,如果有帮助的话。
答案 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);