2013-04-30 2 views
1

Предположим, у меня есть шаблон Velocity так:Получение списка заполнителем из шаблона Velocity

Hi!, my name is ${name} and I'm ${age} years old. 

Примечание шаблон не имеет петель и условные операторы.

Я хотел бы получить список с этими значениями

["name", "age"] 

Я проверил API, но выглядит как класс шаблона не имеет метод для этого: https://velocity.apache.org/engine/releases/velocity-1.7/apidocs/org/apache/velocity/Template.html

Как я могу получить этот список с использованием скорости без разбора шаблона?

+1

Я сделал это, но на данный момент у вас нет источника. Я думаю, что в итоге я использовал посетителей, но не могу вспомнить специфику. –

+1

Вы * можете * реализовать собственный 'Context', который добавляет ключи вызовов' containsKey' или 'get' к' Set ' и использует его вместе с 'NullWriter' (commons-io) на этапе предварительной обработки. Кроме того, это как-то плохо, это также страдает от теоретического дефицита, который никто не гарантирует * (хотя он должен работать, я думаю), что Velocity будет ссылаться на любой из двух методов, потому что он не находит никаких ключей, появляющихся в 'getKeys () '. – misberner

ответ

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} 
Смежные вопросы