freemarker模板加载TemplateLoader常见方式

使用过freemarker的肯定其见过如下情况: 

java.io.FileNotFoundException: Template xxx.ftl not found.  

模板找不到。可能你会认为我明明指定了文件,并且文件存在,但是为什么就是说找不到呢? 
经过研究官方的API,原来freemarker在加载模板时,建议使用TemplateLoader,通过TemplateLoader指定从哪个目录开始加载模板,并且把模板加载在缓存中。 

API的TemplateLoader是一个接口,他有如下几个实现类: 

ClassTemplateLoader, FileTemplateLoader, MultiTemplateLoader, StringTemplateLoader, URLTemplateLoader, WebappTemplateLoader  

顾名思义,我们能从类名中猜想到freemarker的模板加载机制,举例说明两个: 

1、FileTemplateLoader 
 此是文件模板加载器,此即可以通过文件的绝对路径加载模板,如: 

TemplateLoader templateLoader=null;  
           String path="";  
             
           //使用FileTemplateLoader  
          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 
此是通过指定类所在的目录来指定模板所在根路径,即指定类在哪个目录,那么这个目录就是加载模板文件的根目录,如下: 

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类所在的目录开始找,找这个目录下的templates/page/目录

其它的加载器原理同上。

如果你是web项目,并且使用了spring,那么。你还可以通过spring来配置你模板文件的根目录,如下: 

<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目录下开始找。 

posted on 2017-05-21 12:58  沉风丶  阅读(19831)  评论(0编辑  收藏  举报

导航