OpenResty学习笔记五,


OpenResty学习笔记五

  • 模板引擎
    • 下载lua-resty-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还提供了不需要解析片段、简单布局、可复用的代码块、宏指令等支持。

下载lua-resty-template

cd /example/lualib/resty/  
wget https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template.lua  
mkdir /example/lualib/resty/html  
cd /example/lualib/resty/html   
wget https://raw.githubusercontent.com/bungle/lua-resty/template/master/lib/resty/template/html.lua  
local template = require("resty.template") 

模板位置

需要告诉lua-resty-template去哪儿加载我们的模块,此处可以通过set指令定义template_location、template_root或者从root指令定义的位置加载

可以在example.conf配置文件的server部分定义

#first match ngx location  
set $template_location "/example/templates";
#then match root read file  
set $template_root "/example/templates";

也可以通过在server部分定义root指令

root /example/templates;

其顺序是

建议首先template_root,如果实在有问题再使用template_location,尽量不要通过root指令定义的document_root加载,因为其本身的含义不是给本模板引擎使用的。

使用模板

local template = require("resty.template")  
--是否缓存解析后的模板,默认true  
template.caching(true)  
--渲染模板需要的上下文(数据)  
local context = {title = "title"}  
--渲染模板  
template.render("t1.html", context)  
  
  
ngx.say("<br/>")  
--编译得到一个lua函数  
local func = template.compile("t1.html")  
--执行函数,得到渲染之后的内容  
local content = func(context)  
--通过ngx API输出  
ngx.say(content)  

常见用法即如下两种方式:要么直接将模板内容直接作为响应输出,要么得到渲染后的内容然后按照想要的规则输出。

模板文件 t1.html

{(header.html)}  
   <body>  
      {# 不转义变量输出 #}  
      姓名:{* string.upper(name) *}<br/>  
      {# 转义变量输出 #}  
      简介:{{description}}<br/>  
      {# 可以做一些运算 #}  
      年龄: {* age + 1 *}<br/>  
      {# 循环输出 #}  
      爱好:  
      {% for i, v in ipairs(hobby) do %}  
         {% if i > 1 then %}{% end %}  
         {* v *}  
      {% end %}<br/>  
  
      成绩:  
      {% local i = 1; %}  
      {% for k, v in pairs(score) do %}  
         {% if i > 1 then %}{% end %}  
         {* k *} = {* v *}  
         {% i = i + 1 %}  
      {% end %}<br/>  
      成绩2:  
      {% for i = 1, #score2 do local t = score2[i] %}  
         {% if i > 1 then %}{% end %}  
          {* t.name *} = {* t.score *}  
      {% end %}<br/>  
      {# 中间内容不解析 #}  
      {-raw-}{(file)}{-raw-}  
   </body>  
{(footer.html)}  

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

{* var *}:变量输出;

{{ var }}:变量转义输出;

{% code %}:代码片段;

{# comment #}:注释;

{-raw-}:中间的内容不会解析,作为纯文本输出;

模板最终被转换为Lua代码进行执行,所以模板中可以执行任意Lua代码。

相关内容

    暂无相关文章