检查代币是否已被替换

时间:2014-09-25 11:24:37

标签: java token velocity

我使用Apache Velocity在模板中替换令牌,如下所示:

<batch>
    #set( $appName = "helloworld" )
    #set( $appDisplayName = "Hello World App")
    #set( $appVersion = "1.0")
    <registerapplication>
        <appkey>$appkey</appkey>
        <appname>$appName</appname>
        <appversion>$appVersion</appversion>
        <appdescriptiondefault>$appDisplayName</appdescriptiondefault>
    </registerapplication>
</batch>

以下三行代码可以解决问题:

Velocity.init();
StringWriter w = new StringWriter();
Velocity.evaluate(new VelocityContext(), w, "", new InputStreamReader(inputStream);

它完美无缺,但我还有其他要求。如果确实已经进行了一些替换,则用户应该收到通知。否则,即模板看起来像是

<batch>
    #set( $appName = "helloworld" )
    #set( $appDisplayName = "Hello World App")
    #set( $appVersion = "1.0")
    <registerapplication>
        <appkey>$appkey</appkey>
        <appname>helloworld</appname>
        <appdescriptiondefault>Hello World App</appdescriptiondefault>
    </registerapplication>
</batch>

不应采取任何行动。

知道如何实现这个目标吗?

upd 感谢Claude Brisson。我的解决方案如下:

VelocityContext velocityContext = new VelocityContext();
EventCartridge eventCartridge = new EventCartridge();
velocityContext.attachEventCartridge(eventCartridge);
eventCartridge.addReferenceInsertionEventHandler(new ReferenceInsertionEventHandler()
{
      @Override
    public Object referenceInsert(String reference, Object value)
    {
        if (!varSubsituted && value != null)
        {
            varSubsituted = true;
        }
        return value;
    }
});

1 个答案:

答案 0 :(得分:0)

您可以使用引用插入处理程序。

首先,创建处理程序类:

package mypackage;
import org.apache.velocity.app.event.ReferenceInsertionEventHandler;

public class MyHandler implements ReferenceInsertionEventHandler
{
    public Object referenceInsert( String reference, Object value  )
    {
        // ...notify user...
    }
}

然后,您可以在 velocity.properties 文件中注册处理程序,其中包含:

eventhandler.referenceinsertion.class = mypackage.UserNotifyHandler

在多线程应用程序中,由于Velocity是单线程的,因此您可以使用全局线程特定变量来保存用户的信息,因为您需要在处理程序中使用它。