2013-06-20 120 views
2

已經厭倦了這個https://github.com/golang-samples/template/blob/master/parseglob/main.go但服務器正在強制關閉。 1)main.go 包主ParseGlob如何在golang中渲染兩個以上的模板?

import (
    "log" 
    "os" 
    "text/template" 
) 

func main() { 
    t := template.New("main.tmpl") 
    t = template.Must(t.ParseGlob("templates/*.tmpl")) 
    err := t.Execute(os.Stdout, nil) 
    if err != nil { 
     log.Fatalf("template execution: %s", err) 
    } 
} 

2)main.tmpl

{{template "header"}} 
<p>main content</p> 
{{template "footer"}} 

3)header.html中

{{define "header"}} 
<!doctype html> 
<html lang="ja"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Document</title> 
</head> 
<body> 
{{end}} 

4)footor.html

{{define "footer"}} 
</body> 
</html> 
{{end}} 

其他有用的鏈接?

回答

0

根據我下面的代碼,

我在這裏創造一個HOWTO: http://javatogo.blogspot.com/2013/06/howto-render-multiple-templates-with-go.html

這裏有一個例子如何使多個模板:

const rootPageTemplateHtml = ` 
<!DOCTYPE html> 
<html> 
    <head> 
    <title>{{.PageTitle}}</title> 
    </head> 
    <body> 
    {{template "pageMenu" .}} 
    {{template "pageContent" .}} 
    {{template "pageFooter" .}} 
    </body> 
</html> 
` 
const pageMenuTemplateHtml = ` 
<div> 
menu: {{.PageName}} 
</div> 
` 

type PageContent struct { 
    PageName string 
    PageContent interface{} 
    PageTitle string 
} 


func initTemplate(tmpl *template.Template) { 
    *tmpl = *template.Must(template.New("rootPage").Parse(rootPageTemplateHtml)) 
    tmpl.New("pageHeader").Parse(``) 
    tmpl.New("pageMenu").Parse(pageMenuTemplateHtml) 
    tmpl.New("pageFooter").Parse(``) 
} 

func execTemplate(tmpl *template.Template, w *http.ResponseWriter, pc *PageContent) { 
    if err := tmpl.Execute(*w, *pc); err != nil { 
    http.Error(*w, err.Error(), http.StatusInternalServerError) 
    } 
} 

現在讓我們添加的第一頁:

const welcomeTemplateHTML = ` 
<div>welcome page</div> 
` 

var welcomePage *template.Template 

func initWelcomePageTemplate() { 
    if nil == welcomePage { 
    welcomePage = new(template.Template) 
    initTemplate(welcomePage) 
    welcomePage.New("pageContent").Parse(welcomeTemplateHTML) 
    } 
} 

func renderWelcomePage(w *http.ResponseWriter, pc *PageContent) { 
    initWelcomePageTemplate() 
    execTemplate(welcomePage, w, pc) 
} 

和第二個pag E:

const linksTemplateHTML = ` 
<div>second page</div> 
` 

var secondPage *template.Template 

func initSecondPageTemplate() { 
    if nil == secondPage { 
    secondPage = new(template.Template) 
    initTemplate(secondPage) 
    secondPage.New("pageContent").Parse(secondTemplateHTML) 
    } 
} 

func renderSecondPage(w *http.ResponseWriter, pc *PageContent) { 
    initSecondPageTemplate() 
    execTemplate(secondPage, w, pc) 
} 

執行此不同的模板,只需添加到您的處理:

func init() { 
    http.HandleFunc("/", welcome) 
    http.HandleFunc("/second", second) 
} 

func welcome(w http.ResponseWriter, r *http.Request) { 
    pc := PageContent{"/", nil, "Welcome Page Title"} 
    renderWelcomePage(&w, &pc) 
} 

func second(w http.ResponseWriter, r *http.Request) { 
    pc := PageContent{"/second", nil, "Second Page Title"} 
    renderSecondPage(&w, &pc) 
} 

現在,只要你想

+0

@ fmt.Println.MKO您可以添加儘可能多的文件:是的,我試過這個例子之前...但如果我渲染下面,那麼它是與HTML標記呈現。我不想要。例如:{{界定 「身體」}}

{{結束}} –

+0

啥子意思與它的渲染與HTML?你的輸入是什麼,你的輸出是什麼,你期望什麼? –

+0

包主 進口( \t 「的HTML /模板」 \t \t 「淨/ HTTP」 ) FUNC處理器(瓦特http.ResponseWriter,R * http.Request){\t S1,_:=模板。 ParseFiles(「templates/t1.html」,「templates/t2.html」,「templates/t3.html」)0121.s1.ExecuteTemplate(w,「t_cd」,nil) s1.ExecuteTemplate(w,「body」, nil) } func init(){ http.HandleFunc(「/」,handler) \t } OutPut:c d

hi

「在輸出html標記即將到來,我不想顯示」。 –