21 Web编程 模板引擎

[TOC]

Web编程 模板引擎

模板引擎

Web模板页面就是预先设计好的HTML页面,模板引擎会重复使用模板页面根据不同数据渲染出HTML页面。

  • Go标准库提供了text/template 和 html/template 两个库模板引擎。

无逻辑模板引擎和嵌入逻辑的模板引擎

无逻辑模板引擎 (logic-less template engien)

  • 将模板中指定的占位符替换成相应的动态数据。

  • 无逻辑模板引擎只会进行字符串替换,不能执行任何逻辑处理。

  • 无逻辑模板引擎的目的是完全分离程序的表现和逻辑,并将所有逻辑的工作都由处理器完成。

嵌入逻辑的模板引擎(embedded logic template engine)

  • 模板中具有逻辑处理能力,可以将逻辑代码嵌入模板中。

  • 因为拥有在模板中嵌入逻辑代码的能力,这类模板引擎功能很强大,但是在模板中维护逻辑代码相对要困难。

无逻辑模板引擎的渲染速度要比有逻辑的模板引擎快

  • 但是大部分模板引擎都有逻辑处理能力,并非只是执行字符串替换操作。

  • 有的嵌入逻辑的模板引擎通常表现的跟普通的编程语言一样,比如PHP,PHP开始是独立的Web模板引擎,现在PHP页面已经很少出现HTML代码,已经不再把PHP当做模板引擎。

  • Go将模板引擎大部分功能都定义在text/template库中,小部分与HTML相关的功能定义在html/template库。

  • Go的模板引擎也是介于无逻辑模板引擎和嵌入逻辑模板引擎之间的一种模板引擎,

Go模板引擎在Web应用中的作用示意图

Go模板引擎在Web应用中的作用示意图

模板解析与执行

解析模板

  • 使用ParseFiles函数对模板文件进行语法分析并创建一个经过语法分析的模板结构以供Execute方法执行 tmp,err := template.ParseFiles("./web/test.html")

  • 用正则匹配符合的所有模板进行解析 template.ParseGlob("*")

执行模板

  • 执行 Execute 方法调用模板,Execute方法只会执行模板集合中第一个模板,如果要执行的是集合中其它模板,就要使用ExecuteTemplate方法。

动态渲染

Go 模板的动态渲染就是嵌入逻辑代码到模板中。

  • Go 模板中动态渲染使用 {{ 逻辑代码 }} ,可以进行条件判断、迭代、赋值、嵌套其它模板。

  • 在text/template库中有更多模板动态渲染的功能。

动态渲染 比较函数

  • 比较函数只适用于基本类型(或重定义的基本类型, 如`type Celsius float32), 但是整数和浮点数不能互相比较。

  • e只有eq可以多参数相等检测,接受2个或更多个参数,它会将第一个参数和其余参数依次比较。

函数
描述

eq

相等判断;例如:arg1 == arg2

ne

不相等判断;例如:arg1 != arg2

lt

小于判断;例如:arg1 < arg2

le

小于等于判断;例如:arg1 <= arg2

gt

大于判断;例如:arg1 > arg2

ge

大于等于判断;例如:arg1 >= arg2

动态渲染 预定义函数

  • 预定义函数是模板库中定义好的函数,可以直接在{{}}中使用。

函数

描述

and

函数返回其第1个空参数或者最后一个参数,即:"and x y"等价于"if x then y else x"。所有参数都会执行

or

返回第一个非空参数或者最后一个参数,即"or x y"等价于"if x then x else y"。所有参数都会执行

not

返回其单个参数的布尔值“不是”

len

返回其参数的整数类型长度

index

执行结果为index()函数后第一个参数以第一个参数后面剩下的参数为索引指向的位置。每个被索引的主体必须是数组、切片、map

print

即fmt.Sprintprintf即fmt.Sprintf

println

即fmt.Sprintln

html

返回其参数文本表示的HTML逸码等价表示

urlquery

返回其参数文本表示的可嵌入URL查询的逸码等价表示

js

返回其参数文本表示的JavaScript译码等价表示

call

执行结果是调用第一个参数的返回值,该参数必须是函数类型,其余参数作为调用该函数的参数

动态渲染:注释、变量定义、条件判断、比较函数、内置函数、遍历

test.html

  • 模板解析案例:注释、变量定义、条件判断、比较函数、内置函数、遍历

自定义函数

html/template 允许自定义函数

  • Funcs()方法向模板对象的函数map里加入参数funcMap内的键值对。

  • 如果funcMap的某个键值对的值不是函数类型,或者返回值不符合要求,则会报panic错误,但可以对模板对象的函数列表的成员进行重写。

  • FuncMap类型定义了函数名字符串到函数的映射,每个函数都必须有1个或者2个返回值。如果有两个返回值,则后一个必须是error接口类型;如果有2个返回值的方法返回error非nil,则模板执行会中断并返回该错误给调用者。

  • 在执行模板时,函数从两个函数map中查找:首先是模板函数map,然后是全局函数map。一般不在模版内定义函数,而是使用Funcs()方法添加函数到模板里。

  • 模板

嵌套 template

template中可以嵌套其他的template。这个template可以是单独的文件,也可以是通过define定义的template。

  • test3.html

  • test4.html

block 空内容填充

使用 block 可以预设一块空地,为空地取一个名字 {{block "content" . }}{{end}},后面使用 define 填充。

base.html

  • {{block "content" . }}{{end}} 预先留下了一块空地。

test5.html

  • {{define "content"}} 会填充到base.html {{block "content" . }}{{end}} 中。

修改默认的标识符

Go标准库的模板引擎使用的花括号{{和}}作为标识,而许多前端框架(如Vue和 AngularJS)也使用 {{}} 作为标识符,所以使用Go模板引擎和前端框架时就会出现冲突就有必要修改前端的或者修改Go语言的的标识符。

text/template 和 html/template 的区别

text/template 和 html/template 的区别

  • text/template 是将内容都是text文本格式返回,不会对HTML、JS进行转义,会执行JS代码。

  • html/tempalte 针对的是需要返回HTML内容的场景。 在模板渲染过程中会对一些有风险的内容进行转义,以此来防范跨站脚本(XSS)攻击。

  • 传入一段JS代码使用html/template去渲染会在页面上显示出转义后的JS文本内容。使用text/template渲染就会把JS代码执行。

  • xssTest.html

Last updated