1

次のような 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

テンプレートを自分で解析せずに速度を使用してこのリストを取得するにはどうすればよいですか?

4

1 に答える 1

1

Velocity テンプレートでも使用されているすべてのキーのリストを取得する方法を探していました。コメントの 1 つで述べたように、独自の Visitor を実装して、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}
于 2014-12-16T11:39:01.587 に答える