国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - FreeMarker配置(Configuration)

FreeMarker配置(Configuration)

2020-04-21 11:46wulei JAVA教程

所有與該configuration 對象關聯的模版實例都就可以通過獲得to_upper 轉換器,company 來獲得字符串,因此你不需要再一次次的往root 中添加這些變量了。如果你往root 添加同名的變量,那么你新添加的變量將會覆蓋之前的共享變量。

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其他運行期產生的異常,比如一個最常見的錯誤就是模版引用了一個不存在的變量;

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久婷婷丁香 | 欧美怡红院视频一区二区三区 | 日本不卡免费新一二三区 | 午夜免费 | 日本一区二区高清视频 | 黄色免费在线观看网址 | 久久久久久精 | 精品自拍视频在线观看 | 亚洲天堂中文字幕 | 国产人成在线观看 | 色婷婷影院 | 久久久久久网站 | 国产区在线 | 亚洲综合激情 | 免费观看日韩一级片 | 国产精品一区二区无线 | 欧美日韩一区二区三区在线观看 | 久久成人免费视频 | 91在线观看高清视频 | 欧美在线操 | 2020国产在线| 51国产午夜精品免费视频 | 成人久久久久爱 | 日韩一区二区三区电影在线观看 | 国产成人精品一区二区三区网站观看 | 亚洲区欧美区 | 在线观看欧美一区 | 久久久久在线 | 国产成人免费 | 久久久精品日本 | av色伊人久久综合一区二区 | 亚洲日本乱码一区两区在线观看 | 欧美精品成人一区二区三区四区 | 在线激情视频 | 欧美精品欧美精品系列 | 色综合888 | 国产日韩精品一区 | 免费在线看黄 | 日韩视频在线观看一区 | 久久精品伊人 | 亚洲不卡在线观看 |