2013-08-05 48 views
2

我有一个插件项目,我正在使用Velocity模板。用户可以从首选项页面更改模板正文,并且当用户在首选项页面中单击“确定”时,我想要获取模板正文中的变量。我需要帮助从Velocity模板体中提取变量。获取Velocity中的变量

回答

0

我能想到的唯一的办法是添加像这样的速度发动机:

VelocityContext context = new VelocityContext(); 
context.put("parameters", new HashMap()); 

...在模板中,让用户放值到参数的HashMap像这样:

#set ($t = $parameters.put("value", "key")) 

(重要:用户必须为其赋值给一个临时的参数,例如:$ T)

...然后,在渲染之后,取出来的值:

HashMap map = (HashMap)context.get("parameters"); 
for (String key : map.keySet()) { 
    // ... 
} 
3

Velocity使用JavaCC来解析模板并创建AST。

RuntimeInstance是解析模板所需的全部。

RuntimeInstance ri = new RuntimeInstance(); 
SimpleNode node = ri.parse(reader, "templateName"); 

现在您必须根据您的需要扩展BaseVisitor。 BaseVisitor是所有访问者的抽象类。 BaseVisitor有一种节点类型的方法,因此您可以轻松过滤AST节点。

ParserVisitor visitor = new BaseVisitor() { 
@Override 
public Object visit(final ASTReference node, final Object data) { 
    //insert here your logic ... 
    System.out.println(node.getFirstToken(); 
    //use super.visit(node, data) if you need to traverse all node children 
    return null; 
    } 
}; 

然后访问节点...

visitor.visit(node, null); 

如果您有一个模板,如下所示:

some text $var other text 

建议代码只打印出$var

请注意,ASTReference是任何参考。如果你有一个模板如下:

some text $var other text 
#set($primate = "monkey") 

这段代码打印出:$var$primate

0

xdocreport项目做了这项工作。

<dependency> 
    <groupId>fr.opensagres.xdocreport</groupId> 
    <artifactId>xdocreport</artifactId> 
    <version>1.0.6</version> 
</dependency> 


StringReader templateReader = new StringReader(stringyTemplateContent); 
FieldsExtractor<FieldExtractor> extractor = FieldsExtractor.create(); 
VelocityFieldsExtractor.getInstance().extractFields(templateReader, templateName, extractor); 

for (FieldExtractor fieldExtractor : extractor.getFields()) { 
    System.out.println(fieldExtractor.getName()); 
} 

我以他们的VelocityFieldsExtractorTestCase为例。