2014-09-25 56 views
0

我使用Apache速度的模板,看起来像这样来代替令牌:检查令牌已经取代

<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感谢克劳德布里森。我的解决方案如下所示:

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

回答

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是单线程的,你可以使用一个全局线程特定的变量来保存用户的信息,因为你需要在你的处理程序中使用它。