程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> FreeMarker設置裝備擺設(Configuration)

FreeMarker設置裝備擺設(Configuration)

編輯:關於JAVA

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 對象初始化時曾經包括一些同享轉換器變量:

名字類

name class capture_output freemarker.template.utility.CaptureOutput compress freemarker.template.utility.StandardCompress html_escape freemarker.template.utility.HtmlEscape normalize_newlines freemarker.template.utility.NormalizeNewlines xml_escape freemarker.template.utility.XmlEscape

 

 

設置裝備擺設參數

設置裝備擺設參數是那些可以影響FreeMarker 運轉行動的那些定名參數。例如locale,number_format。

設置裝備擺設參數存儲在Configuration實例中,它可以被模版實例(Template)修正。例如,你在Configuration中設置了locale等於"en_US",那末一切的模版對象都邑應用,"en_US"除非你在單個模版實例中應用setLocale辦法修正了默許設置裝備擺設。是以configuration設置的參數可以看成是默許參數,它可以被Template一級設置的參數籠罩,而它們二者設置的參數信息又可以被情況中設置的參數所籠罩(也就是模版文件指令設置的)以下:

${1.2}<#setting locale="en_US">${1.2}


這類挪用方法你可以想象成3 個層(設置裝備擺設對象層,模版層,運轉情況層)上面表格中顯示了每層關於參數的設置:

Setting A Setting B Setting C Setting D Setting E Setting F Layer 3:Environment 1 - - 1 - - Layer 2:Template 2 2 - - 2 - Layer 1:Configuration 3 3 3 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其他運轉期發生的異常,好比一個最多見的毛病就是模版援用了一個不存在的變量;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved