我正在創建一個自定義FreeMarker指令。作爲我的實現的一部分,我想在execute方法內部訪問自定義指令的Body。有沒有辦法從TemplateDirectiveBody body或Environment env中獲取它?FreeMarker:如何在實現TemplateDirectiveModel時將TemplateDirectiveBody作爲字符串獲取?
模板使用
<@loop>My name is ${name}</@loop>
實施
public class LoopDirective implements TemplateDirectiveModel{
public LoopDirective() {
}
public void execute(Environment env,
Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body)
throws TemplateException, IOException {
System.out.println(body);
// I want to print "My name is ${name}"
}
}
我不想使用類似完整的模板字符串:
Writer w = new StringWriter();
env.getCurrentTemplate().dump(w);
謝謝你的迴應。是的,我不想'$ {name}'來解決。當你說「你不應該這樣做」時,有什麼具體原因? 另外我想知道爲什麼[getChildrenBuffer](https://github.com/apache/incubator-freemarker/blob/2.3-gae/src/main/java/freemarker/core/Environment.java#L2807)在這裏不公開? Template.getSource(int,int,int,int)不會幫助我。我正在嘗試使用自定義指令來避免嵌套,但允許重複。 有效 <@loop> $ {ABC}@loop><@loop> $ {XYZ}@loop> 無效 <@loop> $ {ABC} <@loop> $ {XYZ}@loop>@loop> –
好吧,如果你指示模板語言的值代入,那麼它是相當不尋常的是要壓制這種行爲,並且對讀取模板的人感到困惑(因爲你改變了記錄的行爲)。但我不明白你想達到什麼。您可以在運行時檢查全局變量來禁止將'loop'嵌套到'loop'中。爲什麼這與解決'$ {exp}'有關? AST API-s,尤其是'getChildrenBuffer',是低層次的實現細節。 – ddekany
再次感謝您的回覆。如何禁止在運行時檢查全局變量來將'loop'嵌套到'loop'中? 我們正在接受來自用戶的模板,所以作爲一個安全的事情,我想避免無限循環或迭代過多。我正在創建一個自定義循環指令'<@loop>',就像'#list'一樣,我可以控制循環迭代的最大次數,並且還可以限制嵌套,即'<@loop><@loop>@loop> '。但重複應該工作,像'<@loop>@loop><@loop>@loop>'。 –