freemarker模板加載TemplateLoader常見方式

使用過freemarker的確定其見過以下狀況: java

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

模板找不到。可能你會認爲我明明指定了文件,而且文件存在,可是爲何就是說找不到呢? 
通過研究官方的API,原來freemarker在加載模板時,建議使用TemplateLoader,經過TemplateLoader指定從哪一個目錄開始加載模板,而且把模板加載在緩存中。 spring

API的TemplateLoader是一個接口,他有以下幾個實現類: 緩存

ClassTemplateLoader, FileTemplateLoader, MultiTemplateLoader, StringTemplateLoader, URLTemplateLoader, WebappTemplateLoader  app

顧名思義,咱們能從類名中猜測到freemarker的模板加載機制,舉例說明兩個: ui

一、FileTemplateLoader 
 此是文件模板加載器,此便可以經過文件的絕對路徑加載模板,如: spa

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");

二、ClassTemplateLoader 
此是經過指定類所在的目錄來指定模板所在根路徑,即指定類在哪一個目錄,那麼這個目錄就是加載模板文件的根目錄,以下: code

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/目錄blog

其它的加載器原理同上。

若是你是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目錄下開始找。 

相關文章
相關標籤/搜索