七叶笔记 » golang编程 » golang从入门到精通,Web编程,多模板、模板继承

golang从入门到精通,Web编程,多模板、模板继承

D:\go\src\go7\demo2\main.go

 //本节将学习模板内置函数的使用、自定义函数的使用、管道符的使用
package main

import (
"log"
"net/http"
"text/template"
)

func Index(w http.ResponseWriter, r *http.Request) {
log.SetFlags(log.Lshortfile | log.LstdFlags)
//func ParseFiles(filenames ...string) (*Template, error)
//ParseFiles从"index.html"中解析模板。
//如果发生错误,解析停止,返回的*Template为nil。
//当解析多个文件时,如果文件分布在不同目录中,且具有相同名字的,将以最后一个文件为主。
//当解析多个文件时,如果文件分布在相同目录中,且具有不同名字的,将以第一个文件为主。
files, err := template.ParseFiles("index1.html", "base1.html")
if err != nil {
log.Println(err.Error())
}
//func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
//渲染模板文件,并将定义的map类型的数据传入模板文件中
//由于采用的Execute方法,那么渲染的模板应当遵循template.ParseFiles的解析顺序
//需要注意的是参数name的类型是string,这里是模板的名字。
//如果在模板文件中定义了{{define "html_index1"}}{{end}},那么,这里的name参数就应当写为"html_index1"
//如果没有在模板文件中进行重新定义,那么就使用默认,默认的就是文件名,注意,不包含路径名
err = files.Execute(w, map[string]interface{}{
"name": "张三丰",
})
if err != nil {
log.Println(err.Error())
}
//w.Write([]byte("hello"))
}
func Home(w http.ResponseWriter, r *http.Request) {
log.SetFlags(log.Lshortfile | log.LstdFlags)
//func ParseFiles(filenames ...string) (*Template, error)
//ParseFiles从"index.html"中解析模板。
//如果发生错误,解析停止,返回的*Template为nil。
//当解析多个文件时,如果文件分布在不同目录中,且具有相同名字的,将以最后一个文件为主。
//当解析多个文件时,如果文件分布在相同目录中,且具有不同名字的,将以第一个文件为主。
files, err := template.ParseFiles("index2.html", "base2.html")
if err != nil {
log.Println(err.Error())
}
//func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
//渲染模板文件,并将定义的map类型的数据传入模板文件中
//由于采用的Execute方法,那么渲染的模板应当遵循template.ParseFiles的解析顺序
//需要注意的是参数name的类型是string,这里是模板的名字。
//如果在模板文件中定义了{{define "html_index1"}}{{end}},那么,这里的name参数就应当写为"html_index1"
//如果没有在模板文件中进行重新定义,那么就使用默认,默认的就是文件名,注意,不包含路径名
//err = files.ExecuteTemplate(w, "index2.html", map[string]interface{}{
//"name": "张三丰",
//})
err = files.ExecuteTemplate(w, "index2.html", map[string]interface{}{
"name": "张三丰",
})
if err != nil {
log.Println(err.Error())
}
}
func main() {
http.HandleFunc("/index", Index)
http.HandleFunc("/home", Home)
_ = http.ListenAndServe(":80", nil)
}  

D:\go\src\go7\demo2\base1.html

 {{define "base1.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #head {
            background: coral;
            height: 30px;
        }

        #body {
            background: cadetblue;
            height: 80px;
        }

        #foot {
            background: dimgray;
            height: 50px;
        }
    </style>
</head>
<body>
<div id="head">base1 head</div>
<div id="body">
    {{block "body" .}}
    {{end}}
</div>
<div id="foot">base1 foot</div>
</body>
</html>
{{end}}  

D:\go\src\go7\demo2\base2.html

 {{define "index2.html"}}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #head {
                background: coral;
                height: 100px;
            }

            #body {
                background: cadetblue;
                height: 300px;
            }

            #foot {
                background: dimgray;
                height: 500px;
            }
        </style>
    </head>
    <body>
    <div id="head">base2 head</div>
    <div id="body">
        {{block "body" .}}
        {{end}}
    </div>
    <div id="foot">base2 foot</div>
    </body>
    </html>
{{end}}  

D:\go\src\go7\demo2\index1.html

 {{define "index1.html"}}
    {{template "base1.html" .}}
{{end}}
{{define "body"}}
    index1
{{end}}  

D:\go\src\go7\demo2\index2.html

 {{define "index2"}}
    {{template "base2.html" .}}
{{end}}
{{define "body"}}
    index2
{{end}}  

D:\go\src\go7\demo2\main_test.go

 package main

import (
   "io/ioutil"
   "net/http"
   "net/http/httptest"
   "testing"
)

func TestIndex(t *testing.T) {
   handler := http.HandlerFunc(Index)
   app := httptest.NewServer(handler)
   defer app.Close()
   _url := app.URL + "/" + "index"
   t.Log(_url)
   response, _ := http.Get(_url)
   defer response.Body.Close()
   bytes, _ := ioutil.ReadAll(response.Body)
   t.Log(string(bytes))
}
func TestHome(t *testing.T) {
   handler := http.HandlerFunc(Home)
   app := httptest.NewServer(handler)
   defer app.Close()
   _url := app.URL + "/" + "home"
   t.Log(_url)
   response, _ := http.Get(_url)
   defer response.Body.Close()
   bytes, _ := ioutil.ReadAll(response.Body)
   t.Log(string(bytes))
}  

运行结果

相关文章