openresty mvc框架
常用Lua开发库3-模板渲染
动态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
1 | cd /usr/example/lualib/resty/ |
模板位置定义
我们需要告诉lua-resty-template去哪儿加载我们的模块,此处可以通过set指令定义template_location、template_root或者从root指令定义的位置加载。
如我们可以在example.conf配置文件的server部分定义
1 | #first match ngx location |
也可以通过在server部分定义root指令
root /usr/example/templates;
其顺序是
1 | local function load_ngx(path) |
1、通过ngx.location.capture从template_location查找,如果找到(状态为为200)则使用该内容作为模板;此种方式是一种动态获取模板方式;
2、如果定义了template_root,则从该位置通过读取文件的方式加载模板;
3、如果没有定义template_root,则默认从root指令定义的document_root处加载模板。
此处建议首先template_root,如果实在有问题再使用template_location,尽量不要通过root指令定义的document_root加载,因为其本身的含义不是给本模板引擎使用的。
接下来定义模板位置
mkdir /usr/example/templates
mkdir /usr/example/templates2
example.conf配置server部分
1 | #first match ngx location |
首先查找/usr/example/template2,找不到会查找/usr/example/templates。
然后创建两个模板文件
1 | vim /usr/example/templates2/t1.html |
内容为
template2
1 | vim /usr/example/templates/t1.html |
内容为
1 | template1 |
1 | mkdir -p /usr/example/lua/ |
1 | local template = require("resty.template") |
访问如http://192.168.1.2/lua_template_1将看到template2输出。
然后rm /usr/example/templates2/t1.html,reload nginx将看到template1输出。
接下来的测试我们会把模板文件都放到/usr/example/templates下。
API
使用模板引擎目的就是输出响应内容;主要用法两种:直接通过ngx.print输出或者得到模板渲染之后的内容按照想要的规则输出。
1、test_template_2.lua
1 | vi /usr/example/lua/test_template_2.lua |
内容:
1 | local template = require("resty.template") |
2、examle.conf配置文件
1 | location /lua_template_2 { |
使用示例
1、test_template_3.lua
1 | local template = require("resty.template") |
请确认文件编码为UTF-8;context即我们渲染模板使用的数据。
2、模板文件/usr/example/templates/t3.html
1 | {(header.html)} |
include_file:包含另一个模板文件;
var :变量输出;
var :变量转义输出;
code :代码片段;
comment :注释;
raw:中间的内容不会解析,作为纯文本输出;
模板最终被转换为Lua代码进行执行,所以模板中可以执行任意Lua代码。
3、example.conf配置文件
1 | location /lua_template_3 { |
访问如http://192.168.1.2/lua_template_3进行测试。
基本的模板引擎使用到此就介绍完了
参考:http://jinnianshilongnian.iteye.com/blog/2187775
使用Nginx+Lua(OpenResty)开发高性能Web应用
第一章 安装Nginx+Lua开发环境
第二章 Nginx+Lua开发入门
第三章 Redis/SSDB+Twemproxy安装与使用
第四章 Lua模块开发
第五章 常用Lua开发库1-redis、mysql、http客户端
第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
第五章 常用Lua开发库3-模板渲染
第六章 Web开发实战1——HTTP服务
第七章 Web开发实战2——商品详情页
第八章 流量复制/AB测试/协程
http://geek.csdn.net/user/publishlist/lzz957748332
openresty官网:http://openresty.org/(中文版:http://openresty.org/cn/)
Nginx教程:https://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
lua5.1文档:http://www.lua.org/manual/5.1/
openresty最佳实践:https://www.gitbook.com/book/moonbingbing/openresty-best-practices/details
Nginx-lua模块文档:https://github.com/openresty/lua-nginx-module
https://idevz.gitbooks.io/vanilla-zh/content/
https://github.com/idevz/vanilla
http://www.stuq.org/course/1015/study
https://moonbingbing.gitbooks.io/openresty-best-practices/content/base/web_evolution.html
https://github.com/362228416/openresty-web-dev
http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
QQ群:397745473