特別注意: 嵌套模板使用 非常重要
結構
前台代碼:
<!DOCTYPE html>
<html>
<head>
<title>user</title>
</head>
<script type="text/javascript">
</script>
<body> /* range 循環的使用 */ {{range $key,$value :=.}} <p>UserId={{$value.UserId}} ----UserName={{$value.UserName}}</p> {{end}} <p>{{len .}}</p>
/* 注意調用后台一個參數的寫法*/
<p>{{say "張三"}}</p> /* 注意調用后台Add方法的兩個參數的寫法 */ <p>{{add 1 2}}</p>
</body>
</html>
合用net/http代碼實現
func main(){ say:= func(name string) (string,error){ // 前台通過template.New出的模板Funcs(template.FuncMap)來調用
return name+"你好帥",nil } add := func(a int,b int) (int,error){ return a+b,nil } var ulist []User // 返回給前台的實體
user:=User{"2","王五"} ulist = append(ulist, user) user3:=User{"3","王六"} ulist = append(ulist, user3) // 返回給前台的實體 // 指定地址/user 和 請求返回方法
http.HandleFunc("/user", func(writer http.ResponseWriter, request *http.Request) { // 定義FuncMap
funcMap:=template.FuncMap{"say":say,"add":add} // 以./view/userinfo/user為基礎建立User模板,並充許后台調用funcMap設立的對應方法
t,err:= template.New("user").Funcs(funcMap).ParseFiles("./view/userinfo/user") if err!=nil{ log.Println("t.ParseFiles err:",err) }
// 渲染模板 t.ExecuteTemplate(writer,"user",ulist) })
// http監聽 8090 err:= http.ListenAndServe(":8090",nil) if err!=nil{ log.Panicln("http.ListenAddServe err:",err) } }
使用Gin框架下的代碼
func main(){ say:= func(name string) (string,error){ // 前台通過template.New出的模板Funcs(template.FuncMap)來調用
return name+"你好帥",nil } add := func(a int,b int) (int,error){ return a+b,nil } var ulist []User // 返回給前台的實體
user:=User{"2","王五"} ulist = append(ulist, user) user3:=User{"3","王六"} ulist = append(ulist, user3) // 返回給前台的實體
// 建立Gin引擎實例 engin :=gin.Default()
// 設置一個Get請求及請求處理結果 engin.GET("/user", func(context *gin.Context) { funcMap:= template.FuncMap{"say":say,"add":add,} // 創建 並解析 模反
t,err:=template.New("user").Funcs(funcMap).ParseFiles("./view/userinfo/user") if err!=nil{ log.Println("template.new().Funcs().ParseFiles err:",err) } // 渲染模 "user" 指定模板的名字(注意這里用於與其他模板區分), ulist 返回給View的數據
t.ExecuteTemplate(context.Writer,"user",ulist) })
// 運行當前引擎 engin.Run() }
嵌套模板使用
結構
在temptest中嵌套 li
li代碼
<li>第一個</li>
<li>第二個</li>
<li>第三個</li>
<li>第四個</li>
temptest 代碼
<!DOCTYPE html>
<html>
<head>
<title>user</title>
</head>
<body> {{.}} 下面是嵌套外部模板 ./view/template/li {{template "li"}} 下面是內嵌套模板 define abc {{template "abc"}} </body>
</html> {{define "abc"}} <p>這是abc內嵌套模板</p> {{end}}
后台 代碼 注意,在ParseFiles時先寫主模板,后寫嵌套模板
func main(){ engin :=gin.Default() engin.GET("/temptest", func(context *gin.Context) { // 注意這里要先寫主模板,后寫嵌套模板
t,err:=template.ParseFiles("./view/temptest/temptest","./view/template/li")
if err!=nil{ log.Println("ttemplate.ParseFiles err:",err) } // 渲染模板
t.ExecuteTemplate(context.Writer,"temptest","后台返回true") }) // 運行引擎
engin.Run() }
繼承模板的使用使用非常重要
結構
testbymaster 繼承於headmaster
headmaser 用於繼承的主要語法
{{block "bodycenter" .}}
{{end}}
其中 bodycenter 是繼承頁面defing 的自己模板內的內容
headmaser 代碼
<!DOCTYPE html>
<html>
<head>
<title>user</title>
</head>
<body> {{block "bodycenter" .}} {{end}} </body>
</html>
testbymaster 模板信息內容
{{/*// 繼承 headmaster 模板*/}} {{template "headmaster" .}} {{/*// 顯示主模板中 headmaster 即自己的信息*/}} {{define "bodycenter"}} <p>下面是繼承頁的內容</p> {{.}} {{end}}
main()方法
func main(){ engin :=gin.Default() engin.GET("/testbymaster", func(context *gin.Context) { // 注意這里要先解析底層模板,再解析頁面,再解析頁面嵌套的模板
t,err:= template.ParseFiles("./view/template/headmaster","./view/temptest/testbymaster") if err!=nil{ log.Println("ttemplate.ParseFiles err:",err) } t.ExecuteTemplate(context.Writer,"testbymaster","新頁面開始了") }) engin.Run() }