hhtp.ListenAndServer("ip加端口",nil)
err := http.ListenAndServe(":9000", nil)
如 127.0.0.1:900/index
http.HandleFunc("/index ",index )
http.HandleFunc("/index", index)
后面的index是函数 前面的 才是定义 什么 我们浏览器 输出才会有什么
然后index里面有三步
定义模板 解析模板 渲染模板
template.ParseFiles(“文件夹路径”)
t, err := template.ParseFiles("go_web/chaptr01/base/base.html", "go_web/chaptr01/base/index2.html")
if err != nil {
fmt.Println("index2 ParseFiles err =", err)
return
}
name := "小王子"
t.ExecuteTemplate(w, "index2.html", name)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
}
.nav{
height: 50px;
width: 100%;
position: fixed;
background-color:blue;
}
.main{
margin-top:50px;
}
.menu{
width: 20%;
height: 100%;
position: fixed;
left: 0;
background-color: blueviolet;
}
.content{
text-align: center;
}
</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>
在div content 里面定义 {{block “content”}}{{end}}
另一个文件中
{{template "base.html".}}
{{/*//重新定义*/}}
{{define "content"}}
<h1>这是index 页面</h1>
<p> hello{{ . }}</p>
{{end}}
只需要template 上面定义的文件名
当然 在main文件中 解析模板 时 也需要做出改变
前面是 做好的模板文件名 后面是要使用模板的 文件名
t, err := template.ParseFiles("go_web/chaptr01/base/base.html", "go_web/chaptr01/base/index2.html")
使用到模板嵌套时
渲染模板 也需要改变 变为
name := "小王子"
t.ExecuteTemplate(w, "index2.html", name)
define 方法名
下面的内同就能传进去
默认标识符 是 {{}}
但是前端的 默认标识符也是 {{}}
为了防止出错 我们可以 自定义
在index函数中 解析模板时
//自定义模板
t, err := template.New("index.html").Delims("{[", "]}").ParseFiles("go_web/chaptr02/index.html")
//非自定义
t, err := template.ParseFiles("go_web/chaptr01/home2.html")
跨站攻击
当博客评论时 输入框可以输入 js代码 当js代码没过滤时 很可能导致数据库被黑
或者别人写一个死循环 会给网页卡死
func xss(w http.ResponseWriter, r *http.Request) {
//解析模板之前定义一个自定义函数
t, err := template.New("xss.html").Funcs(template.FuncMap{
"safe": func(str string) template.HTML {
return template.HTML(str)
},
}).ParseFiles("go_web/chaptr02/xss.html")
if err != nil {
fmt.Println("parse template failed err =", err)
return
}
str1 := " <script>alert(123)</script>"
str2 := "<a href=\"index.html\">123456</a>"
t.Execute(w, map[string]string{
"str1": str1,
"str2": str2,
})
}
html代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>修改模板引擎标识符</title>
</head>
<body>
<div>
<p>用户的评论是 {{ .str1}}</p>
<p>用户的评论是 {{ .str2 |safe}}</p>
</div>
</body>
</html>
可以通过| safe (前面定义的自定义函数)来进行区分 像html化的代码 和不需要 html化的代码