假设我有这样的Velocity模板:
Hi!, my name is ${name} and I'm ${age} years old.
请注意,模板没有循环或条件语句。
我想获得一个包含这些值的列表
["name", "age"]
我检查了API,但看起来Template类没有这方法:https://velocity.apache.org/engine/releases/velocity-1.7/apidocs/org/apache/velocity/Template.html
如何在不自行解析模板的情况下使用velocity获取此列表?
答案 0 :(得分:1)
我一直在寻找一种方法来检索Velocity模板中使用的所有键的列表。正如其中一条评论中所提到的,您可以实现自己的访问者来运行Velocity模板中的所有节点。
这是一个片段,用于存储模板中遇到的键,然后打印出来:
VelocityEngine ve = new VelocityEngine();
Properties props = new Properties();
props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
props.put("resource.loader", "class");
ve.init(props);
Template t = ve.getTemplate("templates/my-template.vm");
final List<String> keys = new ArrayList<String>();
SimpleNode sn = (SimpleNode)t.getData();
BaseVisitor myVisitor = new BaseVisitor(){
@Override
public Object visit(ASTReference node, Object data){
String key = node.literal();
keys.add(key);
return super.visit(node, data);
}
};
sn.jjtAccept(myVisitor, new Object());
for (String key : keys) {
System.out.println(key);
}
例如,如果您的Velocity模板具有以下内容:
<p>Dear ${user.name}, the ordered package has been sent to ${user.address}.</p>
将打印以下内容:
${user.name}
${user.address}