我使用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;
}
});
答案 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是单线程的,因此您可以使用全局线程特定变量来保存用户的信息,因为您需要在处理程序中使用它。