天天看點

Jetbrick-template 1.2.0 釋出,新增預編譯功能

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"]