做了个简单的留言本用来练习http与template.
主Go代码:
package main //Golang版本的留言本 //author:Xiong Chuan Liang //date:2015-3-2 import ( "fmt" "html/template" "io/IoUtil" "net/http" "os" "log" ) func main() { http.Handle("/images/",http.FileServer(http.Dir("asset"))) http.HandleFunc("/",makeHandleFunc(listHandler)) http.HandleFunc("/add",makeHandleFunc(addHandler)) if err := http.ListenAndServe(":8055",nil); err != nil { log.Fatal("ListenAndServe: ",err) } } type HandleFuncType func(http.ResponseWriter,*http.Request) func makeHandleFunc(f HandleFuncType)(HandleFuncType){ return func(w http.ResponseWriter,r *http.Request){ defer func(){ if x := recover(); x!= nil { log.Printf("[%v] panic: %v",r.RemoteAddr,x) } }() f(w,r) } } func addHandler(w http.ResponseWriter,r *http.Request) { h,_ := template.ParseFiles("template/addinfo.tpl","template/header.tpl","template/footer.tpl") h.ExecuteTemplate(w,"addinfo",nil) } func listHandler(w http.ResponseWriter,r *http.Request) { if r.Method == "POST" { r.ParseForm() if len(r.Form["note"][0]) == 0 { infoHandler(w,r,`<b>提交失败!</b> <br/>留言不能为空! <br/> <a href="http://127.0.0.1:8055/add">返回</a>`) return } info := fmt.Sprintf("留言人:<a href='mailto:%s'>%s</a><br/>留言:%s<hr>",r.FormValue("email"),//r.Form.Get("email") r.FormValue("nickname"),r.FormValue("note")) writeInfo(info) } list,_ := readInfo() msg := map[string]template.HTML{"List": template.HTML(list)} h,_ := template.ParseFiles("template/guestbook.tpl","guestbook",msg) } func infoHandler(w http.ResponseWriter,r *http.Request,info string) { var base = ` <!DOCTYPE html> <html> <head> <title>info</title> <Meta charset="UTF-8"> </head> <body> {{.}} </body> </html> ` tmpl,err := template.New("提示信息").Parse(base) if err != nil { panic(err) } err = tmpl.Execute(w,template.HTML(info)) if err != nil { panic(err) } } const FILENAME = "Guestbook.log" func readInfo() (string,error) { body,err := IoUtil.ReadFile(FILENAME) if err != nil { return "",err } return string(body),nil } func writeInfo(str string) bool { f,err := os.OpenFile(FILENAME,os.O_RDWR|os.O_APPEND|os.O_CREATE,os.ModeType) if err != nil { panic(err) } defer f.Close() _,err = f.WriteString(str) if err != nil { panic(err) } return true }
其guestbook.tpl:
{{define "guestbook"}} <html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>留言本</title> <style type="text/css"> body{ margin:0; padding:0; background:#EAEAEA; } </style> </head> <body> {{template "header"}} {{.List}} <center><a href="http://127.0.0.1:8055/add">增加留言</a></center> {{template "footer"}} </body> </html> {{end}}
实现的效果如下:
整个源码打包在此: 点击下载
MAIL: xcl_168@aliyun.com
BLOG: http://blog.csdn.net/xcl168
原文链接:https://www.f2er.com/go/190552.html