和text、template类似,html/template主要在提供支持HTML的功能,所以基本使用上和上面差不多,我们来看看Go语言利用html/template怎样实现一个动态页面:
index.html.tmpl模板文件:
- index.html.tmpl:
-
<!doctype html> <head> <meta charset="UTF-8"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>Go</title> </head> <body> {{ . }} </body> </html>
-
- main.go:
-
package main import ( "net/http" "text/template" ) func tHandler(w http.ResponseWriter, r *http.Request) { t := template.Must(template.ParseFiles("index.html.tmpl")) t.Execute(w, "Hello World!") } func main() { http.HandleFunc("/", tHandler) http.ListenAndServe(":8080", nil) // 启动web服务 }
-
运行程序,在浏览器打开:http://localhost:8080/ 我们可以看到浏览器页面显示Hello World !即使模板文件这时有修改,刷新浏览器后页面也即更新,这个过程并不需要重启Web服务。
func(t *Template) ParseFiles(filenames ...string) (*Template, error)
func(t *Template) ParseGlob(patternstring) (*Template, error)
从上面简单的代码中我们可以看到,通过ParseFile加载了单个HTML模板文件,当然也可以使用ParseGlob加载多个模板文件。
如果最终的页面很可能是多个模板文件的嵌套结果,ParseFiles也支持加载多个模板文件,模板对象的名字则是第一个模板文件的文件名。
ExecuteTemplate()执行模板渲染的方法,这个方法可用于执行指定名字的模板,因为如果多个模板文件加载情况下,我们需要指定特定的模板渲染执行。面我们根据一段代码来看看:
Layout.html.tmpl模板:
{{ define "layout" }}
<!doctype html>
<head>
<meta charset="UTF-8">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Go</title>
</head>
<body>
{{ . }}
{{ template "index" }}
</body>
</html>
{{ end }}
注意模板文件开头根据模板语法,定义了模板名字,{{define "layout"}}。
在模板layout中,通过 {{ template "index" }} 嵌入了模板index,也就是第二个模板文件index.html.tmpl,这个模板文件定义了模板名{{define "index"}}。
注意:通过将模板应用于一个数据结构(即该数据结构作为模板的参数)来执行数据渲染而获得输出。模板执行时会遍历结构并将指针表示为.(称之为dot),指向运行过程中数据结构的当前位置的值。
{{template "header" .}} 嵌套模板中,加入.dot 代表在该模板中也可以使用该数据结构,否则不能显示。
Index.html.tmpl模板:
{{ define "index" }}
<div>
<b>Go 语言值得你拥有!</b>
</div>
{{ end }}
通过define定义模板名字,还可以通过template action引入模板,类似include。
package main
import (
"net/http"
"text/template"
)
func tHandler(w http.ResponseWriter, r *http.Request) {
t, err := template.ParseFiles("layout.html.tmpl", "index.html.tmpl")
t.ExecuteTemplate(w, "layout", "Hello World!")
}
func main() {
http.HandleFunc("/", tHandler)
http.ListenAndServe(":8080", nil)
}
运行程序,在浏览器打开:http://localhost:8080/
Hello World!
Go 语言值得你拥有!