2013-08-05 84 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爲例。