jetbrick-template-1.2.0 釋出,新增預編譯功能。
具體更新内容如下:
功能更新
[新增] #38 增加預設的 #tag cache() 實作模闆局部緩存功能
[新增] #49 增加模闆預編譯工具/選項
[新增] #54 增加安全管理器:黑白名單
[新增] #62 在 web 環境中使用 jetx 時候,建議增加一個隐藏變量
[新增] #63 對 array/list/map 的 [] 通路,增加安全調用
[新增] #64 spell error in jetannoations class name, should be jetannotations.
[新增] #65 給 #for 指令内部對象增加 for.odd 和 for.even 支援.
模闆的預編譯選項
原來有個編譯參數 compile.always 是用來控制在首次通路的時候,是強制進行編譯還是從上次編譯的結果直接load編譯好的class。
而新版本則更進一步,提供了更加靈活的編譯政策,目前有 4 種可以選擇:
1 compile.strategy = precompile
2 compile.strategy = always
3 compile.strategy = auto
4 compile.strategy = none
compile.always 已廢棄。
precompile
在 jetengine 初始化的時候,自動擷取所有的模闆(根據 template.suffix 過濾),然後啟動一個獨立的線程進行編譯。
這樣雖然啟動時間會增加,但是後面的模闆通路将會非常的快。并且在預編譯沒有完成期間,應用可以正常通路,不沖突。
always (預設值)
和原先的 compile.always = true 等價。
就是在模闆被首次通路的時候,進行編譯。
auto
和原先的 compile.always = false 等價。
就是在模闆被首次通路的時候,如果磁盤中已經存在編譯好的 class 檔案(并且源檔案沒有改變),那麼直接加載該 class 檔案,否則進行編譯。
none
改模式下,将不在對模闆進行編譯。(釋出的時候,使用者無需釋出任何模闆源檔案)
使用者必須通過 jetxgenerateapp 預編譯工具,事先将模闆全部編譯成 class 檔案,并将所有的 class 檔案放在 classpath 下面。
注意: class 檔案放在 classpath 下面,而不是 compile.path 對應的目錄。
注意:
不管采用什麼模式,對于使用 jetengine.createtemplate(source) 直接由源碼建立的模闆,仍然需要進行編譯。
jetxgenerateapp 預編譯工具
使用者可以在外部通過指令行調用,将所有的模闆進行預編譯,這樣生産環境可以直接使用預編譯好的 class 檔案,減少首次通路時候的延遲。
01 shell # java -jar jetbrick-template-.jar \
02 -all \
03 -src /webapp/templates \
04 -d /webapp/generatedclasses \
05 -config /webapp/web-inf/jetbrick-template.properties
06
07 options:
08 -all: compile all templates even if errors
09 -src : template root directory
10 -d : output directory
11 -config : config file
預編譯完成後,請設定 compile.strategy = none。
安全管理器:黑白名單
安全管理器主要用于對模闆中調用類,方法和通路字段進行安全管理。主要用于類似于 cms 系統中,需要使用者自定義模闆的時候時候,防止使用者通路未經授權的内容。
安全管理器預設通過一個黑白名單清單來實作。黑白名單可以放在一個單獨的文本檔案中,也可以直接放在配置檔案中。使用者也可以實作自定義的安全管理器。
安全管理器預設禁用,如需使用,需要如下的配置:
jetx-white-black-list.txt 範例内容如下:
提示:
安全管理器隻在對模闆進行解析編譯的時候進行,運作期不會影響任何性能。
新增 ctxpath/webroot 全部變量和函數
其中 2 個變量:
同時支援函數方式調用:
如:
1 ${ctxpath("/index.jetx")}
2 ${webroot("/index.jetx")}
增加 #tag cache 實作緩存模闆片段
01 #tag application_cache("news_list", 60 * 60)
02
03 #for(news news: @newsmgmt.getall())
04
<a href="news/%24%7bnews.id%7d">$!{news.title}</a>
05 #end
07 #end
08
09 #tag session_cache("login_info", 5 * 60)
10 welcome ${logineduser.name},
11 logined at ${logineduser.lastdate}
12 #end
以上新聞資訊會被自動緩存 1 小時, 而使用者的登入資訊會緩存 5 分鐘。
如果需要臨時清楚緩存,可以通過如下代碼:
1 // application_cache
2 timedsizecache cache = (timedsizecache) servletcontext.getattribute(timedsizecache.cache_key);
3 cache.remove("news_list");
5 // session_cache
6 timedsizecache cache = (timedsizecache) session.getattribute(timedsizecache.cache_key);
cache.remove("login_info");
7
新增 for.odd, for.even
據需增強 for 循環狀态對象。
1 #for (user user: userlist)
2 #if (for.odd)
3 ...
4 #end
5 #if (for.even)
6 ...
7 #end
8 #end
對 array/list/map 的 [] 通路,增加安全調用
現在支援如下調用拉
1 array?[index]
2 list?[index]
3 map?["key"]