Golang net.http和Gin框架下的模板--View調用後臺方法 --view接收後臺數據的運用 及 嵌套模板和繼承模板的使用

特別注意: 嵌套模板使用 非常重要

結構 

前臺代碼:

<!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()



}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章