freemarker报 java.io.FileNotFoundException:及TemplateLoader使用
使用过freemarker的肯定其见过如下情况:
1 java.io.FileNotFoundException: Template xxx.ftl not found.
模板找不到。可能你会认为我明明指定了文件,并且文件存在,但是为什么就是说找不到呢?
经过研究官方的API,原来freemarker在加载模板时,建议使用TemplateLoader,通过TemplateLoader指定从哪个目录开始加载模板,并且把模板加载在缓存中。
API的TemplateLoader是一个接口,他有如下几个实现类:
1 ClassTemplateLoader, FileTemplateLoader, MultiTemplateLoader, StringTemplateLoader, URLTemplateLoader, WebappTemplateLoader
顾名思义,我们能从类名中猜想到freemarker的模板加载机制,举例说明两个:
1:FileTemplateLoader
此是文件模板加载器,此即可以通过文件的绝对路径加载模板,如:
1 TemplateLoader templateLoader=null; 2 String path=""; 3 4 //使用FileTemplateLoader 5 templateLoader=new FileTemplateLoader(new File("项目根路径")); 6 path="/WEB-INF/classes/com/xxx/tag/templates/page/xxx.ftl"; 7 8 cfg.setTemplateLoader(templateLoader); 9 Template t=cfg.getTemplate(path,"UTF-8");
2:ClassTemplateLoader
此是通过指定类所在的目录来指定模板所在根路径,即指定类在哪个目录,那么这个目录就是加载模板文件的根目录,如下:
1 Configuration cfg = new Configuration(); 2 3 TemplateLoader templateLoader=null; 4 String path=""; 5 6 templateLoader=new ClassTemplateLoader(PageTag.class,"templates/page/"); 7 path="standardd.ftl"; 8 9 cfg.setTemplateLoader(templateLoader); 10 Template t=cfg.getTemplate(path,"UTF-8");
此即表示比PageTag类所在的目录开始找,找这个目录下的templates/page/目录,
其它的加载器原理同上,
如果你是web项目,并且使用了spring,那么。你还可以通过spring来配置你模板文件的根目录,如下:
1 <bean id="freemarkerConfig" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean"> 2 <property name="templateLoaderPath" value="/WEB-INF" /> 3 <property name="freemarkerSettings"> 4 <props> 5 <prop key="defaultEncoding">UTF-8</prop> 6 </props> 7 </property> 8 </bean>
此即表示从WEB-INF目录下开始找。
原文:http://zwllxs.iteye.com/blog/996244