Търсих начин да извлека списък с всички ключове, използвани и в шаблон 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}
person
Yannick De Turck
schedule
16.12.2014
Context
, който добавя ключовете на извиквания къмcontainsKey
илиget
къмSet<String>
, и да го използвате заедно сNullWriter
(commons-io) в стъпка на предварителна обработка. Освен че някак си се чувства зле, това също страда от теоретичния недостатък, че никой не гарантира (въпреки че трябва да работи, мисля), че Velocity ще извика някой от двата метода, защото не намира никакви ключове появява се вgetKeys()
. - person misberner   schedule 30.04.2013