模板继承
我们在写前端页面的时候的,有些东西会大量重复的进行编写,例如导航栏,分页栏等等,这些统一的东东,我们可以将他抽取出来作为模板文件,通过继承的方式来省略。
这里我们用index页面,和home页面作为例子来讲解下
- 假设这是首页页面,home页面也会是这个,只是内容不一样,样式一模一样,
- 我们就需要使用到模板来进行一个抽取。方便我们代码的省略
三步走
- 定义模板
将index页面和home页面相同的部分抽取到base.tmpl文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>首页</title>
<style>
。。。。。
</style>
</head>
<body>
<div class="nav"></div>
<div class="main">
<div class="menu"></div>
<div class="content center">
{{block "content" .}}{{end}}
</div>
</div>
</body>
</html>
- 然后建立index页面和home页面,套用base模板
- 那个点记得加上去哈,不然数据传输不过来的。
- index页面同理。
- 解析模板
主要通过ParseFiles函数,进行一个解析,注意的是,以前我们需要写一个tmpl,当出现有抽取模板的时候的,我们需要写两个模板,第一个就是抽取的模板,第二个就是需要进行渲染的模板。
t,err := template.ParseFiles("base.tmpl","home.tmpl")
- 渲染模板
渲染模板跟原来的也有点不同,以前将数据投放入w即可,现在还需要指定模板的参数。
err = t.ExecuteTemplate(w,"home.tmpl",name)
修改默认的标识符
- 这个小知识可以看下哈,要知道我们在编写前端框架的时候,我们也需要进行使用
. 的一个标识符,比如vue框架等等。 - 这个时候我们不改变的话,就会起冲突哈,所以我们就需要修改默认的标识符,
- 我们来举一个例子。
template.New("index.tmpl").Delims("{[","]}").ParseFiles("Template_test/index.tmpl")
- 这样就完成了默认字符的修改了哈,只需要使用固定的方法进行修改即可。
text/template与html/tempalte的区别
- 我们现在用的都是html包满,这个非常安全的!
- html/template针对的是需要返回HTML内容的场景,在模板渲染过程中会对一些有风险的内容进行转义,以此来防范跨站脚本攻击。例如 html注入
这里我们设置一个js语句和html语句来投入进行
- 可以看到哈,相当险恶哈,如果没有转义的话就会打印 嘿嘿嘿
- 但是由于我们使用的 html/template 这个包,所以语句我们都是安全的,不存在这种情况,如果是 text/template包那就难搞哦!
这个时候肯定会有人说,我就是要进行转义呢,怎么办?
- 添加自定义函数的方法在前面的文章有说过哈。
- 使用方法也很简单
- 这样通过管道 | 把数据传给函数即可,来看看效果吧
- 可以看到哈,先打印了之后又变成了超链接了。
- 全部都进行转义了哈。啊哈哈哈哈哈哈
代码奉上
package main
import (
"fmt"
"html/template"
"net/http"
)
type User struct {
Name string
Gender string
Age int
}
func index(w http.ResponseWriter, r *http.Request) {
t, err := template.New("index1.tmpl").Delims("{[","]}").
Funcs(template.FuncMap{
"safe" : func(s string) template.HTML{
return template.HTML(s)
},
}).ParseFiles("Template_test/index1.tmpl")
if err != nil {
fmt.Println("Parse template failed! err:",err)
return
}
u1 := User{
Name:"小公主",
Gender:"女",
Age:16,
}
m1 := map[string]interface{}{
"name":"小皇子",
"gender":"男",
"age" : 18,
}
hobbyList := []string{
"篮球",
"足球",
"双色球",
}
jsStr := `<script>alert('嘿嘿嘿')</script>`
demo := `<a href="https://blog.csdn.net/qq_43514659/article/details/121362804?spm=1001.2014.3001.5501">带你去看模板详解</a>`
err = t.Execute(w,map[string]interface{}{
"u1":u1,
"m1":m1,
"hobbyList":hobbyList,
"jsStr":jsStr,
"demo":demo,
})
if err != nil {
fmt.Println("render template failed,err : ",err)
return
}
}
func main() {
http.HandleFunc("/index",index)
err := http.ListenAndServe(":9090",nil)
if err != nil {
fmt.Println("HTTP server start failed! err : ", err)
return
}
}
|