freemarker報 java.io.FileNotFoundException:及Te...
使用過(guò)freemarker的肯定其見(jiàn)過(guò)如下情況:
- java.io.FileNotFoundException: Template xxx.ftl not found.
模板找不到??赡苣銜?huì )認為我明明指定了文件,并且文件存在,但是為什么就是說(shuō)找不到呢?
經(jīng)過(guò)研究官方的API,原來(lái)freemarker在加載模板時(shí),建議使用TemplateLoader,通過(guò)TemplateLoader指定從哪個(gè)目錄開(kāi)始加載模板,并且把模板加載在緩存中。
API的TemplateLoader是一個(gè)接口,他有如下幾個(gè)實(shí)現類(lèi):
- ClassTemplateLoader, FileTemplateLoader, MultiTemplateLoader, StringTemplateLoader, URLTemplateLoader, WebappTemplateLoader
顧名思義,我們能從類(lèi)名中猜想到freemarker的模板加載機制,舉例說(shuō)明兩個(gè):
1:FileTemplateLoader
此是文件模板加載器,此即可以通過(guò)文件的絕對路徑加載模板,如:
- TemplateLoader templateLoader=null;
- String path="";
-
-
- templateLoader=new FileTemplateLoader(new File("項目根路徑"));
- path="/WEB-INF/classes/com/xxx/tag/templates/page/xxx.ftl";
-
- cfg.setTemplateLoader(templateLoader);
- Template t=cfg.getTemplate(path,"UTF-8");
2:ClassTemplateLoader
此是通過(guò)指定類(lèi)所在的目錄來(lái)指定模板所在根路徑,即指定類(lèi)在哪個(gè)目錄,那么這個(gè)目錄就是加載模板文件的根目錄,如下:
- Configuration cfg = new Configuration();
-
- TemplateLoader templateLoader=null;
- String path="";
-
- templateLoader=new ClassTemplateLoader(PageTag.class,"templates/page/");
- path="standardd.ftl";
-
- cfg.setTemplateLoader(templateLoader);
- Template t=cfg.getTemplate(path,"UTF-8");
此即表示比PageTag類(lèi)所在的目錄開(kāi)始找,找這個(gè)目錄下的templates/page/目錄,
其它的加載器原理同上,
如果你是web項目,并且使用了spring,那么。你還可以通過(guò)spring來(lái)配置你模板文件的根目錄,如下:
- <bean id="freemarkerConfig" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
- <property name="templateLoaderPath" value="/WEB-INF" />
- <property name="freemarkerSettings">
- <props>
- <prop key="defaultEncoding">UTF-8</prop>
- </props>
- </property>
- </bean>
此即表示從WEB-INF目錄下開(kāi)始找。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。