goweb-模板引擎
模板引擎
go 为我们提供了 text/template 库和 html/template 库这两个模板引擎,模板引
擎通过将数据和模板组合在一起生成最终的 html,而处理器负责调用模板引擎并将引
擎生成的 html 返回给客户端。
go 的模板都是文本文档(其中 web 应用的模板通常都是 html),它们都嵌入了
一些称为动作的指令。从模板引擎的角度来说,模板就是嵌入了动作的文本(这些文本
通常包含在模板文件里面),而模板引擎则通过分析并执行这些文本来生成出另外一些
文本。
helloworld
使用 go 的 web 模板引擎需要以下两个步骤:
(1) 对文本格式的模板源进行语法分析,创建一个经过语法分析的模板结构,其中
模板源既可以是一个字符串,也可以是模板文件中包含的内容。
(2 )执行经过语法分析的模板,将 responsewriter 和模板所需的动态数据传递给模
板引擎,被调用的模板引擎会把经过语法分析的模板和传入的数据结合起来,生成出最
终的 html,并将这些 html 传递给 responsewriter。
下面就让我们写一个简单的 helloworld
- 创建模板文件 hello.html
<html> <head> <title>模板文件</title> <meta charset="utf-8" /> </head> <body> //嵌入动作 {{.}} </body> </html>
- 在处理器中触发模板引擎
func handler(w http.responsewriter, r *http.request) { //解析模板文件 t, _ := template.parsefiles("hello.html") //执行模板 t.execute(w, "hello world!") }
- 浏览器中的结果
hello world!
解析模板
- parsefiles 函数
当我们调用 parsefiles 函数解析模板文件时,go 会创建一个新的模板,
并将给定的模板文件的名字作为新模板的名字,如果该函数中传入了多个
文件名,那么也只会返回一个模板,而且以第一个文件的文件名作为模板
的名字,至于其他文件对应的模板则会被放到一个 map 中。让我们再来
看一下 helloworld 中的代码:
t, _ := template.parsefiles("hello.html")
以上代码相当于调用 new 函数创建一个新模板,然后再调用 template 的
parsefiles 方法:
t := template.new("hello.html") t, _ = t.parsefiles("hello.html")
我们在解析模板时都没有对错误进行处理,go 提供了一个 must 函数专
门用来处理这个错误。must 函数可以包裹起一个函数,被包裹的函数会
返回一个指向模板的指针和一个错误,如果错误不是 nil,那么 must 函数
将产生一个 panic。
实验 must 函数之后的代码
t := template.must(template.parsefiles("hello.html"))
- parseglob 函数
通过该函数可以通过指定一个规则一次性传入多个模板文件,如:
t, _ := template.parseglob("*.html")
执行模板
- 通过 execute 方法
如果只有一个模板文件,调用这个方法总是可行的;但是如果有多个模板
文件,调用这个方法只能得到第一个模板
- 通过 executetemplate 方法
例如:
t, _ := template.parsefiles("hello.html", "hello2.html")
变量 t 就是一个包含了两个模板的模板集合,第一个模板的名字是
hello.html,第二个模板的名字是 hello2.html,如果直接调用 execute 方法,
则只有模板 hello.html 会被执行,如何想要执行模板 hello2.html,则需要
调用 executetemplate 方法
t.executetemplate(w, "hello2.html", "我要在 hello2.html 中显示")
上一篇: 基于注解的AOP配置
下一篇: SEO面试的技巧 大神教你如何去面试