FreeMarker設置裝備擺設(Configuration)。本站提示廣大學習愛好者:(FreeMarker設置裝備擺設(Configuration))文章只能為提供參考,不一定能成為您想要的結果。以下是FreeMarker設置裝備擺設(Configuration)正文
p> 基本
Configuration 是一個寄存運用級別(application level)公共設置裝備擺設信息,和模版(Template)可以使用的全局同享變量的一個對象。同時它還擔任模版(Template)實例的創立和緩存。Configuration 現實上是freemarker.template.Configuration 對象的實例,應用其結構函數創立。平日運用應用一個同享的單實例Configuration 對象。
Configuration 對象可被Template 對象的辦法應用,每個模版實例都聯系關系與一個Configuration 實例,它是經由過程Template 的結構函數被聯系關系出來的,平日是你應用這個辦法來Configuration.getTemplate 取得模版對象的。
同享變量
同享變量是那些界說給一切模版(Template)應用的變量。你可以經由過程configuration對象的setSharedVariable 辦法來添加同享變量。
Configuration cfg = new Configuration(); ... cfg.setSharedVariable("wrap", new WrapDirective()); cfg.setSharedVariable("company", "Foo Inc."); // Using ObjectWrapper.DEFAULT_WRAPPER
一切與該configuration 對象聯系關系的模版實例都便可以經由過程取得to_upper 轉換器,company 來取得字符串,是以你不須要再一次次的往root 中添加這些變量了。假如你往root 添加同名的變量,那末你新添加的變量將會籠罩之前的同享變量。
正告!
假如configuration 對象被多線程挪用,那末不要應用TemplateModel 完成類作為同享變量,由於他們長短線程平安的,例如基於servlet 的web 站點就是這類情形。
Configuration 對象初始化時曾經包括一些同享轉換器變量:
名字類
設置裝備擺設參數
設置裝備擺設參數是那些可以影響FreeMarker 運轉行動的那些定名參數。例如locale,number_format。
設置裝備擺設參數存儲在Configuration實例中,它可以被模版實例(Template)修正。例如,你在Configuration中設置了locale等於"en_US",那末一切的模版對象都邑應用,"en_US"除非你在單個模版實例中應用setLocale辦法修正了默許設置裝備擺設。是以configuration設置的參數可以看成是默許參數,它可以被Template一級設置的參數籠罩,而它們二者設置的參數信息又可以被情況中設置的參數所籠罩(也就是模版文件指令設置的)以下:
${1.2}<#setting locale="en_US">${1.2}
這類挪用方法你可以想象成3 個層(設置裝備擺設對象層,模版層,運轉情況層)上面表格中顯示了每層關於參數的設置:
那末設置裝備擺設參數的終究成果分離是:A = 1, B = 2, C = 3, D = 1, E = 2.而F 參數極可能就是null。
假如要查詢可設置的參數列表,你可以查閱FreeMarker API 文檔的以下兩個部門:
一切層的設置裝備擺設
freemarker.core.Configurable.setSetting(String, String)
Coniguration 層的設置裝備擺設
freemarker.template.Configuration.setSetting(String,String)
加載模板
模版加載器
模版加載器是基於籠統途徑("index.ftl"或"products/catalog.ftl")加載原始數據的那些對象,而畢竟加載何種資本(目次中的文件數據照樣數據庫中的數據)取決於詳細的加載器完成。當你挪用cfg.getTemplate 時,FreeMarker 將會訊問你之前設置裝備擺設給Configuration 對象的模版加載器,有該模版加載器擔任文件的載入。
內建的模版加載器
你可以用以下三個辦法來設置模版加載的三種方法
void setDirectoryForTemplateLoading(File dir);
或許
void setClassForTemplateLoading(Class cl, String prefix);
或許
void setServletContextForTemplateLoading(Object servletContext, String path);
以上第一種方法顯示的指定了一個文件體系中的目次,FreeMarker 將會在此目次記錄模版,不消說,此目次必需存在,否在會拋出異常。
第二種方法以一個Class作為一個輸出參數,當你想應用ClassLoader的方法來加載模版的時刻,你便可以應用這類方法,這類方法將會挪用來尋覓模版文件,同時這類模版加載的方法要比前一種穩固一些特別是在臨盆體系中。你可以很輕易的把資本文件,和圖標等打包到.jar 文件中。
第三種方法把web 運用的高低文和基途徑(絕對與WEN-INF 的父路出去說)作為參數。該種方法的模版加載器將會從web 運用高低文種加載模版。
從多個地位加載模版
假如你想從多個地位加載模版的話,你可以分離創立與分歧地位對應的單個模版加載器,然後把它們包裹到一個名叫MultiTemplateLoader模版加載器中,終究經由過程辦法setTemplateLoader(TemplateLoader loader)把其設置給Configuration 對象,以下有一個從兩個分歧地位加載模版的例子:
import freemarker.cache.*; // template loaders live in this package ... FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates")); FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates")); ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), ""); TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl }; MultiTemplateLoader mtl = new MultiTemplateLoader(loaders); cfg.setTemplateLoader(mtl);
FreeMarker 將會起首在途徑/tmp/templates中搜刮模版文件,假如沒有找到那末回到途徑/usr/data/templates中搜刮,假如還沒有找到,那末則會測驗考試用class-loader的方法加載。
從其他資本中獲得模版文件
假如在這些內建的模版加載器中沒有一個相符你的請求,那末你可以本身定制一個模版加載器,只須要完成freemarker.cache.TemplateLoader 接口便可以了,然後經由過程辦法setTemplateLoader(TemplateLoader loader)把其傳遞給Configuration對象。
緩存模版
FreeMarker緩存模版的意思就是,當你經由過程getTemplate辦法獲得一個模版的時刻,FreeMarker不只會前往一個Template對象,並且會緩存該對象,當你下一次以雷同的途徑要求模版的時刻,它就會前往緩存中的模版對象。假如你轉變了模版文件,那末當你下一次獲得模版的時刻,FreeMarker會主動從新加載,從新解析模版。固然如斯,然則假如直接斷定一個文件能否修正過是一個耗時的操作,那末FreeMarker 在Configuration 對象級別供給了一個設置裝備擺設參數“update delay”。該參數的意思是FreeMarker多長時光去斷定一次模版的版本,默許設置是5秒鐘,也就是每一個5秒就會斷定模版能否經由修正,假如你想及時的斷定,那末設置該參數為0。別的一點須要留意,其實不是一切的加載器都支撐這類斷定方法,舉例來講基於class-loader 的模版加載器就不會發明你修正過模版文件。
關於刪除緩存中的模版FreeMarker 是這麼做的,你可使用Configuration 對象辦法clearTemplateCache 以手工的方法清晰緩存中的模版對象。而現實上緩存部門可以作為一個組建參加到FreeMarker 中(也就是它可使用第三方緩存計劃)你可以經由過程設置cache_storage 這個參數來完成。對年夜多半開辟者來FreeMarker 自帶的freemarker.cache.MruCacheStorage 完成曾經足夠了。這個緩存應用2 個級其余Most Recently Used(比來最多用)戰略。在第一個級別,一切的緩存條目都是應用強援用(strongly referenced:條目其實不會被JVM 所清晰,與其絕對的弱援用softly reference)直達到到最年夜時光,那些比來起碼應用的條目就會被遷徙到二級緩存。在這個級別條目都是應用弱援用直達到到過時。若援用與強援用的區域的年夜小是可以在結構函數中設置的,例如你想把強援用區域設置為20,弱援用區域設置為250,那你可使用以下代碼:
cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250))
因為MruCacheStorage 是默許的緩存完成,那末你也能夠如許設置:
cfg.setSetting(Configuration.CACHE_STORAGE_KEY,"strong:20, soft:250");
當你創立一個新的Configuration時,其默許應用MruCacheStorage緩存完成且默許的值maxStrongSize等於0,maxSoftSize等於Integer.MAX_VALUE(也就是實際最年夜值)。然則關於高負荷的體系來講,我們建議maxStrongSize 設置成一個非0 的數值,否則會招致頻仍的從新加載,從新解析模版。
異常處置
能夠發生的異常
FreeMarker 發生的異常普通可歸以下幾類:
FreeMarker 初始化階段發生的異常: 平日在你的運用中僅須要初始化FreeMarker 一次,而當在這個時光段類發生的異常就叫做初始化異常。
加載解析模版期的異常:當你經由過程Configuration.getTemplate()辦法獲得模版的時刻(假如模版之前沒有被緩存),將會發生兩類異常:
IOException:因為模版沒有找到,或在讀取模版的時刻產生其他的IO異常,好比你沒有讀取該文件的權限等等; freemarker.core.ParseException 因為模版文件的語法應用不准確;
履行時代的異常:當你挪用Template.process(...)辦法的時刻,會拋出兩類異常:
IOException 往輸入寫數據時刻產生的毛病; freemarker.template.TemplatException其他運轉期發生的異常,好比一個最多見的毛病就是模版援用了一個不存在的變量;