2012-10-01 55 views
0

macros.txt文件導入freemarker的宏

<#macro macro1> 
Helloworld. 
</#macro> 

我還有一個文件testMacro.txt。我想在文件testMacro.txt中使用這個宏。 我試過以下

<#import "./macros.txt" as my> 
<@my.macro1 /> 

但它似乎並沒有工作。

在我的Java文件,其中我與模板文件的工作,我(在我MacroWorking.java)

template = new Template(null,new FileReader("testMacro.txt"),new configuration()); 

異常的。

Exception in thread "main" java.lang.NullPointerException 
at freemarker.core.LibraryLoad.<init>(LibraryLoad.java:82) 
at freemarker.core.FMParser.Import(FMParser.java:1727) 
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2389) 
at freemarker.core.FMParser.Content(FMParser.java:2618) 
at freemarker.core.FMParser.OptionalBlock(FMParser.java:2786) 
at freemarker.core.FMParser.Root(FMParser.java:2958) 
at freemarker.template.Template.<init>(Template.java:149) 
at freemarker.template.Template.<init>(Template.java:172) 
at msjava.hdom.examples.DbQuery.main(MacroWorking.java:24) 

MacroWorking.java的第24行是上面給出的行。

編輯:使用相同的代碼,但我的testMacro.txt只有HELLOWORLD文本,即沒有導入語句,那麼它工作正常。 我該怎麼辦? 謝謝。

+0

您是否嘗試檢查第24行中的null對象? – 2012-10-01 12:14:26

+0

@Tichodroma問題編輯。 – Kraken

回答

2

這些模板沒有問題,問題在於您使用FreeMarker的Java API的方式。

#import嘗試解析./macros.txt路徑,它試圖相對解決它當前模板的路徑,但是因爲模板是從Reader加載,並且你已經通過null爲模板的名稱(這是一樣的模板路徑),它會遇到NPE情況。這是一個不正確的錯誤消息,但它無法解決該路徑,因爲它不知道當前模板來自哪裏(請記住,您只給FreeMarker一個Reader)。正確的方法是:

Configuration cfg = new Configuration(); 
cfg.setDirectoryForTemplateLoading(new File("/where/you/store/the/templates")); 

Template template = cfg.getTemplate("testMacro.txt"); 

現在FreeMarker的設置模板的名稱testMacro.txt並且它也需要加載和它緩存的照顧。如果您仍然需要直接從Reader加載模板,你可以做到這一點爲:

Template template = new Template("testMacro.txt", new FileReader(...), cfg); 

注意非空模板名稱。如果這是真實的,它並不重要,但它將用於解析該模板中的相對路徑。另請注意,模板加載器必須在Configuration中正確設置,因爲FreeMarker適用於虛擬路徑。

+0

非常感謝大家,仍然需要深入探討一下。 – Kraken

+0

正如在https://stackoverflow.com/questions/6040047/import-one-ftl-file-inside-another-ftl-file中提到的,有關「模板加載」章節的文檔位於freemarker.apache.org/docs /pgui_config_templateloading.html。它解釋了使用'TemplateLoader'的不同方式。太糟糕了,它沒有提及'StringTemplateLoader'類,當模板源代碼可用爲'String'時,這非常有用,這可能是您正在尋找的。 –