35.2 html 模板

和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 语言值得你拥有!