openresty 中使用lua 的頁面模板類庫template來渲染頁面

動態web網頁開發是Web開發中一個常見的場景,比如像京東商品詳情頁,其頁面邏輯是非常複雜的,需要使用模板技術來實現。而Lua中也有許多模板引擎,如目前我在使用的lua-resty-template,可以渲染很複雜的頁面,藉助LuaJIT其性能也是可以接受的。

如果學習過JavaEE中的servlet和JSP的話,應該知道JSP模板最終會被翻譯成Servlet來執行;而lua-resty-template模板引擎可以認爲是JSP,其最終會被翻譯成Lua代碼,然後通過ngx.print輸出。

而lua-resty-template和大多數模板引擎是類似的,大體內容有:

模板位置:從哪裏查找模板;

變量輸出/轉義:變量值輸出;

代碼片段:執行代碼片段,完成如if/else、for等複雜邏輯,調用對象函數/方法;

註釋:解釋代碼片段含義;

include:包含另一個模板片段;

其他:lua-resty-template還提供了不需要解析片段、簡單佈局、可複用的代碼塊、宏指令等支持

模板的一些常用特殊指令,類似與jsp中的指令一樣

{(include_file)}:包含另一個模板文件;

{* var *} :變量輸出;

{{ var }}:變量轉義輸出

{% code %}:代碼片段

{# comment #}:代碼註釋

{-raw-}:中間內容不會解析,作爲純文本輸出;

下載lua 模板類庫

wget https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template.lua 

wget https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template/html.lua  

首先來看下template.lua的模板路徑選擇

lua查找模板頁面路徑的選擇:以下是lua  template.lua的源碼

兩個指定的變量:

template_location:指向ngx的location,使用內部調用internal,alias用於指定文件夾的別名。

 注意:不能使用location =/templates 中的只 等於 ‘=’ 符號來修飾,因爲lua腳本的源碼 capture(location/file),比如/templates/t1.html,如果使用=匹配,就匹配不到了。

template_root:指向模板頁面的根路徑。

兩者關係:首先從template_location中配置的路徑獲取模板,如果沒有在從template_root配置的路徑中獲取,如果還是沒有的話,最後從nginx的document_root中獲取路徑中的模板頁面

 

API

使用模板引擎的目的就是輸出響應內容:主要有兩種方式輸出:

第一種:通過ngx.print/ngx.say輸出渲染後的內容。

第二種:得到模板渲染之後的內容按照想要的規則輸出。

 

第一種配置:

模板的內容:

得到的結果:

第二種方式:

模板配置的內容:

結果如下:

模板最終被轉換爲lua代碼進行執行,所以模板中可以執行任意的lua代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章