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

发布于 2024-07-10 16:09:32 字数 347 浏览 14 评论 0原文

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

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

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

$someDate

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

我正在使用 WebWork 构建的 Web 应用程序的上下文中执行此操作(如果有帮助的话)。

Is there a way to configure Velocity to use something other than toString() to convert an object to a string in a template? For example, suppose I'm using a simple date class with a format() method, and I use the same format every time. If all of my velocity code looks like this:

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

is there some configuration I could add that would let me just say

$someDate

instead? (Assuming I'm not in a position to just edit the date class and give it an appropriate toString()).

I'm doing this in the context of a webapp built with WebWork, if that helps.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

栀子花开つ 2024-07-17 16:09:32

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

You could also create your own ReferenceInsertionEventHandler that watches for your dates and automatically does the formatting for you.

音盲 2024-07-17 16:09:32

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

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

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

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

然后像这样调用它:

#d($someDate)

Velocity allows for a JSTL like utility called velocimacros:

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

This would allow you to define a macro like:

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

And then call it like so:

#d($someDate)
苍白女子 2024-07-17 16:09:32

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

Oh, and the 1.6+ versions of Velocity have a new Renderable interface. If you don't mind tying your date class to a Velocity API, then implement this interface and Velocity will use the render(context, writer) method (for your case, you just ignore the context and use the writer) instead of toString().

漆黑的白昼 2024-07-17 16:09:32

我也遇到了这个问题,并且能够根据 内森·布布纳回答

我只是想通过提供 Velocity 文档的链接来完成答案< /a> 解释了如何使用事件处理程序。

就我而言,每次插入引用时,我都需要 Velocity 调用“getAsString”而不是 gson 库中所有 JsonPrimitive 对象的 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);

I faced this problem too and I was able to solve it based on Nathan Bubna answer.

I'm just trying to complete the answer providing the link to Velocity documentation which explains how to use EventHandlers.

In my case, I needed Velocity calls "getAsString" instead of toString method for all JsonPrimitive objects from gson library every time that a reference was inserted.

It was as simple as creating a

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;
    }

}

And add the event to the VelocityContext

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

...

context.attachEventCartridge(vec);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文