《Web Development with Go》中的html.template
模板应用,深入其它
main.go
package main import ( //"encoding/json" "fmt" "log" "net/http" "strconv" "time" "html/template" "github.com/gorilla/mux" ) var templates map[string]*template.Template func init() { if templates == nil { templates = make(map[string]*template.Template) } templates["index"] = template.Must(template.ParseFiles("templates/index.html", "templates/base.html")) templates["add"] = template.Must(template.ParseFiles("templates/add.html", "templates/base.html")) templates["edit"] = template.Must(template.ParseFiles("templates/edit.html", "templates/base.html")) } func renderTemplate(w http.ResponseWriter, name string, template string, viewModel interface{}) { tmpl, ok := templates[name] if !ok { http.Error(w, "The template does not exist.", http.StatusInternalServerError) } err := tmpl.ExecuteTemplate(w, template, viewModel) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } type Note struct { Title string `josn:"title"` Description string `json: "description"` CreatedOn time.Time `json:"createdon"` } type EditNote struct { Note Id string } var noteStore = make(map[string]Note) var id int = 0 func getNotes(w http.ResponseWriter, r *http.Request) { fmt.Println(noteStore) renderTemplate(w, "index", "base", noteStore) } func addNote(w http.ResponseWriter, r *http.Request) { renderTemplate(w, "add", "base", nil) } func saveNote(w http.ResponseWriter, r *http.Request) { r.ParseForm() title := r.PostFormValue("title") description := r.PostFormValue("description") note := Note{title, description, time.Now()} id++ k := strconv.Itoa(id) noteStore[k] = note http.Redirect(w, r, "/", 302) } func editNote(w http.ResponseWriter, r *http.Request) { var viewModel EditNote vars := mux.Vars(r) k := vars["id"] if note, ok := noteStore[k]; ok { viewModel = EditNote{note, k} } else { http.Error(w, "Could not find the resource to edit.", http.StatusBadRequest) } renderTemplate(w, "edit", "base", viewModel) } func updateNote(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) k := vars["id"] var noteToUpd Note if note, ok := noteStore[k]; ok { r.ParseForm() noteToUpd.Title = r.PostFormValue("title") noteToUpd.Description = r.PostFormValue("description") noteToUpd.CreatedOn = note.CreatedOn delete(noteStore, k) noteStore[k] = noteToUpd } else { http.Error(w, "Could not find the resource to update.", http.StatusBadRequest) } http.Redirect(w, r, "/", 302) } func deleteNote(w http.ResponseWriter, r *http.Request) { //Read value from route variable vars := mux.Vars(r) k := vars["id"] // Remove from Store if _, ok := noteStore[k]; ok { //delete existing item delete(noteStore, k) } else { http.Error(w, "Could not find the resource to delete.", http.StatusBadRequest) } http.Redirect(w, r, "/", 302) } func main() { r := mux.NewRouter().StrictSlash(false) fs := http.FileServer(http.Dir("public")) r.Handle("/public/", fs) r.HandleFunc("/", getNotes) r.HandleFunc("/notes/add", addNote) r.HandleFunc("/notes/save", saveNote) r.HandleFunc("/notes/edit/{id}", editNote) r.HandleFunc("/notes/update/{id}", updateNote) r.HandleFunc("/notes/delete/{id}", deleteNote) server := &http.Server{ Addr: ":8080", Handler: r, } log.Println("Listening...") server.ListenAndServe() }
base.html
{{define "base"}} <html> <head>{{template "head" .}}</head> <body>{{template "body" .}}</body> </html> {{end}}
add.html
{{define "head"}}<title>Add Note</title>{{end}} {{define "body"}} <h1>Add Note</h1> <form action="/notes/save" method="post"> <p>Title:<br> <input type="text" name="title"></p> <p>Description:<br> <textarea rows="4" cols="50" name="description"></textarea> </p> <p><input type="submit" value="submit"/> </p> </form> {{end}}
index.html
{{define "head"}}<title>Index</title>{{end}} {{define "body"}} <h1>Notes List</h1> <p> <a href="/notes/add">Add Note</a> </p> <div> <table border="1"> <tr> <th>Title</th> <th>Description</th> <th>Created On</th> <th>Action</th> </tr> {{range $key,$value := .}} <tr> <td>{{$value.Title}}</td> <td>{{$value.Description}}</td> <td>{{$value.CreatedOn}}</td> <td> <a href="/notes/edit/{{$key}}">Edit</a>| <a href="/notes/delete/{{$key}}">Delete</a> </td> </tr> {{end}} </table> </div> {{end}}
edit.html
{{define "head"}}<title>Edit Note</title>{{end}} {{define "body"}} <h1>Edit Note</h1> <form action="/notes/update/{{.Id}}" method="post"> <p>Title:<br> <input type="text" value="{{.Note.Title}}" name="title"></p> <p> Description:<br> <textarea rows="4" cols="50" name="description"> {{.Note.Description}}</textarea> </p> <p><input type="submit" value="submit"/></p> </form> {{end}}
《Web Development with Go》中的html.template的更多相关文章
- Web Development Terms
I've come across lots of terms while learning web development. I'm feeling myself overwhelmed. Here ...
- Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么(转)
Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么?修改 建站有很多技术,如 HTML.HTML5.X ...
- Reloading Java Classes 301: Classloaders in Web Development — Tomcat, GlassFish, OSGi, Tapestry 5 and so on Translation
The Original link : http://zeroturnaround.com/rebellabs/rjc301/ Copyright reserved by Rebel Inc In t ...
- 《Agile Web Development With Rails》读后感--rails基于web设计的best Practices
最近看完<Agile Web Development with Rails>一书,受益匪浅.书中先是用一个简单的web应用带你进入Rails的世界,然后在你大致熟悉之后,再带你了解Rail ...
- 【外文阅读】Web Development in 2020: What Coding Tools You Should Learn---Quincy Larson
原文链接:https://mail.qq.com/cgi-bin/readtemplate?t=safety&check=false&gourl=https%3A%2F%2Fwww.f ...
- Learning web development with MDN
Learning web development with MDN Server-side website programming Dynamic Websites – Server-side pro ...
- Beginners Guide To Web Development
Web Development Front End Development Back End Development
- (转) Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?
Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 建站有很多技术,如 HTML.HTML5.XHT ...
- Asp.net mvc web api 在项目中的实际应用
Asp.net mvc web api 在项目中的实际应用 前言:以下只是记录本人在项目中的应用,而web api在数据传输方面有多种实现方式,具体可根据实际情况而定! 1:数据传输前的加密,以下用到 ...
- C# asp.net IIS 在web.config和IIS中设置Session过期时间
有时候在web.config设置sessionState 或者类文件里设置Session.Timeout,在IIS里访问时每次都是达不到时间就超时,原因是因为在IIS中设置了Session的超时时间, ...
随机推荐
- POI解析Excel时,如何获取单元格样式以及单元格Style的一些操作
最近,公司运营平台需要上传Excel文件并进行解析导入数据库,在开发完成后出现了一个始料不及的生产bug,下面是具体原因: 1.在用POI解析Excel时,默认如果Excel单元格中没有数据,且单元格 ...
- linux下的服务器上传与下载
上传 scp 文件 用户名@服务器ip 服务器保存路径 例如:scp bookmarks_2019_6_24.html root@192.168.0.103:/home 下载 scp 用户名@服务器i ...
- [springMvc]常见配置
[springMvc]常见配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- My97DatePicker-WdatePicker日历日期插件详细示例
<!DOCTYPE html> <html> <head> <title>排行</title> <meta charset=" ...
- C lang:Protect array data——Const
Xx_Introduction Use pointer translate parameter array original data will change data,and use const p ...
- TCP安全,SYN Flooding 和 nmap
目录 SYN flooding nmap nmap idle SYN flooding 简介:向target持续发送SYN=1的TCP报文,使target因内存满而拒绝服务. 命令:netwox 76 ...
- Codeforces 547C/548E - Mike and Foam 题解
目录 Codeforces 547C/548E - Mike and Foam 题解 前置芝士 - 容斥原理 题意 想法(口胡) 做法 程序 感谢 Codeforces 547C/548E - Mik ...
- div块水平居中,垂直居中
水平居中一个div想要水平居中于它的父div中只需要给它加css属性margin:0 auto; 即可 <!DOCTYPE html> <html> <head> ...
- 2019年FJNU低编赛 G题(dfs博弈)
###题目链接### 题目大意: 有一个 0 ~ n+1 的数轴,Alice 站在 0 点处,Bob 站在 n+1 点处.在 1 ~ n 上各有着权值. Alice 每次向右移动 1 格或两格 ,Bo ...
- ubuntu上编译和使用easy_profiler对C++程序进行性能分析
本文首发于个人博客https://kezunlin.me/post/91b7cf13/,欢迎阅读最新内容! tutorial to compile and use esay profiler with ...