Template使用教程 === 本机节课程是template下节课程应该是调度任务 然后是小操作 收官是一个小案例 衍生课程是Cloud Native 如果有时间的话,会把这个小案例做成分布式的 大家有空的话 了解下docker 现在就正式开始我们的课程了 ***** 我们任意打开一个网站,比如就是这个看云,你们有没有发觉 不同的看云文档 样子都一样,but内容是不一样的? 这里就要说golang 的html/template了 - 初识html/Template - 变量输出 - 条件处理 - 输出嵌套字段内容 1.初识html/Template 我们在前面的课程发现没有,我们注册这块现在只能post,现在去看看其他的网站,用户注册和登录都有一个页面专门用户显示. 好就从这里开始和html/Template来一次约会 我们想创建一个template目录 创建logo.html 用于展示用户登录 创建static目录用于存放css js 等静态资源 这个我们为了让它好看一点就用bootstrap这个ui框架 这个bootstrap下载下来放到static里 补充知识 怎么让用户访问到这个静态资源呢? 配置文件路由 ``` //静态资源 router.ServeFiles("/static/*filepath",http.Dir("./template/static/")) ``` 好了我们测试一下是否能通过 http://127.0.0.1:8085/static/ 获取到static下的文件 OK!看到了,现在我们来用bootstript来完善我们的login.html吧 因为等会会以js的方式提交数据,我写了一个js utils在static utils下 大家看看吧 ``` <title>{{.Title}}</title> ``` 在html中添加{{.Title}} ``` router.GET("/user/addUser",ShowAddUser) // 展示添加用户页面 router.POST("/user/addUser",AddUser) // 添加用户 // url GET /user/addUser // 展示添加用户页面 func ShowAddUser(w http.ResponseWriter,r *http.Request,p httprouter.Params) { // 加载模板 files, e := template.ParseFiles("./template/login.html") if e != nil { fmt.Println("html 解析出问题了") response.SendErrorResponse(w,defs.ErrorTemplateError) return } // 往Template填充内容 type Data struct { Title string Msg string } e = files.Execute(w,&Data{ Title:"注册", Msg:"html/Template学习", }) if e != nil { fmt.Println("填充数据出问题了",e.Error()) response.SendErrorResponse(w,defs.ErrorTemplateError) return } } ``` 这样就可以了 ***** 我们来简单总结一下: 1.第一步加载html `files, e := template.ParseFiles("./template/login.html")` 2.第二部填充数据 ``` // 往Template填充内容 type Data struct { Title string Msg string } e = files.Execute(w,&Data{ Title:"注册", Msg:"html/Template学习", }) ``` ### 条件判断 ``` <h1> {{if .Score}} score is {{.Score}} {{else}} no score {{end}} </h1> ``` 注意{{end}}这个是必须的 对了大家应该会好奇为什么传入的是一个结构体,调用的是结构体的某一个属性!! ``` file.Execute(w,"你好") 这样也可以 如何接收呢? <h1>{{.}}</h1> 这个.是根节点的意识 ``` 大家举一反三吧! ### 比较 - gt 大于 - ge 大于等于 - lt 小于 - le 小于等于 - ne 不等 - eq 等于 ``` <h1> {{if gt .Score 90}} score is A+ {{else if gt .Score 70}} score is A {{else if gt .Score 60}} score is B {{else}} score is C {{end}} </h1> ``` ### 迭代 ``` <h1> {{range $k,$v := .Maps}} <br> {{$k}} : {{$v}} <br> {{end}} </h1> ``` range注意: 此处的{{.}}对象会发生改变为Maps 此时或者获取到父级的作用域? {{$.}} 这样就可以了 ***** 我在此给出上面的测试数据: ``` r.ParseForm() score := r.FormValue("score") i, _ := strconv.Atoi(score) // 往Template填充内容 type Data struct { Title string Msg string Score int Maps map[int]string } maps := make(map[int]string) maps[0] = "hello" maps[1] = "golang" maps[2] = "你好啊" e = files.Execute(w,&Data{ Title:"注册", Msg:"html/Template学习", Score:i, Maps:maps, }) ``` 小重点来了! 注意要让html获取到数据,我们要维护一个struct,if当数据非常多的时候这个struct也会非常庞大,这样就不利于我们后期的维护 如何解决这个问题呢? ``` e = files.Execute(w,map[string]interface{}{ "Request":r, "Score":i, "Msg":"html/Template学习", "Maps":maps, }) ``` 这样我们html又怎么获取呢? 我现在先把原来维护struct版本的代码给出 [https://github.com/dollarkillerx/GolangWebCourseware/tree/2de07dc8b70840c111770fbc074989ea30364dd2](https://github.com/dollarkillerx/GolangWebCourseware/tree/2de07dc8b70840c111770fbc074989ea30364dd2) 哈哈直接用就行了,骚年多尝试啊 [https://github.com/dollarkillerx/GolangWebCourseware/tree/http/template](https://github.com/dollarkillerx/GolangWebCourseware/tree/http/template) OK Template这个就完结了!